From e7e5931fe9477de329a0f765cff4064b1b79a851 Mon Sep 17 00:00:00 2001 From: Kevin Bracey Date: Tue, 29 Jan 2019 12:45:48 +0200 Subject: [PATCH 001/109] Mutex-protect mbedtls_hardware_poll Like all HAL APIs, the calls in trng_api.h are not expected to be thread-safe. All current accesses to the TRNG HAL are currently via `mbedtls_hardware_poll`. Mbed TLS does not currently serialise these calls itself, as `MBEDTLS_THREADING_C` is not enabled. But even if Mbed TLS's own accesses were serialised, there are other direct users of `mbedtls_hardware_poll` such as randLIB, that need to use direct calls due to lack of API to extract entropy from Mbed TLS. As such it makes sense to treat `mbedtls_hardware_poll` as a de facto public Mbed OS API, akin to the C++ veneers on top of the HAL, and add a PlatformMutex there so that it is safe for multithreaded use. --- features/mbedtls/platform/src/{mbed_trng.c => mbed_trng.cpp} | 5 +++++ 1 file changed, 5 insertions(+) rename features/mbedtls/platform/src/{mbed_trng.c => mbed_trng.cpp} (87%) diff --git a/features/mbedtls/platform/src/mbed_trng.c b/features/mbedtls/platform/src/mbed_trng.cpp similarity index 87% rename from features/mbedtls/platform/src/mbed_trng.c rename to features/mbedtls/platform/src/mbed_trng.cpp index d4dd771c01..53c1c21097 100644 --- a/features/mbedtls/platform/src/mbed_trng.c +++ b/features/mbedtls/platform/src/mbed_trng.cpp @@ -17,12 +17,17 @@ #if DEVICE_TRNG #include "hal/trng_api.h" +#include "platform/PlatformMutex.h" +extern "C" int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { + static PlatformMutex trng_mutex; trng_t trng_obj; + trng_mutex.lock(); trng_init(&trng_obj); int ret = trng_get_bytes(&trng_obj, output, len, olen); trng_free(&trng_obj); + trng_mutex.unlock(); return ret; } From d7b58e99fa4ee9473cc39acda224b2825c983eba Mon Sep 17 00:00:00 2001 From: Alexander Zilberkant Date: Sun, 10 Feb 2019 11:06:34 +0200 Subject: [PATCH 002/109] FUTURE_SEQUANA_M0_PSA - fix CM4 starting address Use PSA_NON_SECURE_ROM_START configuration value instead of hardcoded CY_CORTEX_M4_APPL_ADDR. --- .../TARGET_FUTURE_SEQUANA_M0_PSA/spm_hal_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA_M0_PSA/spm_hal_api.c b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA_M0_PSA/spm_hal_api.c index 4d0352cc98..a6f6fff74e 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA_M0_PSA/spm_hal_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA_M0_PSA/spm_hal_api.c @@ -32,7 +32,7 @@ void spm_hal_start_nspe(void) { - Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR); + Cy_SysEnableCM4(PSA_NON_SECURE_ROM_START); } void spm_hal_memory_protection_init(void) From 275572c9669c8a5e66e676dc564035caaf365579 Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Thu, 7 Feb 2019 12:01:09 +0200 Subject: [PATCH 003/109] tests-netsocket-tls: TLSSOCKET_ECHOTEST deletes socket on failure case --- TESTS/netsocket/tls/tlssocket_echotest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTS/netsocket/tls/tlssocket_echotest.cpp b/TESTS/netsocket/tls/tlssocket_echotest.cpp index b7b91b1ef4..56f8fa7fbd 100644 --- a/TESTS/netsocket/tls/tlssocket_echotest.cpp +++ b/TESTS/netsocket/tls/tlssocket_echotest.cpp @@ -63,8 +63,8 @@ void TLSSOCKET_ECHOTEST() if (tlssocket_connect_to_echo_srv(*sock) != NSAPI_ERROR_OK) { printf("Error from tlssocket_connect_to_echo_srv\n"); TEST_FAIL(); - return; delete sock; + return; } int recvd; From 70d8214d3095b20eba44793aeaec6aad9c0c162a Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Thu, 7 Feb 2019 12:04:09 +0200 Subject: [PATCH 004/109] tests-network-interface: drops unreferenced variable --- TESTS/network/interface/networkinterface_status.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/TESTS/network/interface/networkinterface_status.cpp b/TESTS/network/interface/networkinterface_status.cpp index 32d1a2bd8e..f19a31fa9b 100644 --- a/TESTS/network/interface/networkinterface_status.cpp +++ b/TESTS/network/interface/networkinterface_status.cpp @@ -137,8 +137,6 @@ void NETWORKINTERFACE_STATUS_NONBLOCK() void NETWORKINTERFACE_STATUS_GET() { - nsapi_connection_status_t status; - net = NetworkInterface::get_default_instance(); net->set_blocking(true); From f886fc67c8d0c1167dd05b332d09e2e4df20159d Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Thu, 7 Feb 2019 12:17:08 +0200 Subject: [PATCH 005/109] platform: includes string.h needed by memcpy and strlen --- platform/mbed_board.c | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/mbed_board.c b/platform/mbed_board.c index 4b3844e2a4..9982182940 100644 --- a/platform/mbed_board.c +++ b/platform/mbed_board.c @@ -15,6 +15,7 @@ * limitations under the License. */ #include +#include #include "hal/gpio_api.h" #include "platform/mbed_wait_api.h" #include "platform/mbed_toolchain.h" From fe9020b11a1fd9a20a7447af2d6fa3470abebc0e Mon Sep 17 00:00:00 2001 From: Leszek Rusinowicz Date: Fri, 8 Feb 2019 16:51:01 +0100 Subject: [PATCH 006/109] FUTURE_SEQUANA: SPI HAL fixes 1. Removed random i/o glitches occurring during device reconfiguration 2. Fixed hazardous reads occurring at the end of transfer resulting in incorrect values being received 3. Added spi_free() function 4. Replaced default M0 image with a one ignoring i/o reservation. This is a workaround for missing proper destructors in Mbed drivers and BlockDevice tests failing on repeated initialization Fixes issue #9620. --- .../hex/psoc63_m0_ble_controller_1.01.hex | 1655 ----------------- .../hex/psoc63_m0_default_1.02.hex | 146 -- .../hex/psoc63_m0_default_1.03.hex | 146 ++ .../TARGET_PSOC6_FUTURE/objects.h | 9 +- .../TARGET_PSOC6_FUTURE/pinmap.c | 7 +- .../TARGET_PSOC6_FUTURE/spi_api.c | 152 +- targets/targets.json | 2 +- 7 files changed, 274 insertions(+), 1843 deletions(-) delete mode 100644 targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_ble_controller_1.01.hex delete mode 100644 targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.02.hex create mode 100644 targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.03.hex diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_ble_controller_1.01.hex b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_ble_controller_1.01.hex deleted file mode 100644 index 3942055ebc..0000000000 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_ble_controller_1.01.hex +++ /dev/null @@ -1,1655 +0,0 @@ -:020000041000EA -:4000000000000108310100100D00000095010010000000000000000000000000000000000000000000000000000000009101001000000000000000009101001091010010DC -:400040009101001061080010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001089 -:400080009101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001020 -:4000C00010B5064C2378002B07D1054B002B02D0044800E000BF0123237010BD2819000800000000C0510010084B10B5002B03D00749084800E000BF07480368002B00D11A -:4001000010BD064B002BFBD09847F9E7000000002C190008C051001094020008000000007047EFF3108072B6704780F310887047FFF7F6FF72B6104C104DAC4209DA2168F0 -:400140006268A368043B02DBC858D050FAE70C34F3E70B490B4A0020521A02DD043A8850FCDC094809490860BFF34F8F00F0FCF800F01EF8FEE70000E4950110FC950110BB -:40018000281900089C2800080000000808ED00E0FEE7FEE700B504207146084202D0EFF3098001E0EFF30880043001F067FEFEE7002110B5080000F063FA002000F0C2FAAB -:4001C00000F0DEF962B60B4B5B689B0301D501F0F7FD002000F09CFDFA20400001F006FE054800F031F905F0BBF8002001F0AEFDF9E7C0460000264000000810F8B5E023D7 -:40020000504C9B00E2580F231340D022990092000919885807224C4D0240032A05D0042A05D0002A0FD0494811E028680FE0C022920089581F220A40112A01D0132A04D198 -:400240008020000203E0424801E0FA20C001002B27D1B223B1210322DB00C900E658635867581B0F3F0F1340174205D0354F7958090F0A40012A01D1F20701D4032B3AD1B4 -:40028000B023344ADB00E658A158E758C904C90C02F0B8FBB603F901B60BC90F7043013127E0012B27D1C823C0210322DB00C900E658635867583F0F174205D0214F7958EF -:4002C000090F0A40012A01D1F20703D49B009B0F032B10D1C0227F23D200A758A1583B401F27A658090A3940584302F08BFB310C394002F087FBE0239B00E3589B069B0F81 -:40030000D840154B68601C691969240A090E013102F078FBE1B2A860013102F073FB0F4BE860286104000E49C01802F06BFBFA210C4B28758900E01802F064FBA861C0030A -:40034000E861F8BD00002640C000000800366E0100127A0084050000000021403F420F0040420F00E7030000B021E02010B530241F4BC9005A588000520052085A501A5814 -:40038000A2431A50802252045A501A491A4A80209950A021043289019950FF21174AC005995081315A5892009208024380205A505A580006024301205A505A5882435A505B -:4003C00000F06CFBFFF71AFF00F056FA00F05EFA01F0EAF9B0235B055A78002A02D05B78212B03D10022064BDA605A6010BDC0460000264001000200840500008C0500008A -:40040000E0002340024BD86F032318407047C0460400214010B5FFF784FE074A074BD16F0B4007490B43D367102306490A681A42FCD0FFF77AFE10BD04002140FCFF00004B -:400440000100FA058800214070B50F4C0600FFF768FEE36F0500DB439B0701D1FFF7DAFFB0230A4A9B00D650E26F094B09491340094A1343E36710230A681A42FCD02800DF -:40048000FFF753FE70BDC0460400214000002140FCFF0000880021400300FA05436870B50400012B02D1007B06F07CF92500A2682B1B01359A4203D9E87B06F073F9F6E758 -:4004C00070BD000010B5034A0349002000F0C4FA10BDC046B96700109D04001007B50022030000911000110000F03AFA07BD10B500F0ACFA10BD10B500F0CAFA10BD10B541 -:400500000400007B00F0F2F8606010BD10B50400007B216900F0B4F8606010BD10B5037B0169180000F0CCF810BD10B50400C06800F008F9606010BD10B5C06800F016F93D -:4005400010BD10B50400C06800F022F9606010BD10B5C06800F036F910BD10B504000C23C05E00F055F8606010BD10B50C23C05E00F06EF810BD10B5C06800F035F910BD5F -:4005800010B500221849042000F0F4FD01221749042000F0EFFD02221549042000F0EAFD03221449042000F0E5FD04221249100000F0E0FD05221149042000F0DBFD062283 -:4005C0000F49042000F0D6FD07220E49042000F0D1FD08220C49042000F0CCFD09220B49042000F0C7FD10BDFF0400100D0500101D0500102B05001039050010430500108D -:40060000510500105B0500106B0500107705001070B507260512EDB206400D2D11D801F094FC0A4901224B5D1C003441144003D1B24013434B5501E00124644201F089FC05 -:4006400001E001246442200070BDC0464419000870B50412E4B20D2C0FD80725054001F074FC064901220B5D1E002E41164202D0AA4093430B5501F06CFC70BD44190008B7 -:40068000F8B50C00050001F060FC0C2301225D431300A3401A00094E71198F683A4008D13B43AD598B60631C4B60AB4202D94A6000E0FF2401F04DFC2000F8BDE0000008FD -:4006C00070B50C00050001F040FC01210C23A1406B43054AD3189A680A4201D08A439A6001F037FC70BDC046E0000008F0B50C2485B0019001F029FC019B114D5C432B19CA -:400700005B68029003932E1971680198FFF7B8FF0700FF280DD173682A59934201D9002373602A1953680399994202D001335360E9E7029801F00DFC380005B0F0BDC04627 -:40074000E000000810B5040007280AD801F0FDFB054B0E331A5D002A01D101321A5501F0F8FB0120404210BD4419000810B5040007280AD801F0E9FB044B0E331A5D012A8E -:4007800001D100221A5501F0E4FB10BD4419000870B505001F280ED801F0D7FB084B30335C5D002C02D101225A5501E00124644201F0CFFB01E001246442200070BDC04614 -:4007C000E000000810B504001F280AD801F0BDFB044B30331A5D012A01D100221A5501F0B8FB10BDE000000870B5B024C025144B144A15496405ED00E35CA25C615C665D5A -:400800003F251F242A400C4024039201224311002B407F2219430B003240520413430B4A1C0A110050310B701B0C8B7000234C7011005031595CC1540133062BF8D170BD5A -:40084000040600000506000003060000E000000810B50248B03000F0ABFC10BDDC19000810B50248583000F0A3FC10BDDC19000810B5FFF7F5FF10BD10B5034A8021603271 -:40088000042000F019FB10BDDC1A000870B501F05CFB0500094800F0DFFB094C200000F00DFC2000343000F009FC2000683000F005FC280001F04DFB70BDC046DC19000897 -:4008C000404500108A22044952000B6853430022CB181A717047C046CC1B00088A230A495B000A6809485A438A18926810B5920082180868D26A4343CB18002119718A42FF -:4009000000D0904710BDC046CC1B0008CC1D00088A21084A490013684B43D3181B79002BF9D101211533FF334343D318197110607047C046CC1B00088A20074A074940005C -:40094000D36C4343CB181B79002BF9D1D06CD36C59424B41D3647047CC1D0008CC1B0008F0B585B0039300238A2714001E00029001917F000A9A96424FD2FFF7DDFF03004B -:400980007B432D490090CA18D46000220431944206D00198855CD018081805740132F6E7019A350012190192721CFF32944622499B1B0A98AA1B0C00A8420BD9654507D045 -:4009C000039A1E48545DEA18821814750135F0E780225200009B00987B43E418029B2261A360FFF795FF164B134ADB6C7B43D3181E79009BF6B27B43D2180832114B002E8F -:400A000000D1114B0221032000F086FB0028EAD17342734104002E00ACE7002CADD1002B07D0029B064A9B00D318DB6A002B00D0984705B0F0BDC046CC1B0008D01B000839 -:400A4000CC1D0008DD080010C508001010B5022000F004FC10BD000070B5040015000200022000F087FB0849022000F097FB074AA400136D14190133E5621365012B01D1B3 -:400A8000FFF7E4FF70BDC046C5080010CC1D000810B5022000F0C8FB10BD0000F0B5962191B0002001F002FA01F0D8F9002801D101F0C6F9012001F077F8E8217E4C7F4BC1 -:400AC000626C89011A400A436264626C0193120AD2B23A2A04D1636C794A13400B4363643422002103A803F00DFD03AA0021754800F002FF3422002103A803F003FD03AA9F -:400B00000121704800F0F8FE0822042623686E4D134323602369334207D1002D04D0012001F07EF9013DF5E701E0002D00D1FEE7A02603220127654CF600A35903AD934305 -:400B40003B43A351D2196249280003F0D2FC280001F06AFB5F4901980B685F4A03400B608021136949041B021B0A0B4313611369019902200B401361E0230F219B00E2588E -:400B80008A433A43E250E25821318A438021E250E25809060A43E250002100F075FB0021032000F071FB0021042000F06DFB0321002000F069FB0321380000F065FB444B34 -:400BC0000522191D280003F094FC2900380000F091FB002800D0FEE74049380000F0DCFB002800D0FEE73E4B3E4AE1580A403A43E250E1583C4A0A408021E250E258090666 -:400C00000A43E250A259394B1340A351A259384B13408022920113438022A351A35912021343A351244B1A68324B1340224A136001F092F9C0235B00E3583B4204D12E4AC4 -:400C4000A3585B005B08A3506421002001F02EF9C0230021294A1B01D15080210901535801981B4C0340802080010343535080232349DB00D150D35823002A000C3343CBE4 -:400C800043C243CB43C243CB43C229000D4800F0ADFE23002A00303313CB13C213CB13C213CB13C22900174800F0A0FE164A174B1A6011B0F0BDC04600002740FF00FFFFFD -:400CC000FFC5FFDF0000324020A1070000002640EC45001090002140000021401027000004050000FEFCFFFFFFFF00FFFFF0FFFFFF8FFFFFFFFCFFFF0C0500000000014026 -:400D000000FF00800003324001001180000E1F4110B5054801F07EF90122044B1A70002801D101F083F910BD38010008201E0008030010B5FF24800882009B1ADB009C402D -:400D40009940E243214007282DD8174B01F050FE04090E13181D2227186A02401143196221E0586A0240114359621CE0986A02401143996217E0D86A02401143D96212E061 -:400D8000186B0240114319630DE0586B02401143596308E0986B02401143996303E0D86B02401143D96310BD00002140064B10309A68064B9A4203D183009858995002E027 -:400DC000034B8000C058704700ED00E00000000800000010F7B5051E01913DD00023C05E002802DBA978FFF7A3FF6A680023E85E9201002812DB1A4B81088900C918FF23A7 -:400E000003271C00C0250740FF00BC401A40BA40AD004E59A64332434A5113E003250F2381B20B402940A940FC352F002A408F408A40083B9B080B4C9B001B19DE69BE43D0 -:400E40003243DA61074B00259A68074B9A4204D10199FFF7ABFF00E0044D2800FEBDC04600E100E000ED00E000000008010056000369002B03DA89B24160002000E001486C -:400E80007047C04601008A000368002B01DB034803E089B2C26081600020704701008A000369002B03DAC36800200B6000E001487047C04601008A0070B5040010000F2C9B -:400EC0002BD8002A07D1002927D1154B6401E418144B1C6022E000291FD01F260E401CD1104D0F4B6401E4186960AA60CA0831002C6003F007FB31002000FFF7B9FF3100F7 -:400F00002A1D2868FFF7C0FF011E04D12868FFF7AFFF011E02D0044900E00449080070BD00002340241E000801018A0003018A00194BF7B51A680193D76804003B680E007C -:400F4000834223D90025A94202D100F0FEFF0500019B18680368002B01DB104C10E063095A01A41A012279689B00CB181968A2400C0014400CD10A431A600021FFF778FF05 -:400F8000002E07D1280000F0E4FF03E0044C01E0044CF2E72000FEBD241E00080301880004018A0002018800194BF7B51A680193D76804003B680E00834223D90025A9423D -:400FC00002D100F0C2FF0500019B18680368002B01DB104C10E063095A01A41A0122A24079689B00CB18196811420DD00024914319600021FFF73CFF002E07D1280000F013 -:40100000A8FF03E0044C01E0044CF2E72000FEBD241E00080301880004018A00020188000A4B1B68DA68136883420DD9430999005B01C31A0120984052688B581840431E54 -:401040009841034BC01800E002487047241E00080001880004018A00024B1A68002A00D118607047301E0008F0B52C246043104C1E0024681F0A2018FF2426403C400D4F7F -:4010800006607601F61906610B4E1B0C44606401A4191E04836033434461A3600023059DC261016283619D4201D02B888381F0BD301E00080000234000102340F0B50389D4 -:4010C00085B002AD2B800368066A1933AB704368476A0095826AC16A040003930369C068FFF7C2FF00213B000A0000913000FFF7BBFF216B2800FFF76DFE0023EA5E002AB1 -:4011000005DB1F231A401E3B9340024A136005B0F0BDC04600E100E0F7B52C25124C6843276801933C182669002E08D04D4379198869002805D13568002D02DA03E00B4820 -:4011400011E00B480FE06768012425004B689D4013882D041D431560F2608C61BC40019BA4B24B62B460FEBD301E000804028A0007028A002C235843064B1B681818C369B6 -:40118000934204D9036A9200D150002000E002487047C046301E00080A028A00034B1A682C235843101881627047C046301E000873B5002642690400D56801962B0CB34295 -:4011C0001CD01B040069136013680369B34215DA01A9FFF765FEB0420CD10198E26903681E0C0378934205D2226A9B009B58002B00D0984731002069FFF73AFEADB2002D63 -:401200000ED063691D6000251B68636AAB4202D09847656203E0A36A002B00D09847A56163691B6873BD00000A4B1A682C23584310180C23C25E002A09DB1F231A401E3B23 -:401240009340054AD367BFF34F8FBFF36F8F00207047C046301E000804E100E0084B1A682C23584310180C23C25E002A05DB1F231A401E3B9340034A136000207047C04635 -:40128000301E000800E100E0042819D804290FD94B1EFF3B132B13D81F231940094B8000C018C02304229B00C1504033C25005E00723D0301940034B8000C150002000E051 -:4012C000014870470000264001004A00084B8200D218D0239B00D05807231840042806D1C0239B00D0581F231840E1331843704700002640F0B5012819D1C022224BD2009E -:401300009A58002A0CDB8A78901E0E280FD84C78601E11280BD8C8780D7800282FD101E01A4830E07026152D01D9AE4201D2184829E00E79022E14D0F82124024901F8271E -:401340000C4021007F2412047F033A4011432C4021438024C022C006240520400143D2009950C020C0248005360706403200E4001D590849002029400A431A5103E0382628 -:40138000122DD4D9D1E7F0BD0000264003004A0001004A00FFFFFFCFF8B50D00012819D1C02180240D4BC9005A582406C826224307001C005A50F600A3593B4206D1002D30 -:4013C0000AD0012000F02CFD013DF5E70020002D03D101E0024800E00248F8BD0000264001004A0002004A00494BF7B51C789C46002C05D0474B484CE358002B00DB82E017 -:40140000464B984200D980E09A427ED8444B99427BD80123644663703F4B424CFF280BD8A3260F25F6009F592840AF43384398511859A843083D1FE03B4E0F25B04204D882 -:401440001E592840AE43304317E01E59AE433500060A35431D51354DA84206D8FF261D59000130400F3EB54306E0F02500022D011E5928402E4D354028431851FF2A10D825 -:40148000A326FF27F6009D5912013A400F3FBD432A439A511A5927481040E022D20210430AE0F027204D3F03AA4207D81D592148120417402840384318511EE01859164EDD -:4014C000009010020740019700981A4F154D3840019F074315481F517459824205D8F020120500040240144804E0F020120600050240124820400243725162465160054AE5 -:401500000020995002E00E4800E00E48FEBDC046341E00081C050000000026400F060000FFFFFF0014050000FF040000FF050000FFF0FFFFFFFFF0FFFFFF0FFFFFFFFFF08D -:4015400003004A0001004A00A423F0B500251F4ADB008446D0582B000002020A85B00292039363461A484570AB421BD1029A039B1A43AA4226D0029C039D029E039F0A00D8 -:4015800063464068614601F0D3FBEB0762081A4300900191009801996B088018594132003B000BE0029A039B44680800290001F0BFFB2B00620880185941220001F098FB3B -:4015C000029003910298039905B0F0BD00002640341E0008174B70B5C318DA179B185340042B22DD8023144E144D1B027459A405A40D984209D9124B0521C01801F002FAF8 -:40160000201AC343DB17184009E00E4B0521181A01F0F8F90C4B0019984200D90B4873599B0A9B020343735101E000242000201A70BDC0460080FFFF000026403C0500005F -:401640000280FFFF02800000FE030000FF0300001E4A0300904238D010D840282ED005D8002831D010282DD119482EE0802827D08021100049008B4227D023E0154A904296 -:4016800014D008D8A022120690421DD0124AA020934211D016E0114A904209D0104A904208D0104A90420DD10F480EE0A42003E00E480AE00E4808E0C00306E00D4804E0A5 -:4016C0000D4802E00D4800E0002070470600520001005000010000F0090000A0040000F0050000F0030000F00100520002005200030052000200500005005200FF00520092 -:40170000F0230F4A1B06C318934201D8580A15E0EC230C4A1B06C318934203D8580A80235B0207E0EA231B06C018904204D88023400A9B02184301E0012040427047C04608 -:40174000FFFF0F00FF7F000010B50400FFF7D8FF0022431C02D0E40562426241100010BD0B4B10B51B69002B10DB0A4B0A4C1868FFF76EFF0121094B094A995099580029D9 -:40178000FCD1064909590029F8D100E0054810BD00002340401E00088C040000000025400C0400000200500010B5022202490020FFF7E0FC10BDC0469503000810B5FFF74B -:4017C000CFFF10BD70B50400FFF7BEFF002824D0FEF714FDE022124B52051A605C600024FA219C60DC600F4B0F4A1D691B692D0E013555431B0ADBB201335D430B4B8900C2 -:40180000186801F0FFF80100280001F0FBF8084BC118200002F08CFE00E0064870BDC046401E00080000214060F59000C4000008980800000600520070B505000C00FFF76E -:4018400083FF002828D0002C26D0FEF7D7FCC022124BD2041A608322FA2152005A609D60DC600F4B0F4A1C691B69240E013454431B0ADBB201335C430B4B8900186801F0B9 -:40188000C1F80100200001F0BDF8E1239B00C118002002F04DFE00E0044870BD401E000800002140808D5B00C4000008060052000F4B30B5C0180F4BC009C01800011F23D2 -:4018C000032909D81D00C9008D4013408B400468AC432343036009E01D000439C9008D4013408B404468AC432343436030BDC0460000CEBF00100304F7B504000E001500E1 -:4019000000286ED0002A6CD0012312688B40002A01D1436000E08360B30001930F231900B0008140A26A8A4369680B4083401343A3622A7A31002000FFF7BAFF03207100C2 -:4019400088400322636A83431800EB6813408B400343636201231F00B7400097FF43BC462F6962461F40B740A0691031104038436F69A0611F40B740E06A10403843E0620D -:40198000A86903221840B0400600E869276B10408A408840009930430A4397436A6A384356000222206304201640AA6A616B92000240286A324303401A43EB6AD800182322 -:4019C0000340FF2013432A6B019D520102401343FE2292002A40934081430B436363002000E00148FEBDC04601005A0000281BD0002919D00D4B0E4AC318DB099B180A682C -:401A00001B010260CA6882620A69C2624A6902638A6842624A6882618A694263CA6900201A600A6A5A6000E0024870470000CEBF0010030401005A0010B50F24022006495C -:401A4000064BCA58A2430243CA50F02212028B58A34303438B5010BD0000214004F0000010B50F2403200649064BCA58A2430243CA50F02212028B58A34303438B5010BD7F -:401A80000000214004F000000449054A054B88580340C020C00103438B5070470000214004F00000FF8FFFFF0449054A054B885803408020C00103438B50704700002140BF -:401AC00004F00000FF8FFFFFF8B50500072700F03CFA1C4C060063693B409D422DD0022D0FD18021184A490493690B439361FFF7A3FF03226369BB4313436361FFF7C4FFD8 -:401B000009E003226369C820BB431343636100F087F9FFF7C9FF072362699A432B4013436361052D09D1C82000F07AF9FFF798FF054A064B91690B409361300000F009FA66 -:401B4000F8BDC0460000264000F02540FFFFFFFE031E03D1084B5869C00F0CE00020012B09D1054918008A69920F1A4201D18869C00F01231840704700002640072370B53A -:401B8000084CA2691A4090420BD0A5699D4303402B43A361002904D0904202D9C82000F03FF970BD00002640F7B5060000F0CDF9B022E8211F27244D244C01902B595205F9 -:401BC000C900525C3B409B1A5A1E9341B34236D0002E13D180211E4A490493690B439361FFF72AFF0B222B59BB4313432B51FFF74BFFB023E8225B05D2000CE00B222B59C5 -:401C00000920BB4313432B5100F00AF9FFF74CFFB022104B5205D35C2959DAB21F23994313400B432B51012E09D1092000F0F8F8FFF716FF064A084B91690B4093610198E9 -:401C400000F087F9F7BDC046000026401CFF000000F0254041070000FFFFFFFE70B5050000F073F92C1E20D0124B19681F2901D900241AE0EC68002C17D02C68002C14D038 -:401C80005E6800243200002A04D0AA42F0D014005269F8E7002E01D15D6000E0656100222C61012401316A61196000F052F9200070BDC046501E0008F0B5060085B00D0012 -:401CC000204F042901D001291AD100207C68002C35D01D4B984232D02379B3420ED1A368002B01D02B4209D1E36801A85A689B6842608360057023689847BC606469E6E758 -:401D0000BC68022902D1002C00D024690020002C15D00D4B984212D02379B3420DD1A368002B01D02B4208D1E36801A85A689B68426083600570236898472469E7E705B0CA -:401D4000F0BDC046501E0008FF00420070B5194C06002368002B0AD100F0F7F823680500002B10D004210020FFF7A6FF0BE001210020FFF7A1FF0028EED002210020FFF79C -:401D80009BFF0D4C14E004210C4A13698B431361012E01D030BF00E020BF280000F0D9F823680024A34203D008212000FFF784FF200070BD501E0008FF00420000ED00E072 -:401DC00010B5E82400F0C1F8064B07495A68A4010A4022435A605A68114059605B6800F0B8F810BD00002640FF00FC0F70B5802504002D02AC4206D9064B186800F09CF86D -:401E0000054BE418F6E7054B1868604300F094F870BDC046DC0000080080FFFFD800000810B5034B1B78584300F086F810BDC046D40000080122014B9A6070470000254032 -:401E400080220020034B12069A649B6C834200DA0148704700002740030046008022054B120198585B68DBB2002B02D08023DB021843704700002640FEE7000002680A4B08 -:401E800010B51A6042685A6082689A60C268DA6002691A6142695A6182699A61C269DA61FFF7EAFF10BDC04678050008F0B51922002800D14B32E82403258A429241194ED8 -:401EC000640033595242AB43134333513359164F3B403351154B5C68AC4322435A605A6817405F60002808D00023102913D921338B429B415B4201330DE003001D290AD96D -:401F000001233A2907D9DB18572904D976338B4240410422131A0F21054A1068884303431360F0BD00002140FFFCFFFFFC00214000002540000000000230800803D001309E -:401F40000238FCD1C046C0467047EFF3108072B6704780F310887047094B042803D11A68104318600BE0C022000692041040902204499200885004211A688A431A6070471C -:401F800010E000E000002140F8B50778012F06D0082F34D11C4B1868FFF7DBFF31E00320FFF73EF8194B984229D000F0CFF8012825D0022003F0D8F90600FFF7C6FF124D59 -:401FC000286003F0D5F9040006281AD0022E0AD1033CB4433000E4B204F026FE002C0BD100280ED008E0380004F01EFE022C03D0002801D1FFF7AAFE2868FFF7AAFF04480B -:4020000000E00020F8BDC0467C1E000801018800FF004200002803D0024B5860002000E0014870477C1E00080100160000B58BB000212822684602F065FA6A46154B1648F7 -:402040009381FB2313835383F83B1377013353770C33D3770132D3776A460232D3776A465B3353846B4601220733DA77FFF7F6FD03F05AF903F060F903F05AF906A803F0FD -:40208000A7F9002804D1054B6846019303F074F90BB000BD901300004C01000898050008014B024AD050704778F0010000003C4010B50BF0EFFA10BDF8B58023FA250C0037 -:4020C00001271B0218430D4E0004F061AD00326C0A4B01203A4205D1002D0CD0013DFFF79FFEF4E7002D06D01A6C10431864DB6A0020238000E00248F8BDC04600003C4007 -:402100000400160070B5FA2401260D4B000418400C4D0143E961A4002B6C0A4A0120334205D1002C0AD0013CFFF77AFEF4E7002C04D0136C18431064002000E0024870BD34 -:402140000000FF7F00003C400400160010B500242000FFF7BBF8032804D00134052CF7D1002000E0012010BDA023034ADB00D058012318407047C0460000264030B524259E -:402180009DB02A00002101A802F0BCF9154B164C0493164B2A0000210AA808930993069402F0B0F9124B2A000D93124B00211193114B13A812930F9402F0A4F90F4B01A9D9 -:4021C00016930F4B0F481A931894FFF70FFC0AA90D48FFF70BFC13A90C48FFF707FC1DB030BDC046666666660000FFFF1C1C1C1C66E6EE661C1A1A1A1A1A000066E6666601 -:402200001A1A001C00013240800132400002324010200349034A8B5803438B507047C04600003C4070F00100F0B585B00090002800D147E1BE4F7B689B0301D5FFF7C0FD6B -:402240000122BC4BBC4C1D001959114204D0BB495B58134200D037E1FFF790FFB84AB94BEA508022009BD2021B781343B64AAB50B64AB74BEA50B74B5A6801231A4200D078 -:4022800024E1B54A116F08220A4008D1B34BB44918681300884202D900F0B4FB431E2A68002B03D0AF485B03034300E0AE4B13432B607B699F499E4E01275B000DD53900DF -:4022C0000320FFF75BFC73699B0F3B420AD08022B369D2051343B36104E00320A34A8B5803438B502B5940200193019AA04BA14E13432B51FFF794FD0123AA598D4F1A42F5 -:4023000008D1BB514020FFF78BFD03234020BB51FFF786FDFA27019A974B984E1A4016430192FF002E51964A964BD3581022134207D1002F00D1CBE00120013FFFF770FDCD -:40234000F1E7002F00D1C3E008218F4A0120AB580B43AB50FFF7FCFB002802D18B4E019B1E438B4B1E4001231E432E511E00894C724BEB58334207D1002C00D1A8E0012097 -:40238000013CFFF74DFDF3E7002C00D1A0E00B27C02181484901FFF7B5FE041E05D102AB991D7D48FFF788FE0400013F002F00D196E0002C25D1C02202AB9E1D33885201AA -:4023C0009342E5D131007548FFF776FE041E18D180233288DB001A4200D083E00B27019380216E48C900FFF78DFE041E04D131006A48FFF761FE0400013F002F70D0002CB3 -:4024000068D0B0256D056B78002B44D06B78212B41D0634FEB5B002B3DD0002C00D0FEE002AB9E1D31005F48FFF746FE041E00D0F5E0C021E85B3488084060398C43400898 -:40244000594920430140F020EA5BC000EB5BD201024011439B05554A9B0F1140DB02194350483180FFF74EFE041E00D0D7E031004F48FFF721FE041E00D0D0E0C022EB5B04 -:4024800031889B069B0F9B019143194348483180FFF738FE0400002C00D0C0E0009B454859781D78444B49001943FFF72BFE041E04D142494248FFF725FE04006801FFF7D6 -:4024C000AFFCACE03F4CAAE03F4CA8E03F4CA6E03F4CA4E03388019A934200D080E701E03B4C8EE731003B48FFF7E6FD041E00D087E732883F2310009843009B36499F78F9 -:40250000DB78012F0ED10222012B04D89FB2D21B92B2019201E0170001947022104330802E4A66E0002B5BD0019401275BE0C0460000264000003C40A0F00100B4F00100AC -:4025400006000001A4F00100A8F0010001000100ACF00100FC003C4000F03D40C800000800093D00041A0080040A0080C4F0010030000300B0F00100EFFFFEFF20000200CA -:40258000000032401040000068F0010028000200FFFFFBFFF07E0E00021E0000031E000016180000071E00007FF8FFFFFFE7FFFF061E0000081E000001100000376800007B -:4025C0000F1E000001001600030016000200160004001600091E0000C00000080048E80101201F0001907F2082436F38024332800C4ADA400A6031880B4839433180FFF750 -:4026000081FD009B0400DB78DF1B03231F40019B9B001F43054BBFB23780EF50F1E6200005B0F0BD0024F400091E000064F00100014B18687047C046C0000008024B58690F -:402640004000C00F7047C046000026400120024B1B68DB0D984370470000264010B50A00002808D0FA23FF33994204D8034901F040FF002000E0024810BDC04607080016C4 -:4026800001001600F0B57D4C7D4BA54407900C000492994200D8ECE08B187A4A93420ED9794A914200D8E4E0784A934207D9784A914200D8DDE0774A934200D9D9E0FFF718 -:4026C000BDFF0523019300280BD0734B5D6907231D40EBB20193022D03D10520FFF7F4F90195FFF7B3FF01230393002810D06B4B694AD158E823B022DB005205D25C1F2307 -:402700000B40934204D10120FFF74EFA00230393F0231B06E3185D0A06936D0200210320FEF706FC0028F9D1070008AB5B1B0293049BBB4273D980239B00EB180593002615 -:402740002B00069A9A4214D8049ABA4211D9079A0299D25DCA54002E08D18021490559180978521A511E8A41160000E00126013705E0802252059A1812780299CA54059A64 -:4027800001339A42DDD10024A6423FD08023C8265B05ED182800FFF715F804000120FFF73FFBA423A422DB032340D203934203D1013E002EEED128E0394B9C4204D1FEF71E -:4027C000FDFF384B0400F8E70120002C1ED1C82608A92800FFF730F804000120FFF720FBA423A422DB032340D203934203D1013E002EEDD109E02A4B01209C4206D1FEF780 -:40280000DDFF284B04009842F9D00120264A029B944663440293002C02D1059D88E70024002801D0FFF706FB00210320FEF7BCFB0028F9D1FFF702FF002805D0019B022B9B -:4028400002D11800FFF740F9FFF700FF002805D0039B002B02D11800FFF7A6F9134B9C4207D0134B9C4204D00020844202D0114800E0114889239B009D44F0BDDCFDFFFFEA -:40288000FFFFFF0F00001010FFFFFF1300800014FF070016000A0016000026401CFF0000010050000200500000FEFFFF0200520006005200130016000100160010B50A0031 -:4028C000002807D0FA23FF33994203D80249FFF7D9FE00E0014810BD0708001601001600002070470020704710B5FFF799FA10BD10B5FDF7FCFD074B1B681B6800229A5E9D -:40290000002A05DB1F231A401E3B9340024A136010BDC046801E000800E100E010B5FDF7EAFD094B1B681B6800229A5E002A09DB1F231A401E3B9340044AD367BFF34F8FCA -:40294000BFF36F8F10BDC046801E000804E100E0A023034ADB00D058032318407047C04600002640024B034AD058C00F7047C0461C0500000000264010B5FEF7E5FD10BD77 -:4029800010B5FEF731FD10BD10B5FEF723FE10BD10B5FFF7F3FB0220FFF782FB094C0A4923681868FEF716FA23681B6800229A5E002A05DB1F231A401E3B9340034A13600A -:4029C00010BDC046801E0008B120001000E100E00420704710B5FFF7B8FA10BD10B5FFF7B8FA10BD10B50021FFF7C8F810BD000002B4714649084900095C49008E4402BCBF -:402A00007047C046002243088B4274D303098B425FD3030A8B4244D3030B8B4228D3030C8B420DD3FF22090212BA030C8B4202D31212090265D0030B8B4219D300E0090A03 -:402A4000C30B8B4201D3CB03C01A5241830B8B4201D38B03C01A5241430B8B4201D34B03C01A5241030B8B4201D30B03C01A5241C30A8B4201D3CB02C01A5241830A8B42AC -:402A800001D38B02C01A5241430A8B4201D34B02C01A5241030A8B4201D30B02C01A5241CDD2C3098B4201D3CB01C01A524183098B4201D38B01C01A524143098B4201D320 -:402AC0004B01C01A524103098B4201D30B01C01A5241C3088B4201D3CB00C01A524183088B4201D38B00C01A524143088B4201D34B00C01A5241411A00D20146524110462E -:402B00007047FFE701B5002000F0F0F802BDC0460029F7D076E7704703460B437FD4002243088B4274D303098B425FD3030A8B4244D3030B8B4228D3030C8B420DD3FF2267 -:402B4000090212BA030C8B4202D31212090265D0030B8B4219D300E0090AC30B8B4201D3CB03C01A5241830B8B4201D38B03C01A5241430B8B4201D34B03C01A5241030B23 -:402B80008B4201D30B03C01A5241C30A8B4201D3CB02C01A5241830A8B4201D38B02C01A5241430A8B4201D34B02C01A5241030A8B4201D30B02C01A5241CDD2C3098B4221 -:402BC00001D3CB01C01A524183098B4201D38B01C01A524143098B4201D34B01C01A524103098B4201D30B01C01A5241C3088B4201D3CB00C01A524183088B4201D38B007B -:402C0000C01A524143088B4201D34B00C01A5241411A00D201465241104670475DE0CA0F00D04942031000D34042534000229C4603098B422DD3030A8B4212D3FC228901BF -:402C400012BA030A8B420CD3890192118B4208D3890192118B4204D389013AD0921100E08909C3098B4201D3CB01C01A524183098B4201D38B01C01A524143098B4201D3C7 -:402C80004B01C01A524103098B4201D30B01C01A5241C3088B4201D3CB00C01A524183088B4201D38B00C01A5241D9D243088B4201D34B00C01A5241411A00D20146634601 -:402CC00052415B10104601D34042002B00D54942704763465B1000D3404201B5002000F005F802BD0029F8D016E770477047C046002B11D1002A0FD1002900D1002802D090 -:402D00000021C943081C07B4024802A14018029003BDC046D9FFFFFF03B4684601B5029800F050F8019B9E4602B00CBC7047C046F0B54F464646C0B41604360C99463300C8 -:402D400005042C0C070C150C63437E436F4365431C0CAD1964199C46A64203D980235B02984647446346250CEF191D044B464A4343432D0C240464199918C91920000CBCA3 -:402D800090469946F0BDC04670B500220C4B04000D0001F05DFA002804D12000290001F0B5F970BD064B00222000290000F05AFE01F0ACF980231B069C466044F1E7C046E0 -:402DC0000000E041F0B54D46564644465F46F0B4924683B004000D0099468B422FD82CD04946504601F05CFA29000600200001F057FA331A9846203B9B4600D574E053461A -:402E00005A4693401F005346424693401E00AF4229D826D05B46A41BBD41002B00DA79E0002200230092019301235A4693400193012342469340009319E08242D0D900221A -:402E40000023009201930C9B002B01D01C605D600098019903B03CBC90469946A246AB46F0BDA342D6D900220023009201934346002BE8D0FB0772081A4346467B080EE0D4 -:402E8000AB4201D1A2420CD8A41A9D41012024196D410021013E24184D41002E06D0AB42EED9013E24196D41002EF8D15B460098019900196941002B22DB2B005A46D34044 -:402EC0002A004446E2401C005B461500002B2CDB26009E40330026004746BE403200801A994100900191AEE7424620239B1A5246DA40414613004A468A4017001F4382E7AB -:402F0000424620239B1A2A0046469A402300F3401343D5E74246202300219B1A0022009101920122DA40019282E74246202326009B1ADE402F00B446974066463B003343D8 -:402F4000C9E7C046F0B556464D4644465F46F0B41D000E034C00CB0F87B0070092468146360B640D98466AD06D4B9C4235D08022430F12041343F6001E43C3009946694B51 -:402F800000279C460023644402932B0368001B0BED0F51469B46400D009500D178E0604B98426CD05B46DA004B0F802109040B4313439B465346D9005A4B9C4600236044E4 -:402FC0004246201A6A40924601901F430F2F00D9B0E05548BF00C0598746374300D088E0002399460233082700260293CDE74346B34649460093029B009A9246022B00D07A -:40300000BFE1002153460122002689461A40444B002136030C0D2405360B2643434C1B0526401E437600D207760816434846310007B03CBC90469946A246AB46F0BD330077 -:4030400003434FD0002E00D1BCE1300001F00AF903000B3B1C2B00DDADE11D220100D31A08393A008F408E40DA40B9461643304B00279C46002360444442029385E753460E -:403080005A4613432CD1002300219B46023397E70B4320D05B46002B00D19EE1584601F0E1F803000B3B1C2B00DD8FE102005946083A91408B461D21CB1A5146D9400B0043 -:4030C00059460B4351469B469140194B9C4660444042002374E7002300219B4601336FE703236DE70023994601330427002602934BE703230C27029347E70122D51A382DA6 -:4031000000DCB0E153461A4000210023002689467EE700238026994600223603004B77E7FF07000001FCFFFF40510010FFFF0F80F30300005E4500D972E100D16DE1019B36 -:403140004D46013B01930023340002935B461E020B0E1E430B020393330C994633041B0C494620000093FFF74DFC009B370043430600494620009846FFF7CAFC2C0C090439 -:403180000C43A04509D9E419731EA74200D95CE1A04500D859E1023EE4194346E41A49462000FFF72FFC0300009A80465343494620009B46FFF7ACFC2A040904120C0A4314 -:4031C00093450DD94346D219013B974200D93AE1934500D837E102235B429C46D219E0445B46D21A4346360433439B460399180C0B0C1D00059309045B46090C0C001B04F8 -:403200001B0C4443049159436B4368431B190D0CEB189C4203D980246402A44660441C0C09041B04090C20185D18824200D2DEE000D1D7E0161A029B9C465D1BAC459B41CE -:403240005B42F61AB74200D106E149463000FFF7D9FB009B04004343494630009846FFF757FC2E0C09040E43B04509D9F619631EB74200D9F3E0B04500D8F0E0023CF619CE -:403280004346F31A494618000293FFF7BBFB009B06004343494602989846FFF739FC2D0409042D0C0D43A84509D9ED19731EAF4200D9D6E0A84500D8D3E0023EED192404A4 -:4032C000210043463143049E059A3000ED1A0B040C0C1B0C58436643534354439A19030C9B189E4203D980225202944664441A0C00041B04000C14191B18A54250D34DD0F4 -:4033000001231943964A019B94466344002B00DCF3E64A0709D00F220A40042A05D00A1D8A42894149428B4411005A46D20108D55A468C4B1A4093468022D2009446019B7C -:403340006344894A934200DD5BE65A46C908500708435602514601225B058146360B5B0D0A4055E680231B031E4211D05A461A420ED15E461E433603360B2A0089467B4B4B -:4033800046E6032B00D1E1E0012BBBD11A40BBE61E433603360B4246744B39E6002BB1D07D194A1EAF4252D91100A542A8D1039A9A42A5D1A6E703003E00283B9E400023D5 -:4033C000994654E600F04EFF203041E603005246283B9A400021934677E6504600F042FF20305EE6029B0026AB4200D323E7039E0299B44661448846B045B6415B467642FB -:40340000F619B218013B0291974213D290424FD800D18EE0161A9B460DE7894500D28EE674084B46F60735005B081D434B46DB0702938BE69742EDD10399029CA142E5D9E8 -:403440003E1A9B46F7E69846CAE61E00A5E6AC423ED874D0110053E70121494252E71C000EE71E002BE71F2D3CDC20230A0058465B1B9840EA4099400243481E81415E4694 -:403480001143EE404B0709D00F230B40042B05D00B00191D99429B415B42F61833023CD55346012200211A40002601238946AFE502235B429C46039CE344A446029B634479 -:4034C0009846A045B6417642F6190293B218B1E603988A1E41008142B6417642F619AD19039161E71F225242D31A5A46DA401300202D29D040225846551BA8400143481ED7 -:40350000814107200B4318400026002809D00F2200261A401900042ABBD10B0070077602360BDB0803439946012253461A4000236EE502998D42BBD89B4600267BE6039882 -:403540009842C5D3110032E70020D7E780265B4636031E433603360B009A8946034B57E5FF030000FFFFFFFEFE070000FF070000F0B55F4656464D464446F0B40D039946E5 -:403580004E002B0B87B00700924680469B46760DCC0F002E69D06D4B9E4235D05B468022DD001204430F13432B439B46C3009846674B00279C460023664401934A461503D6 -:4035C0005000D20F53462D0B400D914600D176E05E4A90426CD080225B0F120413435C4AED0094461D4353460022DB00604449463618701C6140029017430F2F00D9AFE0AD -:403600005448BF00C759BF465B461F4300D088E000239B469846023308270193CEE74946022A6AD0032A00D109E2012A00D0BBE111400022002300259046CCB200212D036B -:403640000A0D12052D0B1543434A1B0515401D436D00E4076D0825434046290007B03CBC90469946A246AB46F0BD034352D05B46002B00D18AE1584600F0F4FD03000B3B24 -:403680001C2B00DD7BE11D22D31A3A0001005D46DA4008398D4013008F402B439B46B8462E4B00279C46002360444642019385E752462A432CD100250023022297E75246D4 -:4036C0002A4321D0002D00D154E1280000F0CAFD03000B3B1C2B00DD46E11D21CB1A51460200D9405346083A954093400D431B4A944660444042002279E7012400220C40A4 -:40370000124B0025904699E70025002301226EE703226CE700239B4698460133042701934CE703230C27019348E700238025984600242D03054B81E75D464346019A6FE786 -:403740005D4643462100019A6AE7C046FF07000001FCFFFF80510010FFFF0F80F30300004246120C91461A0C9446424617044A461B041B0C5A43604690464A464243100071 -:40378000039262461C003F0C7A437C4342440192220C9246019A5244904506D98246802040028046C24450460390100C049048462404240C1204121905922A0C2D042D0C38 -:4037C00068432C00824648467C4350438146200C8046574357444744BA4503D9802040028046C144380C3F04B84648442404240C01900498A044404404905846000C814646 -:4038000058460404200C8246070048465F434C464343604660436446834650464443380C8446E4186444A34203D980235B029C46E34448463F04230C3F0C2404E41957463D -:4038400068436F4384464D46504655434243380C814662444A445B44944503D9802040028446654403983F04834604983F0C8446E344C345804140428246100484460198EA -:40388000674484466744A344BC46A345A4419946D44464428742BF41D4458041E144A04699459B417F424042C8440743120CBA18A045A4415F423B0064422343D71843467A -:4038C0007D19DB0D6D021D435B465A02059B1A43531E9A415B46DB0D1A4343465B021343EA0107D501225C0813402343EA07029E13436D08574AB218002A4BDD580709D0BB -:403900000F201840042805D0181D98429B415B42ED180300E80104D54F4A15408022D200B2184E48824200DDE7E60124DB08680718436D02530580462D0B5B0D0C407DE6CF -:40394000802259461203114208D0154206D115432D0398462D0B4C46414B6FE65D4615432D032D0B3E4B69E603005546283B9D400023BCE6504600F075FC2030A8E60300D1 -:40398000283B9F400023BB46984689E600F06AFC203073E60124A61A382E07DD00220C4000230025904649E6029EA3E71F2E20DC20222C001800921BF040944093400443A7 -:4039C000581E83411C43F540630709D00F232340042B05D023001C1D9C4292415242AD182B021FD5012400220C4001230025904624E61F202C004042821AD440202E1CD003 -:403A00004022961BB5402B43581E83410720234318400025002809D00F2200251A401C00042AD8D1230068076D022D0B0124DB08034398460C40002300E60025E3E78022DD -:403A40000124120315432D0398462D0B0C40044BF4E5C046FF030000FFFFFFFEFE070000FF070000F0B557464E464546E0B40E001100F20F9246C500420F18033703740020 -:403A8000400A4E0F7F0A3043CF4E17435A00640D520DDB0FC900B24200D1E5E001267340A61AB446534500D1AFE0002E00DC0DE1002A3AD103000B4300D0E4E06B0709D09C -:403AC0000F232B40042B05D02B1DAB42AD416D427F191D003B0200D488E0BB4B01349C4200D110E13A00B94B51461A4001235007ED08520264050543120B640D0B400021AC -:403B0000280012030D0D120B64052D0515436208AF4CDB072C401443640064081C4321001CBC90469946A246F0BDA74B9C42C5D080231B0418436346382B00DDFDE01F2B10 -:403B400000DD30E1624620239B1A02009A40664690460A009940F24046464B1E99413243114363460200DA40691A8D429B410D00BA1A5B42D71A3B0235D57A02530A98464C -:403B80004346002B00D1C4E0404600F06BFB0300083B1F2B00DDC5E020222900D21A4746D1409F400A009D403A439C4200DDC0E01C1B631C1F2B00DDE4E02021140028003D -:403BC000C91AD8408C408D400443DA40681E854117002543002471E7424663461A4300D14CE2674645466B0700D069E7012351467807ED08FA080B40054373498C4238D0DC -:403C000012036405120B640D79E7002E00DC9AE0002A47D06C4A944200D14FE78022120410436246382A00DC08E10143481E81410022C9B24919D219A942BF410D007F42D7 -:403C4000BF183A0200D442E15F4A0134944200D14EE101205D4A69083A4028400843D507054357089A4629E706000E4300D017E714E72900114300D1F9E1802109030A436B -:403C80001203120B3BE701235B429846C4446346002B72D1691A8D429B413F1A5B42FF1A0D0068E702000A4300D107E7012252429046C4446246002A00D0E6E06918A942E2 -:403CC000B6413F187642F7190D00BAE7002E00D080E0621C5205520D012A00DCF9E06A1A91464D45B6413A1A7642921B9046120200D499E04D1BA9428941C71B49427A1A9C -:403D000090469A463CE752460123002513400022F5E6280000F0A6FA20300300083B1F2B00DC39E72A002838824000259C4200DC3EE7264FE41A1740C0E60143481E8141B9 -:403D40000022C9B210E7002E00D0F1E0621C94465205520D012A00DCA0E01B4A944500D1C5E06918A94292413F185242D2194908D5070D4357086446A0E6134B9C4200D06A -:403D8000D9E69BE611001F3CE1400C00202B00D180E04021CB1A9A4015436A1E95410027254300241FE763460200203BDA406346202B71D0402366469B1B98400143481E83 -:403DC000814111430022CFE6FF070000FFFF7FFFFFFF0F80002C48D0CA4CA24200D1A2E07442A1468024240427434C46382C00DDDBE01F2C00DD44E14E462024A41B3E00B3 -:403E0000A640A246B0464C462E00E640B4464646644626435446A5406C1EA54134002C434D46EF400D1B28E04A4643464D461A4300D0A5E6002300240025DEE61F2A5ADCA8 -:403E400066462022921B060096409146B04662460E00D640424616434A4691404A1E9141020060463143C240E4E63C002C435AD0F443A146002C52D14D1BA9428941C71B8D -:403E800049427F1A14009A4675E69E4A944200D0C7E613E600227FE700208FE7002C00D0C8E03B002B4300D10FE103000B4300D104E66918A9429B413F185B42DF193B02B2 -:403EC00000D41AE1904B0D001F406446F6E59A4689E63A002A43002C5CD1002A75D102000A4300D1CAE007000D009A46E6E564460022002581E662460600203AD6406246C1 -:403F0000B046202A00D1B7E040226646921B904001434246481E8141114300228AE6794CA24200D061E707000D0014009A46C5E5002C41D13C002C4378D0F443A146002C86 -:403F400020D0704CA24271D04C46382C00DDB2E01F2C00DDBCE02026341BA2463C005646B4404E46A0462C00F440A446444666463443A4465446A54064466E1EB541254390 -:403F80004C46E7406D188D4289413F184942CF19140056E6002A2FD102000A4300D184E007000D009A46574C88E53D436F1EBD41ECB200270D1B60E7524CA24236D07442E1 -:403FC00080263604A1463743BEE702000A4300D174E56A1A90464545B6413A1A7642921B9446120200D4F7E54D1BA9428941C71B49427F1A9A4661E502000A433AD0ED0899 -:404000007C072C438025FA082D032A4208D0C7082F4205D145072C003A009A46C9080C43670FD200E5001743364C47E507000D00140043E53A002A4343D002000A4319D034 -:40404000ED087C072C438025FA082D032A4207D0C6082E4204D147073C003200C9080C43D700620FE50017439A46264C26E50022002544E5234C21E5002049E700230025EF -:40408000BBE54C463E00203CE6404C46B446202C31D040244E46A61BB7403D436C1EA54164462C4300270D1BE7E6802200231203144C0025A1E53D436F1EBD410027EDB2AA -:4040C00060E707000D000F4CF8E407000D00F5E44E463C00203EF440A0464C46202C0ED040244E46A41BA7403D436F1EBD4144460027254346E70027CFE70D0073E50027E5 -:40410000F2E7C046FF070000FFFF7FFF0B0330B5134D1A0B4B005B0DC90F0024AB4211DD104CA34210DC8024640322430E4CE41A1F2C0CDD0D48C31ADA4013005C420029CD -:4041400000D11C00200030BD094BCC18FAE7E040084CA44663449A4013000343EEE7C046FE0300001D0400003304000013040000FFFFFF7FEDFBFFFF70B5051E28D000F017 -:4041800071F8154B154A1B1AD21A1F2A16DD2C00134A0025D21A94405A052403240B520D002124030B0D240B1B0523430D4C1205234013435B002800590870BD0B212C0051 -:4041C000081AC440954024035A05240B520DE7E700220024E4E7C0461E0400003304000013040000FFFF0F808446101C62468C46191C634600E0C0461FB500F001F90028B4 -:4042000001D40021C8421FBD10B500F055F84042013010BD10B500F0F3F8002801DB002010BD012010BDC04610B500F0E9F8002801DD002010BD012010BDC04610B500F069 -:404240007BF8002801DC002010BD012010BDC04610B500F071F8002801DA002010BD012010BDC0461C2101231B04984201D3000C10391B0A984201D3000A08391B09984244 -:4042800001D30009043902A2105C40187047C0460403020201010101000000000000000010B5002903D1FFF7DDFF203002E0081CFFF7D8FF10BDC046F0B55F4656464D46AD -:4042C0004446F0B41F035C00DB0F9A46194B0E034D00C90F8046360B6D0D8B4691463F0B640D9D4219D0134B9C421BD00123A54206D018003CBC90469946A246AB46F0BDAF -:40430000BE42F6D1C845F4D1D34510D0002DF0D1304303005A1E9341EBE7310001230143E7D1E0E73A430123002AE2D1DEE70023DFE7C046FF070000F0B55F4644465646AA -:404340004D46F0B41F033C0B2C4F0E034D00A3465C008446360B6D0DC90F9046640DDB0FBD422BD0254FBC422ED0002D0ED130430700814678427841002C17D15F463A4391 -:4043800014D14B460020002B0AD006E0002C02D15846024301D099421AD00123484218433CBC90469946A246AB46F0BD0028F2D058425841012240421043F1E7370007435A -:4043C000D0D002204042EBE75F461743CDD0F8E7A542E2DC05DB5E45DFD808D000205E45DED248424841012340421843D8E7C445D3D80020C445F4D3D2E7C046FF070000C6 -:40440000F0B55F464D4644465646F0B41C03240BA4462F4C0F034D005E00C90F80463F0B6D0D8B469146760DDB0FA54220D0284CA64222D0002D12D1384344424441002E05 -:4044400020D0002C0DD05C42634101245B421C4320003CBC90469946A246AB46F0BD002E17D05B4519D05B465C4201231C43EFE7390002240143EBD1D9E761460224114317 -:40448000E6D1D7E761460A43DBD100240028DFD0E9E761460A43E4D1E5E7B54203DD01225C421443D4E7B542CDDB6745DBD809D000246745CCD259464C4261410124494239 -:4044C0000C43C5E7C845CED80024C845F3D3BFE7FF07000030B50024A24208D0035D651C0C5DA34201D0181B02E02C00F4E7002030BD002310B59A4203D0CC5CC454013372 -:40450000F9E710BD03008218934202D019700133FAE77047F8B5C046F8BC08BC9E467047F8B5C046F8BC08BC9E4670470000000001B40248844601BC604700BF990200081A -:4045400003000000010000000100000000000000050360000400000001000000000000000100000006046000080000004C1B00086108001008000000010000000200000063 -:4045800002000000080800030900000001000000000000000300000009090003080000006C1B0008710800100A0000000100000004000000040000000A0A000C0B00000066 -:4045C0000100000000000000050000000B0B000C100000008C1B0008510800100A0029000300000003001800030000001920010219010200000000000C00000000000000B3 -:4046000000000000006800000000000000000000000000000000121200000000000000000000000000000000000000BA0000000000000000000000000000000000001D1DFA -:40464000000000000D0000000800000000020000000000000000000000000000000000000000000000000000000000000B0000000000000064000000000000002002000092 -:404680007C01000031010000090901120C00FF0380ABCDABCD80409C1B04041BFFFFFFFF000000000410080007070400F216FBE0FBE01F60427EF56D720096BE209000000F -:4046C00010502604060037D7F401FA00960064004B0032001E00140003040506020D1100F1D9001055D90010A7DF0010A5DA001057DB001053DF00106BDF00102DE000101A -:40470000D1DB001039DC001015DE001043DE00107BE0001041DF00100FE000100FE000100FE00010E9DE001091DE0010D5DE001075150110811501104D2501103526011082 -:4047400041260110A1DA0010EFD90010EBDF001055DB00108FDB001063DF001085DF001079E0001035DC001091DC00102FDE001069DE0010E7E000104BDF001079E000100F -:4047800079E0001079E0001039DF001079E0001079E0001079E0001079E0001079E0001079E0001079E00010DFF50010E7F50010E3F50010DDF50010BBF50010B7F500100A -:4047C000D5F50010D3F50010AFF50010B3F50010EBF50010D7F50010D1F50010EFF50010EFF50010ADF50010DBF50010CD0C011081100110450E0110F10B011001FF001072 -:40480000B5FB001085060110C901011021F7001085F70010D9110110110A01106101011035FB001011060110F15B0010C10A011079120110051601105117011025180110C4 -:4048400041140110D51201108D150110B5130110DF130110EF130110F1130110F51301100FE00010E1130110EB130110E91301107D29011035230110E928011099280110D6 -:40488000352901104D26011059250110F1250110B526011025BE0010572301104D2301105323011051230110552301104F2301100FE000100FE000100FE00010F9AC00109A -:4048C000453C0110273C0110273C0110273C01105D3C01103D7B0110273C01102D7B0110457B0110357B0110DF400110D74001104140011039400110373C01101F3C011034 -:40490000153C01103B3C011031400110614001102F3C011059400110B9400110273C0110694001105140011049400110273C0110653C01106D3C0110753C01102B3C0110A5 -:404940002B3C0110453C0110273C0110273C0110273C01105D3C01103D7B0110273C01102D7B0110457B0110357B0110DF400110D74001104140011039400110373C0110A7 -:404980001F3C0110153C01103B3C011031400110614001102F3C011059400110B9400110273C0110694001105140011049400110273C0110653C01106D3C0110753C011031 -:4049C0002B3C01102B3C0110696401105D640110756401102B3C01102B3C0110096101104561011015610110396101102D61011021610110516101105D610110516401104F -:404A0000B5660110B9660110C56601109D660110A96601102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C011082 -:404A40002B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C01102B3C011069610110A7570110BC -:404A8000555601105556011055560110D957011069570110555601104D5701101958011063570110F3570110E9570110D75501105556011055560110555601105B55011014 -:404AC0003757011081550110B9570110DF560110EF56011069560110555601102F580110A556011097560110555601102357011067580110555601105556011055560110FA -:404B0000F9630110ED63011005640110ED5601108756011055600110916001106160011085600110796001106D6001109D600110A9600110E1630110F1650110FD6501103C -:404B400009660110D9650110E5650110555601105556011055560110555601105556011055560110555601105556011055560110555601105556011055560110555601107F -:404B8000555601105556011055560110555601105556011055560110555601105556011055560110555601105556011055560110B5600110D75A0110055A0110055A0110DD -:404BC000055A01101B5B0110815A0110055A0110C95A0110C95A0110735A0110315B01101F5B0110815901107D590110615A01101559011007590110075901101959011072 -:404C0000FB5A0110355A0110495A0110095A0110055A0110655B0110215A01100D5A0110055A0110655A0110815B01107D5B0110055A0110055A01102563011019630110E5 -:404C400031630110A95B0110035901109D5F0110A55F0110B15F0110BD5F0110A55F0110A55F0110C95F0110D55F01100D630110FD6401100965011015650110E56401109E -:404C8000F1640110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110FE -:404CC000055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110055A0110E15F011008000000060F0020200107021900000007070E0562 -:404D0000020220001C1202000103000E030600040040270700000707010200020307030400000000000000000000000000000000000000000000000000080000A757011057 -:404D4000555601105556011055560110D957011069570110555601104D5701101958011063570110F3570110E9570110D75501105556011055560110555601105B55011051 -:404D80003757011081550110B9570110DF560110EF56011069560110555601102F580110A55601109756011055560110235701106758011055560110555601105556011037 -:404DC000D75A0110055A0110055A0110055A01101B5B0110815A0110055A0110C95A0110C95A0110735A0110315B01101F5B0110815901107D590110615A011015590110B3 -:404E0000075901100759011019590110FB5A0110355A0110495A0110095A0110055A0110655B0110215A01100D5A0110055A0110655A0110815B01107D5B0110055A011014 -:404E4000055A011008000000060F0020200107021900000007070E05020220001C1202000103000E032000800000C00000000004000000A822000000000000040000F7FF90 -:404E8000FF7F0000003000000000000000000000000000000000000000000000000000000000000000000000355E0110ED5F0110555F0110955E0110FB5F01107D5F011022 -:404EC000655E011009600110615F0110935E01100D600110795F01107D5E0110FB5F0110715F0110675E0110FB5F0110695F0110AB5E011019600110855F0110B15E01101F -:404F0000296001108D5F011055560110055A01102B3C011055560110055A01102B3C011055560110055A01102B3C011055560110055A01102B3C011055560110055A01101E -:404F40002B3C011055560110055A01102B3C011055560110055A01102B3C011055560110055A01102B3C0110BF5E011041600110955F011055560110055A01102B3C011044 -:404F800055560110055A01102B3C011055560110055A01102B3C011055560110055A01102B3C011055560110055A01102B3C01107961011055630110FD6201107761011054 -:404FC00049630110F56201109F610110A163011005630110756101103D630110ED62011055560110055A01102B3C011055560110055A01102B3C011055560110055A011081 -:405000002B3C011055560110055A01102B3C011055560110055A01102B3C0110A16401105D65011000000000AF64011071650110BD270110BD6401109B650110ED2701105F -:405040008164011021650110412401108F6401103F6501105D24011030303031423830303031303230333034303530363037303830393041304230433044304530463130A4 -:40508000313131323133313431353136313731383139314131423143314431453146323032313232323332343235323632373238323932413242324332443245324633307A -:4050C000333133323333333433353336333733383339334133423343334433454142000026002B00300036003C0043004B0055005F006A00770086009600A800BD00D400CC -:40510000EE000B012B014F017801A601DA01130254029D02EE024A03B1032404A5043605D9058F065C0742084409650AAA0B160DAF0E79107C12BD1445171C1A4B1DDE20A6 -:40514000343100100230001008310010F82F0010083100101231001008310010F82F0010023000100230001012310010F82F0010EE2F0010EE2F0010EE2F001064330010A0 -:405180006037001020360010203600101E36001038370010383700102A3700101E360010383700102A370010383700101E3600104037001040370010403700104039001054 -:4051C00000000000F8B5074600256846058078683C1D2D492E46002807D06268002A06D0800702D1207A800701D00D4649E0FDF7CFFBFDF793FBFDF7EBFB00F029F9002855 -:405200003DD1788C0006C00F00F0A2F905460004000C34D11D49084600F0A4FE0004000C2DD12289A17A2068194C002806D02060A280E68021810021FFF764F9684601F0DA -:405240001BFC054613486B460078E2888000001DC1B21B88A088D418A04206D3C01A801A80B201F09BF9044600E00B4C00F044FD002C04D100F07CFB08490120087000F03D -:40528000F5F82846F8BD00000100160025540010901E0008CC1E0008FFFF00006401000810B503480078012801D101F013F810BD6401000810B5FDF74BFB032801D100F086 -:4052C000FFFD00F0FDF901F059FC00F07DFE02490020087010BD00006401000800487047901E000870B5044600208A0703D08A07920F891A091D084B89B2DA889E885518D8 -:40530000B54206D81D68AA182260DA885118D98070BD024870BD0000901E000803001600004870479C1E000810B501F033FB10BD10B501F039FB10BD10B501F03DFB10BD54 -:405340000549002806D0054981800521017000214170817008467047010016008203000010B5FFF79DFF10BD10B501F02DFB10BD10B501F03BFB10BD38B505460020694608 -:405380000880002D09D0284601F03CFC0446684601F066FB002C02D015E00C4838BD01F01DFB2846FFF70EFF04000CD1284601F0B1FB040007D1FDF7CBFA032803D100F058 -:4053C00055FD00F093FD204638BD00000100160038B50446002069460880002C08D06189090A05D1617A102902D8E179102901D90A4838BDA0816946204601F0CFFB054626 -:405400006946A08909884018A081002D04D1102221460348FFF76DF8284638BD010016009C1E00087047000010B5084900200978002909D005F052FE044605F015FD201ACD -:4054400080B281004018C00810BD00006C01000810B5FCF793FE442202490348FFF749F8002010BD84460010AC1E000810B5FDF73FFA10BD10B519461046044C01F0C4F9CB -:40548000002800D00024204610BD0000FFFF000010B501F0E5F910BD10B501F0CBF910BD010010B5044806D0044A01201070002007F064FD002010BDFFFF00006C01000848 -:4054C00070B50024034D20462C7007F085FD2C70204670BD6C01000801480078704700006C01000870B5591C89B24C080B4D64000021451906E028685054000A5618891C6C -:40550000707089B2A142F6D3D80705D0D0182038D15CC47FD454C17770BD000000103C4030B50A4C002100195B1E07E054186478555C240225430560891C89B29942F5DBDB -:40554000994201D1515C016030BD000000103C40F8B50746FF2000F0F3F9164EFF2070701548164900684018406B0024410F301D0125022901D0457000E0447005700D4882 -:40558000801C4470384612F03DFB070010D112F07BFB3070012000F0D3F912F07FFB68460470447012F0E4FE6846457012F0E0FE3846F8BD6D0100086801000840F03D40C6 -:4055C000F0B50021094D5B1E08E0441924685718260A7E705454001D891C89B29942F4DB994202D1401900685054F0BD00103C4070B500210A4E5B1E09E0541864782502AE -:40560000545C2C4385192C60001D891C89B29942F3DB994202D1515C8019016070BD000000103C40F0B50599091FCFB200217E1E0AE054186478555C24022543144C0419D6 -:405640002560001D891C89B2B142F2DBFC0710D01C78515C24020E4A0C4381180C609C785D782102001D294384182160001DD9780BE059781A7809021143054A84182160B9 -:40568000D978001D9B780902194380180160F0BD00103C4038B509480024447012F0FEFA69460C704C70684612F062FE012069464870684612F05CFE002038BD6F010008AA -:4056C00010B501F08BF90A480078012805D1FCF73DFD012809D012F02FFF05490020891E0870062000F02CF910BD12F00FFFF4E76F01000810B50B46062816D006DC01281B -:405700000FD0032801D1FFF7C5FF10BD0B2811D0112813D01228F8D11146184612F018FA10BD0020FFF714FF10BD1146184612F09DFD10BD04480078107010BD1146184663 -:4057400012F016FA10BD000071010008F8B5184D184E28688019846AE00719D001F07AF90127012811D1002001F046FA052000F0E7F81149FF204870881C4078002804D10B -:4057800028688019416B39434163286880198762E0050CD50848801C0078052802D1042000F0CEF8FF202968013089198862F8BD6801000840F03D406D01000805490028B2 -:4057C00005D005494A784270097801700021084670470000010016007101000838B504000C4816D06178012913D801F0F7F8607812F074FD207000280AD1694608706846BD -:4058000000F090F869460878012801D104202070002038BD0100160010B5094900280CD00278082A09D24278042A06D205494A700078087012F032FA0021084610BD000022 -:40584000010016007101000810B504460448032C05D801F0C3F8204612F04CFD002010BDFFFF160010B50400054808D06178012905D801F0B3F8204612F07AFD002010BD9C -:405880000100160010B5FCF761FC0122084992040028084B086804D0C018016A1143016210BDC018016A9143016212F04FF910BD6801000880F03D400949087805280ED15F -:4058C0004A780848084900684018002A03D1416B490849004163C16A01221143C16270476F0100086801000840F03D4001480078704700006F01000802484078022800D09F -:40590000012070476D010008012807D0032807D0042803D0052803D0FF207047012070470220704710B5040002D012F065F9207010BD000001494870704700006F01000808 -:4059400010B50446FCF7EAFF062C01D9FF2C01D102480470FCF7CCFF10BD00006F01000801494870704700006D010008002070471CB5002469460C70022001902346054AE1 -:40598000054800F0F5F904480068401C00D1034C20461CBDE559001074010008FFFF00003EB50F4A01460D4800230124126800290BD0012908D1684600930481438169469A -:4059C000104600F0D0F980B23EBD68460093048143816946104600F0C1F9F4E7FFFF00007401000810B50089002100280BD0012802D0052807D103E000200DF061FD02E02A -:405A0000084600F0F5F8002010BD000010B50248006800F041FC10BD74010008FFB581B01F00154606463CD000F0D8FFFCF776FF2F49304B4878401CC0B2044606E02201A6 -:405A4000D218127A202A2AD0641CE4B2202CF6D3002406E02201D218127A202A1FD0641CE4B28442F6D32024202C1AD03470029821490202120A200602432001C618726042 -:405A80001F501B4869180078009120280CD0FFF7CBFC0746BD4223D3281AF0601BE04C70E2E7164805B0F0BD13484042854207D9FFF7F6FC014611488142F3D0009807E084 -:405AC000A8B2FFF7EDFC01460C488142EAD00020F060074804703472FCF70AFF0020E1E7FFF7EEFC781B012100F01EF9DCE7000078010008F01E0008C063FFFFFFFF000083 -:405B000070B5074CA5780E2D07D2FFF787FF002802D1A178491CA17070BD024870BD000078010008FFFF0000F8B520280BD2234D07017C19207A202805D000F04FFFE06877 -:405B4000002802D031E00120F8BDFCF7E7FEFFF76BFC012100F0E8F80020184EE060FFF7AFFCFCF7C5FE00F0ADF80546202819D0FCF7D4FE280186191148F168814205D90F -:405B80000646FFF78DFC0021304604E088B2FFF787FC0021F06800F0C7F8FCF7A9FE0948057002E00749202008702020034920720020C8516060E060F8BD0000F01E000858 -:405BC000409C00007801000810B5074CA178002908D0FFF7A9FF002802D1A078401EA070002010BD014810BD78010008FFFF0000F0B500258BB02E46089500F0EFFE00235F -:405C00006A4618462C49040161180C7A202C02D0C96800291DD000211154401CC0B22028F0D300240993099800280FD06846005D00283BD020482101081806684168089119 -:405C400000210160202241600272C160002D04D028E0012111540B46DFE700F033F80546202819D0144829010818C7681348874207D90021074600F057F8FCF74FFE3846A8 -:405C800006E00021384600F04FF8FCF747FEB8B2FFF706FCFCF72CFE094805700998002808D00125002E01D00898B047641CE4B2202CB8D30BB0F0BDF01E0008409C000007 -:405CC0007801000830B50023DB432020094C00210A011219157A202D06D0D268002A03D09A4201D808461346491CC9B22029EFD330BD0000F01E000830B50020084C05463A -:405D00002023020111190B72A550401C4D60C0B2CD602028F5D303480370457030BD0000F01E00087801000830B50B4D00231A015219147A202C0AD0D468002901D02418C6 -:405D400004E0844201D9241A00E00024D4605B1CDBB2202BEBD330BDF01E000810B50EC900F0B2FA10BD10B50EC900F0E9FA10BD38B50024E443054600290AD0052000909D -:405D80004B68097804A000F043FA2860401C00D00024204638BD00007461736B000000000EB5002005216A46009011815081034869460068FFF7D7FF0EBD000074010008D6 -:405DC00010B51D481D4C0178491E0170FF206070FCF7C8FD002825D0FCF72AFC01460020FCF7CAFDFCF7D0FD411C14DB80B2012811D862881248824208D0124B0021601C97 -:405E0000FFF77EFE002802D10220207010BD0D2010F086FE10BDFF20F530FCF765FD00F065F810BD0548084B02220021401CFFF767FE0028EBD110BD7A0100087C010008F0 -:405E4000FFFF0000855E0010C15D001010B503480078042801D100F049F810BD7C01000801480078704700007C010008044800210170FF214170FF21F53141807047000090 -:405E80007C01000806490878401E087005480178012901D003210170FF214170704700007A0100087C01000801494880704700007C01000801490870704700007C01000886 -:405EC00010B5054C6078FF2803D000F007F8FF2060700020207010BD7C01000810B502484078FFF771FE10BD7C01000810B5FF22043280210820FCF743FD0B4C6078FF28EE -:405F000001D0FFF7EBFF0848084B04220021401CFFF7F6FD002803D00D2010F001FE10BD0120207010BD00007C010008C15D0010C0080A21484380B20849C82801D2084848 -:405F400009E002461923C83A5B019A4201D2400801E0FF20F5304880704700007C010008FFFF000010B50F4A002313600E4A13600E4B18600E4801600E49012008600E49FA -:405F80000860282090600E490C4808600D49143008603C38506000F0C5F800F0F5F9002010BD00009801000880010008AC010008B00100089C0100088C010008182100087D -:405FC00090010008A401000800207047014610B50020002910D0094B1A689C685118A14209D25868196080188A0704D08A07920F891A091D196010BD002010BD8001000861 -:40600000F8B50024164E671E321F3D463168136806E01422624310328A58521C1BD0641C9C42F6D36A1C14D02C461422544322460C3288500C214843FFF7C8FF31680028FC -:4060400008510AD031680020103408517068401C70602846F8BD2546E4E73846F8BD000090010008F3B50026F64381B000281FDB2149096888421BD80299002918D01E4F63 -:40608000142204463F1D54432546396810354859401C0DD0FAF72FFAFCF740FC38682F1F4159C359994205DBFAF721FAFCF720FC3046FEBD214608310091465801590C20F9 -:4060C000704308180C220299FEF713FA0A48761C001D0068C159B14200D100260649009A091D865008684159491C4151FAF7FFF9FCF7FEFB0020FEBD8C010008002803DB64 -:4061000007490968884202D90020C043704704491422091D0968504310300858704700008C010008F0B500200D4A451E0346171F50600FE014260146714314680E1DA35119 -:406140000C461668083433511668083435511468401C635039688842ECD30020F0BD000090010008F3B50026F64381B0002845DB26490968884241D8029900293ED0234FAD -:40618000142204463F1D54432546396810354859401C33D0FAF7AFF9FCF7C0FB3868415900292DD0211D009146580C21005971430F46C1190C220298FEF79BF913480021D1 -:4061C000001D0068761C00590C34C0190160416081600E48001D00680159B14200D100260A49009A091D865008684159491E4151FAF77DF9FCF77CFB0020FEBD3046FEBD4B -:40620000FAF775F9FCF774FBF8E700008C010008FEB504460D4600201E49089E0860471E009001900290002C11D0486885420ED2002A0CD0002E0AD0642E08D808460C30BE -:4062400001681C2068430C18207A002801D03846FEBD0120226020721846FFF7D1FE6060401C13D06681A6810A4827610C3067610179A94200D205710021684601810A464D -:406280002846029B00F05CF82846FEBD00202072DDE700009801000810B5002810DB0949496888420CD807491C220C310968504308184068FFF722FF002801D0002010BD32 -:4062C000012010BD9801000838B50124009400F03DF838BDFEB50027184EFF433D4600240EE01C20316860430818017A002906D04068FFF703FF002801D0254603E0641CBF -:406300003079A042EDDA681C16D01C2130684D434419FAF7F0F8FCF701FB69466068FFF721FF0546FAF7E3F8FCF7E2FA002DD5D1216868468847D1E7FEBD0000A4010008AB -:4063400038B50024009400F001F838BD1FB500220C49541E0A60002811DB496888420ED808491C220C31096850430818406801A9FFF778FE401C02D0002004B010BD20461B -:40638000FBE7000098010008F0B50021114A4D1E174611710C3F0B46BD6016E008461C2460431668041D355114680646235014680836A3551468361DA353044616680A3432 -:4063C000335318301468491C255078688142E5D30020F0BDA401000838B500210091002811DB0F49097888420DDA0D4D04010C3529680859002807D0201D0818694600F0DA -:4064000073F9002801D0002038BDFCF787FA28680F34015D491E0155FCF76AFA009838BDB4010008F7B582B0002502986E1E06602F48D21C024017462E4A2C4610460C38C8 -:406440000178106805E02301C358002B0FD0641CE4B28C42F7D3711C29D03401211D40180191039900F02EF9002820D101E02646F1E72048016820460C300F521D480399A6 -:40648000026820460E3011541A480399026820460F30115403993846484300F0A1F8154900280968085102D00024009011E001251AE01048016801980818009900F02FF9B7 -:4064C000002801D0012502E00098C0190090641CE4B203988442ECD3002D05D10298054906600879401C0871284605B0F0BD0000FCFF0000C0010008F8B50D4600216A4658 -:406500008C461180002839DB23490978884235DA214B04010C3319680A59002A2ED020460C300B5A801C0E5C184670438018954224D3854222D2002006E007465F43BF182F -:40654000AF4206D0401CC0B2B042F6D36046002814D0114E271DC8190C366A46294600F008F900280AD168460088012808D030682946C01900F0D3F8002803D00120F8BD9D -:406580000020F8BDFCF7CAF930680F34015D491C0155FCF7ADF9F3E7B4010008F8B50F46002400F031F8002817D10C4900220B460C334A600EE021011D680E466A501D6804 -:4065C0000C36AA53B61C1D680F31AA551D68641C6A54E4B2BC42EED31A71F8BDB401000800280BD0C01C074A81085068890053884118994203D8936851601818704700201A -:4066000070470000B4010008F8B5064600200F4D009029700C0121466846FEF763FE00280CD129460C3100980860301B001F84B221466846FEF756FE002801D00448F8BD27 -:406640006C800098A8600020F8BD0000B4010008FFFF0000F8B5002827DB19490978884223DA174C05010C342168485900281CD028460C30085A009028460E300E5C401C88 -:406680000E5420682F1DC01900F064F800280CD12068002445590EE0094829460C300068C01900F03CF8002801D00120F8BD00982D18641CE4B2B442EED30020F8BD000093 -:4066C000B401000830B50D4604000BD0A800FFF787FF6060002805D000202570C0436080002030BD012030BD70B50D46040005D0002D03D00220205E002801DA012070BDF0 -:40670000FCF70CF90221615E60688900405828606088401E6080FCF7EBF8002070BD70B50D46040007D0002D05D002212078615E401E814201DB012070BDFCF7EFF86088E9 -:40674000401C00B26080616880000D50FCF7D0F8002070BD10B5040009D0227800216068FDF7D0FE0020C0436080002010BD012010BDF0B500231D46002802D00224045F0A -:406780000AE00120F0BD46689F00F6598E4201D1012503E05B1CDBB29C42F4DA15700020F0BD000001B503480122436811466846984708BD4821000810B50021052010F0E4 -:4067C0005DFA10BD70B50546FCF7A8F80D4C218A002914D0638A8B4209D100206082208201202070A3682A46E068984707E0E0680121C018F9F772FE608A401C6082FCF732 -:4068000077F870BD4821000810B50023084A00280BD0002909D001241470141D0BC413825382F9F74FFE012010BD1370F5E700004821000807B509480378012B01D0002059 -:406840000EBD02230370C16002820021418201216846F9F743FE01200EBD00004821000804480021C160018241820121017008467047000048210008FEB5114C114F089EDB -:40688000099D00280BD0002909D0002A07D0002E05D0002D03D0002B01D01B2B01D93C460CE00096019508F03FFC042802D0052803D003E0034C133400E000242046FEBDA4 -:4068C000FFFF160001001600FEB50E4C0E4F089E099D00280BD0002909D0002A07D0002D05D0002E03D0002B01D01B2B01D93C4606E00096019508F060FC042800D1002489 -:406900002046FEBDFFFF160001001600F0B589B015460F460646144C00F060F8002E20D0002F1ED0002D1CD0102239466846FDF7E0FD1022314604A8FDF7DBFD1021684605 -:4069400010F0DAFB102104A810F0D6FB2B46102204A9684608F000FC1021284610F0CCFB0024204609B0F0BD0100160010B50FF04FFD0AF0A7FC0EF089FC10BD10B50FF074 -:4069800049FE0BF0DBFC10BD10B508F007FE0FF097FB10BD10B50DF089F80FF049FD0AF02BFD0EF07DFC10BD10B50DF07FF80FF043FE0BF0D1FC10BD10B50DF077F808F0AC -:4069C00019FE0FF08DFB10BD10B5022801D100F089FAFEF78BFFFEF797FF10BD10B500F07DFBFEF783FFFEF78FFF10BD10B5FEF77DFF012801D1FEF77FFF10BD10B501886E -:406A00008A0703D08A07920F891A091D0379827B1031534359438BB241888C0703D08C07A40F091B091D447910316143C918438989B2DC0703D092015118103189B29A07B6 -:406A400005D5C0794422504340180C3081B2084610BD000001488078704700009C2100080100034803D00348008808800020704701001600C801000810B504000C4815D030 -:406A8000FEF74EFC817B44238A01C179594351181C312180827B9B005A43891880312180407AC000083008182080002010BD00000100160000B501464A7809781202114337 -:406AC000124A11488BB091421BD111490978002917D1FEF725FC0146102206A8FDF709FDFEF7FCFB01680191808869468881FFF775FF6846FEF766FB002802D1684600F016 -:406B000009F80BB000BD000002001600030C00006401000870B5184D00280BD0FEF700FC0446807A800701D4FFF72EFFA07AC00703D004E01048801E70BDFFF717FFA07A26 -:406B4000000701D4FFF71AFF204610F0EFFB002810D110F071FB00280CD100F0D1FD002808D110F05DF8002804D10DF05DFB002800D10025284670BD0300160010B5064C11 -:406B800010F066FC002804D110F094FC002800D10024204610BD0000FFFF160070B5044640890D46002681070BD0C00709D020881B38E12804D26088FB2801D81B2800D2FB -:406BC0000B4E2046FFF71AFF2880617A5322C900083140182880A17BD20051430922D20189184018034928800880304670BD000001001600C8010008014988707047000054 -:406C00009C2100080021002807D04268002A04D0034A80891288904200D2024908467047C80100080100160070B50546FEF75EFE074CFF280AD0FEF7E9FE012806D10020EA -:406C4000012D04D103494978002900D1204670BD020016005C21000870B5054613480E460078A84201D8002404E01148016AD02068430C18002C13D0228B50060AD5D2072B -:406C8000D20FA078022106F05DFA208B40218843208305E0D207D20FA078012106F052FA3146284604F050FC70BD0000CC1E00085C210008F8B50546002004460B4E0090C2 -:406CC0000FE022466946284601F008FD0098002801D010F001FBA878214603F0A0FF641CE4B2B08AA042ECD8F8BD0000F0210008FFB50446C034A068002103468C468E46B6 -:406D00002033997887B0002915D05E78F200511D06920591415C0091911D0291415CD51D0495475D151D0395455D82580192109A002A07D03CE00A99FF2008700899002070 -:406D400008605EE0002908D0DA78002A05D1002D03D0491E029AC9B281540098854227D3002925D1019810F0B7FAA268059900235354A26802995354A26804995354A268EF -:406D800003995354A26806995350A06820304178491C8907890F4170A16820318878401E0006000E887027D02148864601208446A0686346014620318A78002B0AD04E7804 -:406DC000F1004B1DC35C0093CB1DC75C0B1DC55C40580190002A28D0009885421FD20199401B4A190899C0B20A60B8420CD2099A2918C9B210700BE00A99FF200870089947 -:406E00000B600B480BB0F0BDE819C1B2099807700A980670F000A268001D115405E00A98FF2101700899002008607046EAE70000FFFF0000064A02235188891C89B2518047 -:406E4000814201D8102900D95380508870470000CC0100080148407870470000CC010008F8B517460D460446FBF758FDC034A16820318878042827D0E8780202A87810436A -:406E80000A78521C9207920F0A70A16820318A78521C8A70A1682022525CD6008D51A168721D8854A2680021331DD154F21DA168B8428F540CD33946FBF72AFEC0B20029A1 -:406EC00007D0401CC0B204E0FBF712FD0448F8BD0120A168B61D8855FBF70AFD0020F8BDFFFF0000FEB575480478FEF7FFFC012831D1FBF72DFD724D032831D1A87B012806 -:406F000029D800F033FF012803D100F003FF012808D0A87B002818D06849002020390A782B6A10E0A87B0028E2D10EE0824201D8002102E0D021414359188031C97801294C -:406F400009D0401CC0B28242F0D8FEF789FF032802D3FEF7CBFFAFE0FEF782FF0128FAD05848007800285FD004F052F900285BD00CF0C8F9002857D0FEF748FD002853D018 -:406F800004F08CF800284FD111F084F801284BD06878C00703D000F0F1FE012844D0287E002841D16878484F002803D1FEF794FA002860D06878000706D504F06FF8064623 -:406FC00000F0E4F8304377D16A7801A9684608F03DF90646B4426FD83C48864206D3FEF77BFA002868D06878002865D104F010F9002861D03648006A80B2029068784007C3 -:4070000003D56846008805F02BFA03F007FE6846008803F041FE03F027FF2E490988814203D10120FEF78CFC46E0FBF7D3FC054603F01AFF69468988401A301AA0420ADB09 -:407040000CF060F9012806D1FEF7E0FC012802D1387003F09BFE2846FBF7C0FC3878012803D01B4902980862DBE70120FEF762FC00F0E4FD1BE004F0CBF800281CD0102489 -:4070800003F0F2FE214603F017FD03F005FEFEF7BDFC002810D00120387003F077FE0020FEF748FC00F0CAFD38780128B9D1FEF7E9FB00203870FEBD0748FEBDEC1E0008B7 -:4070C0005C2100086D010008CC010008FF7F000040123C40E6010008FFFF000010B517480078002825D01648046AFEF7FFFB032821D004281FD005281AD103F061FE00F082 -:40710000B1FD03F0EFFE8007800F022810D10D48418800290CD08321095D002908D101210170207E0221C207D20FA07806F00AF810BD0024D9E700F095FD10BDCC1E000871 -:407140005C210008DC010008F8B50646002406F0DBF90546304606F00FFA03460A480021868A0DE001228A401046174628401F40002803D0002F01D1224394B2491CC9B257 -:407180008E42EFD82046F8BDF0210008F8B500252C460A4F0A4E0CE0D020396A604308180079002803D02046FFF7CEFF0543641CE4B23078A042EFD82846F8BD5C210008D9 -:4071C000CC1E000808B50020694648706846FEF705FB69460020085608BD70B50D4601F0BBFF04000BD02079002808D0FFF7F6FBE178A0782A4605F0E9FA002070BD02201A -:4072000070BD00000148007F70470000CC1E00088030C078002800D00120704700B500F001F800BD10B5094BD0225043196A85300A5C074C521CD2B20A54648A196AA24269 -:4072400001D300220A54196A085C10BD5C210008F021000870B50D4601F07EFF04000BD002F0F3FD002807D021462A460A310620FEF740FA002070BD022070BD70B50D4647 -:4072800001F06AFF040007D002F0DFFD002803D0207B2870002070BD022070BDF8B50F4606460146384606F025F9044614480078B04201D8002504E01248016AD020704380 -:4072C0000D18002D12D0284601F084FF032C0ED0002C0BD000220121304602F091F9284603F0C8FA0221284603F0DEFAF8BD3146384606F0C7F90146304606F05FFDEEE76B -:40730000CC1E00085C210008F7B52B4F0446F8682A4D0078297F884201D30720FEBD07F0CDFE002801D00C20FEBD2078611C05F06DFCFF2822D1F868297F007888421DD287 -:4073400005F0B6FC0646FF2816D02178621C03F083FB1B4821780068426B601C904705462078611C02F0B2FEFF2802D0314602F033FE002D04D01CE007251AE01F2518E02D -:407380000298002815D1F86841680078C200101A401C08180622611CFDF7ABF8F868217842680078C300181A1154F8680178491C01702846FEBD0000CC010008CC1E0008EC -:4073C000EC01000810B507F079FE002801D00C2010BD05F0EBFB05480068006B804702F011FE002000F0A2F9002010BDEC01000870B50D46044610210FF07EFE102160180C -:4074000006460FF079FE334610221946204607F0A3FE102130460FF06FFE0220287020460CF028FE70BD0000F8B504464078217802028006870FE0781143A67809050002BE -:40744000090D0643084601F087FE00210546F2B2002816D0002C10D0022F0ED0032F0CD0002A0AD00279092A07D0002A05D0134A8223527D1B5C9A4207D8288900210CF049 -:40748000E8FC20460FF028FF0D49002914D10D48224600682946436930469847084988420AD1284680308178F2B2491C8170FF232146284600F02FFAF8BD0000AC1E0008C5 -:4074C000FFFF0000FC01000800207047F8B5434D0646E8680078002805D007F0EFFD002803D00C20F8BD0220F8BD3078711C05F08DFB0446FF280ED005F024FA3848317891 -:407500000068826B701C90470746204602F0A0FD002F02D060E01F275EE0E968087800285AD0421EA24246D0C200101A4968821FC01F8A18085C114602F0C8FDFF2802D0E5 -:40754000214602F049FDE86842680078C100081A801F1118E000061B701C009010180622FCF7C7FFE86842680078C100081AC01F115C9155E868426800981218204603F08D -:407580006BFAE8680078401EC0B205F0DBF9E86841680078C200101A801F081806220021FCF7B0FFE868002142680078C300181AC01F11540CE04868E1000C1B611C4018B9 -:4075C00006220021FCF79EFFE968002049680855E8680178491E01703846F8BDCC010008EC01000810B500F05BFA0CF01DFE002010BD000010B5014605220A48FCF779FF97 -:407600000849052208463438FCF773FF01F000F9044880224438C17B1143C17300F088FA10BD0000A021000810B5044600786178E2780843A1781143084321790843617917 -:40764000084305D007F024FD002803D00C2010BD122010BD204605F0D1FB002010BD000010B50078002105F02FF8024902200876002010BD5C21000810B502788178407804 -:40768000002305F037F8024901200876002010BD5C21000810B50C4605F08AFC064A117E012900D1002000211176022121700CF03DFA002010BD00005C210008024A936853 -:4076C0000360D06808607047CC01000870B505460024800708D50948807A400604D500F06FFA002800D10224680705D500F086FA002801D104200443204670BDAC1E00089E -:4077000010B5FBF765F905F041FF074807F034FE012000F033F8040001D105F01DF909F041FD204610BD0000B81E000870B50024104D114E002811D0304608210C30FDF745 -:40774000D1FD0404240C13D1287FC100091AF068001DFDF7C7FD0404240C09D1F06800210170297F4068CA00521A0021FCF7CAFE204670BDCC1E0008CC010008F1B54D4874 -:407780009F22817A82B0114000248172FDF7C8FD0746807AC00706D0474802990068C268384690470446B87A800708D5002C7CD1424802990068C26A384690470446002CE8 -:4077C00073D1787A102809D83A492031009108770298FFF7ABFF040002D066E0384C64E038480025457045734571C5750576457645758570C5708571C573042144300173E1 -:407800001F21C1809B21417245732E4EFF2020363073757300F09CFB07F0CEF802F0F6FA30462030C5700298012814D100980178D02041433046FDF755FD0004000C08D131 -:407840000098007841012048FDF74CFD0404240C01D01B48FEBD002507E02846029902F04FFA040005D16D1CEDB200980078A842F3D8144900204431C87288724439887335 -:40788000401E4883FF200877B87A0121000700280848C27A01DA0A4301E052085200C272032030757075F175B1750849002008702046FEBDAC1E0008FC010008EC010008FA -:4078C000FFFF00005C210008D00100087A01000870B505460E46084605F016FE0446304605F04AFE0121A9400A46224001400A4301D0012070BD002070BD10B5044608467D -:4079000005F03AFE0121A140014201D0012010BD002010BD7047FEB51C4616460F46054602F0A8FFA878FFF779FC02460190334639460094284600F00DF8002808D1A87853 -:407940000199FFF789F9FF2C02D138460FF0C4FCFEBD0000FFB50D4685B004468178164610460E9F05F07AFE00280ED0FF2F27D0C8200159F800031D0A58C01DCB5C085C65 -:407980005278834216D9012716E02648D022016AA078504385300A5C002A01D1224A927C521E0A54FF2F02D128460FF095FC012009B0F0BD9006870F69460898088108E0E4 -:4079C0006878A9788006870FE8780002014368460181204602F044FA0390002806D032462946204600F0C3FD0398E1E7384600F0F4FE074604A800903B4602AA21460196F9 -:407A0000284600F02FFC094BB200A178D218FF208854684600893B46C2B2A078314605F047FBE1E75C210008F0210008C5210008F8B518480026009027E000253046FFF718 -:407A400083FB07001ED01448D022016A3046504385300C5C12E0601CFBF75AF8CCB23846E040C007C00F07D02146304603F0CCF821463046FFF712FC6D1CEDB20748818A82 -:407A8000A942E8D8761C0098F6B20078B042D4D8F8BD0000CC1E00085C210008F021000810B5FEF729F90020FFF768FE04F054FFFAF74EFF032803D1FEF7D8F9FEF716FA47 -:407AC0000FF0C6FC09F06EFB002010BDF8B5002400F04CF90125012800D1012406F0F0FE012801D1022004430F4E1049002004270A78336A0FE0D021414359180979002943 -:407B000007D001290BD002290BD0082181402143CCB2401CC0B28242EDD87470F8BD2C43F7E73C43F5E700005C210008CC1E0008F8B5FF2069461E4E0870F07B0024C009D1 -:407B400035D01C4D15E0D020316A60430F188320C05D01280BD102236A46FF21384602F0DAF901280ED04420C05D01280AD0641CE4B22878A042E6D8F07B4006400EF0730D -:407B8000002410E04520C05D00280FD10121384600F0D4FC0AE0D020316A6043081800F092FC641CE4B22878A042F4D80020F8BD5C210008CC1E000810B5FFF787FF10BD53 -:407BC000F8B500252C460B4E0EE049682C20604308180122694607F005FE0006000E01D0054D05E0641CE4B2B1680878A042ECD82846F8BDCC010008FFFF0000F8B5002535 -:407C00002C460C4E0FE04068E100091B401801226946FFF779FB69460870002801D0064D05E0641CE4B2F0680178A142EBD82846F8BD0000CC010008FFFF000010B5084C54 -:407C4000FDF754FE052809D02078012806D1FDF74DFE052802D020780028F1D110BD0000CC01000810B5FDF741FE012803D0FDF73DFE0228F7D110BDF8B504468079254681 -:407C8000603517460E46002806D0687FFDF79CFF0020A071FF206877A671002E09D0687FFF2806D12046A178024B3A467D30FDF727FFF8BD7992001010B5827904468A431E -:407CC00082716034607FFF2803D0FDF77DFFFF20607710BD30B50D4C022061690C4B8AB29978002901D0022906D11D785B78EB18282B01D9032002E0032900D10120510516 -:407D0000490DC0020143616130BD0000C0113C40BA21000800B500F031F8002807D0012805D0032801D0042801D0002000BD012000BD000002460448806901040020C90C12 -:407D4000114200D00120704700103C40014600B50020C90701D000F009F800BD014600B50020C90701D000F001F800BD0248006AC005C00F7047000000103C4004488069EE -:407D800080B2410501D5042070474007800F704700103C4038B50446000610D5FFF7EEFF01280CD1684603F033F86846007800F0E3FB012002F0E8FD0220FFF7FDFE034860 -:407DC000006801692046884738BD0000EC01000810B5034A0178117004F084FF002010BDBA21000870B50446FFF7C0FF002801D00C2070BDA27B01212848002A827801D025 -:407E00000A4301E05208520082706279012A0AD0C17849084900C1702079214E012806D0042804D00AE0C2780A43C270F4E70622E11D301DFCF75DFBA079B072194D28681E -:407E40000168204688472079012808D06188208806F0A2FB2080207904280CD013E02868C168E01D88470021E01D04F0A3FF0120C002208007E02868C168E01D8847002129 -:407E8000E01D04F097FF2079B070204604F038FFB07A05F0EBF8002070BD00005C210008BA210008EC01000808B50178FFF75EFF814201D10C2008BD002927D00720694640 -:407EC0000870FFF75BFF012801D0042808D11A49887A091D02F0FAF8FF2801D00B2008BDFFF718FF01280BD10121684600F092F8012801D0092008BD6846007804F09EF870 -:407F0000FFF7E8FE04F030FF012011E0FFF702FF012806D1684602F07BFF6846007800F087FB04F017FFFFF721FF0028FBD10220FFF742FE002008BDBA21000810B5034A41 -:407F40000178517004F0EEFF002010BDBA21000838B5002168460FF035F9002801D01F2038BD01210098C90201804180002505714571857107214173857304F0C1FE009CCF -:407F8000202200212046FCF7BDFA25702A460021601CFCF7B7FA204604F0A4FE204604F0C1FF00980FF098F90B2200210248FCF7A9FA002038BD0000BA21000810B5044695 -:407FC0000748844209D8204601F0C6F8002804D00089A04201D1012010BD002010BD0000FF0E0000074A9179491C8906890E917138220A4092014907090E114308430249E5 -:40800000084070475C210008FF0E0000C006C00E70470000F3B5174B0E4618781649401C164AC4B281B000200978126A10E0A14200D80024A14201D8002502E0D025654368 -:4080400055192F79002F07D0401C641CC0B2E4B28142ECD80020FEBD1C700021204601F04FFE2E712046FFF7BDFF2881019804700120FEBDE0010008CC1E00085C210008A4 -:4080800010B507F0D9F80222002100F003F804F08BFB10BD10B5094B40074907000F090F185A595A40185043C0086421FAF730FD002800D1012080B210BD0000C846001033 -:4080C000F7B54120405C88B015460C46002802D02878042802D200200BB0F0BD6946087200262046FFF794F8012800D00126204603A93C300191009023460327217F38333B -:408100003246606A07F058F902A8089900900B46019120463A4603A9283006F0E5FF06006846007A287002D1204600F0C1FA204601F0D2FD3046CFE7FFB587B00C460546AF -:408140001078694608724120005D1746002829D000262046FFF75CF8012800D00126204603A93C30019100902346217F38333246606A07F021F902A80090291D019120463D -:408180002B1D03A928300A9A06F0AEFF05006846007A388005D1204601F09EFD204600F087FA28460BB0F0BDFFB50C464020415C25468035107889B0164600290BD06946DF -:4081C0000873C0B2002814D000272046FFF720F8012810D010E0002100910190A078099B129A0C9903F038F80120E87100200DB0F0BD1F20FBE7012703200890204604A964 -:408200003C30019100902346617F38333A46206A07F0D2F8A0780C9902F066FF0F4A0999801803AA01900B4600920291204604A92830089A06F0A5FF02466846007B30701E -:408240000120E8710C99064DA3788900491912985854204601F04AFD1046C8E700103C40C5210008FFB506464020405C89B015460C46002810D0084601F0F2FD01280BD0F7 -:40828000288869468883002813D000272046FEF7BFFF01280FD00FE02878002100910190A078331DFF22139902F0D6FF00200DB0F0BD0220FBE70127204603A93C3001916D -:4082C00000902346617F38333A46206A07F074F8A078139902F008FF00900C4A009912988918029007AA009201912046331D03A928300C9A06F045FF02466846808B28809C -:40830000204601F0F3FC1046D1E7000000103C4070B5054680350446E9784030002908D0012905D10179042902D14078002808D070BD01790C29F8D00D29F9D1287800287E -:40834000F6D0A078FEF700FF2979C840C007C00FEED0A07802F058FC2979A078FEF79EFF70BD000010B518490446484028D0002101231A468A40904221D0491C2029F8D3BB -:4083800000212046C840C243520618D0400616D0491C1929F5D3A0B2210C020AC3B2884201D193420BD01F21204600F01BFA182805D8A00E062100F015FA022801D2002049 -:4083C00010BD012010BD0000D6BE898E70B50D460446FEF71DFF01280AD0E87AA97A00020143A07802F0E0FE012808D0002070BD00222421204606F03CF8242070BD28218F -:408400005A200155204600F037FD282070BD000008490978814201D8002004E00649D022096A504308188030C079012800D0002070470000CC1E00085C210008014610B558 -:40844000002049070FD5094A0021146A084A137807E0D0224A43A2181279022A04D0491CC9B28B42F5D810BD012010BD5C210008CC1E0008014610B5002049070FD5094ACF -:408480000021146A084A137807E0D0224A43A2181279022A04D0491CC9B28B42F5D810BD012010BD5C210008CC1E000810B5044601468034E06A002804D089780EF02AFF71 -:4084C0000020E06210BD38B50546002000902846FEF79EFE01282BD1284601F0B6FC002826D028792C46C01E4034030002F0FCF90705051B1B051B201B00284601F0B6FC10 -:40850000012810D0284605F09BF900280BD0284605F0A0F9012806D0A97868460EF068FE002803D105E06079002801D10120607138BD2846009905F0EDFD38BD4030417172 -:40854000704740308171704770B50546403528790C46052904D0002C05D1801E022802D8022006F003F82C7170BD017170479200101880304161704770B53C2502F0AAF8CA -:40858000040004D020460021473002F007FD0023FF222946204600F05BFD002C02D0A07802F00EF870BD000010B50B490978814201D8002404E00949D022096A50430C18A7 -:4085C00020217F200155002C05D020890BF0B4FC204600F06DF810BDCC1E00085C21000870B505460F480078A84201D8002404E00D48016AD02068430C18002C11D02079C2 -:4086000007280ED1204600F0BAF8204605F0E0FF0A21484302462046044B29467F30FDF76FFA70BDCC1E00085C2100089DA0001010B502F04FF8002802D0807801F0C0FF2B -:4086400010BD38B5044600206946087001236A46FF21204601F018FC054601236A46FF21204601F058FC2843012812D0214640318A79002A02D1087901280CD048790128A8 -:408680000DD0022A0FD0E079400602D5204605F04BFF002038BD204601F0C2FEF9E72046FFF711FFF5E7204600F028F8F1E7000010B50446408A00280DD00748F521807AD8 -:4086C0000840C00607D5204605F082FF82B2618AA07803F0BFFF10BDAC1E000810B50023054C0B60A48A944205D992001018803042690A60436110BDF0210008FEB506469F -:40870000002000900190A8208559B17868460EF06FFD002801D00720FEBD0098374660370290344678884034608238882082E08BA082304605F035FFA88CE18B884207D158 -:40874000288A3988884203D1688A7988884203D0F07920210843F071688A7880288A3880A88CE083FEF766FBA083E08BFEF772FBE0763046029905F009FD0198FEBD38B52E -:40878000044600200090A07900280FD14420005D052801D00E2809D1A17868460EF028FD002803D12046009905F034FE38BD10B501F054FE002010BD70B50C4605460146D0 -:4087C000204605F025F8002805D0A17828460EF095FD232070BD0D2070BD002800D102207047704770B500231A46491E0CE00446D440E507ED0F541C0646E640F407E40F89 -:40880000A54200D05B1C521C8A42F0D3D8B270BD30B50021124C0A46A05C002308E0C50701D0491CC9B201290AD840085B1CDBB20028F4D1012903D8521CD2B2052AEBD3F5 -:4088400002290BD207488118C87B0122082B03D29A400243D0B200E01043C87330BD0000A02100085C2100087FB504468034E16A05460E46183108226846FBF73AFE314672 -:408880002031082202A8FBF734FE102168460EF033FCE06A102108300EF02EFCE06A2B46083028331022694606F056FC7FBD10B504460821FFF700FA10212046FFF7FCF92B -:4088C0002079052822D0062820D008281DD1218900200BF07DFA072020712046FEF798FC012819D00E212046FFF72EFE002180200155204601F06EFE2046FFF7D7FD204668 -:40890000FFF7D6FE2046FFF79CFE10BD2089012200210BF041FADEE70521E4E7FFB581B01F4604460821FFF7C7F910212046FFF7C3F92079082803D0092804D0042503E068 -:408940000425012601E009250026204601F074FA00212046FFF7F8FD25712046FFF7A6FD0398002E02D0012808D00BE001280AD12089002202990BF00FFA04E02189029889 -:408980000BF026FA0127002180200155012F07D0204601F01FFE2046FFF753FE05B0F0BD5A2102980855204605F090FD054605480121428A2046FFF75FF9002DEED109202A -:4089C0002071EBE7AC1E000870B50C460546FEF71FFC012809D108212846FFF76DF90023012221462846FFF799FF70BD10B5044601F022FA2046FFF759FD00212046FFF759 -:408A0000A3FD10BD70B505461A24FEF701FC012809D108212846FFF74FF90023012221462846FFF77BFF70BD38B5044600200090A17868460EF0DCFB002801D00D2038BDFB -:408A40002046009D01F0A4FB2946204605F05CFC05480821428A2046FFF70EF906212046FFF772FD002038BDAC1E0008F8B50446002000900E46A17868460EF0B9FB002827 -:408A800001D00D20F8BD204604213830009D0EF010F9AC200059082118300EF00AF9012E02D1204601F074FB2946204605F0B0FB05480821428A2046FFF7DEF8022120469B -:408AC000FFF742FD0020F8BDAC1E000810B50446FFF7CAFE03212046FFF736FD204601F0C9FE10BD10B50021FFF7C0FF10BD000038B5044600200090A17868460EF078FBA8 -:408B0000002811D12046009A01F096F91146204605F005FC05480821428A2046FFF7ACF807212046FFF710FD38BD0000AC1E000838B5044600200090A17868460EF058FB5F -:408B4000002810D12046009905F0B5FC06480821428A2046FFF790F804212046FFF7F4FC204601F087FE38BDAC1E000810B5FFF79EFE10BDF8B50446002000900E46A178D4 -:408B800068460EF035FB002801D00D20F8BDAC20005908212030009D0EF08BF8204604213C300EF086F8002E02D1204601F0F0FA2946204605F053FB0E480821428A2046C4 -:408BC000FFF75AF8204601F08AFD00280AD0204600F026F8002803D009212046FFF7B4FC0020F8BD08212046FFF7AEFC204601F041FEF5E7AC1E000810B54421095C0829A0 -:408C000006D0092908D00A2901D100F09BF810BD0B21FFF799FC10BD00F002F810BD000070B504460079052805D0062803D0082811D00C2070BD03220621204605F019FCB3 -:408C40000F480821428A2046FFF716F811212046FFF77AFC12E006215A200155204605F035FC05466220025B0A20424301212046FFF702F8002D01D109202071002070BD6E -:408C8000AC1E000838B5044600200090A17868460EF0AEFA002801D00D2038BD2046009D00F074FA08202071204601F071FA2946204605F034FB0021412001550F21204630 -:408CC000FFF742FC204601F0D5FD002038BD10B5024601F0B1F810211046FFF735FC10BD10B50446FEF794FA012809D04420005D112805D100231A4606212046FFF70EFE6A -:408D000010BD10B5FFF7D3FD10BD000038B5044600200090A17868460EF06AFA00280DD12046009905F0C7FB05480821428A2046FEF7A2FF0D212046FFF706FC38BD000083 -:408D4000AC1E000838B5044600200090A17868460EF04EFA002801D00D2038BD2046009905F09EFB05480821428A2046FEF784FF0C212046FFF7E8FB002038BDAC1E000812 -:408D8000007870477CB536490978814201D8002404E03449D022096A50430C18002C5DD0204601F052F8002858D0207903280CD005280CD06220015BA07804F0D7F82646FE -:408DC0004036B079012805D030E0042000E0062020712BE00021204604F069FD25468035A86A002804D0A1780EF094FA0020A8620020B071E87801280CD02046C030417B6A -:408E00007D22114041732046FFF71BFC2079072805D007E02046C030417B7E22F1E72046FFF746FC0221204601F03EFD0E48407BC00713D02079042810D120896946088079 -:408E40006034207A88702089000AC870A07A08716089000A487168460BF028FA7CBD0000CC1E00085C210008A021000810B55A22115400F05DF810BD10B50446FF21FEF782 -:408E80001BFF09202071A07804F0B2F810BD000010B512490978814201D8002404E01049D022096A50430C18002C15D0204600F0DDFF002810D10B480068C169204688473B -:408EC000E07EC00608D4BC20005D012804D10648006801682046884710BD0000CC1E00085C210008FC0100080802000810B504468079002809D022215A200155FF212046EA -:408F0000FEF7DAFE204600F013F810BD10B5037902464032002B03D09176092B02D003E0002100E02221917600F002F810BD0000FEB5044600890027009027812079254662 -:408F4000803500282FD001282DD002282BD0002005F00CFB0AE002AA01A9204604F044FC002808D1A17801980EF0C8F9204604F067FC0028EFD0FF212046FEF79DFE204642 -:408F8000FDF798FE3049AF70887B002804D0401E0006000E887306D1F9F7C0FC2A4840304770F9F7A5FC26466036B07FFCF70CFEA86A002803D0A1780EF0ACF9AF62E86A1C -:408FC000002803D0A1780EF0A5F9EF6225464035A97E002934D0009800F0B6F8F07FFCF7F3FD2046FFF74CF8A07802F0C1F8204602F0ACFEA0780AF0E1F8E87B02F0B8FB5C -:40900000A87BFF26FF2805D0104909680A6C00219047AE73EE73A07801F0D2FA0B20FEF7CBFD01F02DF9F9F793FC032807D10648807B002803D1FF20F530FCF735FFFEBD71 -:409040001F21A976C7E700005C210008EC010008FFB583B01E461746054606F0D7F804006AD020460C303146009001F079FF2046062200211830FBF745FA2046062200218A -:409080001230FBF73FFA2D48224600683946836A284698470190049820702846FEF7B8F8012148402E4640366070002D11D028896080F07920710498002811D16879607120 -:4090C000F08BE08028466030018821814088608109E01B488069C005C00F2071002060800498022824D02846062248300099FBF700FAFF2F11D0114801210068026C38463E -:40910000904710482C220068416838465043021D8A180A30085C114601E02079009903F075FD0546FF2801D003F034F8B773F573204601990AF0CFFD07B0F0BDEC0100084F -:4091400000103C40D40100080A4610B5014600200AF00AFF10BD000000B50146FEF756FF084A1278824201D8002004E0064AD023126A58431018002802D002898A4200D0D4 -:40918000002000BDCC1E00085C21000838B504468034E16A002907D1817868460EF03AF8002801D10098E062E06A38BD10B5014600F056FE012803D08878FEF733F810BD01 -:4091C0000348026A8878D02148438430105C10BD5C21000870B5054604468035A879012811D10948A178026AD02048438430165C3046FEF76DFB002805D10220A871A07894 -:40920000314603F0BFF970BD5C2100080EB500220A216B460292198100905A811046029B00990EF04CF90EBD70B5104DA87A00281AD00F4C217FFF2916D0608B01F036F89D -:40924000012811D10020A872401E6083FF20207701F0EAFD044601F021FF010002D0204600F0D8FBFEF7E4FB70BD0000A02100085C2100087047000070B5104AC0B2117803 -:40928000491E11700E490978814201D8002404E00C49D022096A50430C18A07900280BD025466035687FFF2806D02046FFF71EFE0020A071FF20687770BD00007A01000882 -:4092C000CC1E00085C2100087047490510B5490F0B0001F009FB060704080C0C0F073E21FFF7C4FD10BD0821FFF710FE10BDFFF71FFE10BDFFF7FAFD10BD0000F8B52B48F7 -:40930000002500904DE0A84201D8002604E02848016AD02068430E18F9F700FB30464030C48A078B0021C1820183F9F7E1FA304600F08BFD012831D1A00702D52846FFF783 -:4093400021FDE00602D52846FFF7A2FDA00602D52846FFF75BFF600609D5F9F7DFFA1449002040314870F9F7C3FA00F005FF200602D5284600F020F8600702D5284600F071 -:4093800043FCE00703D021463046FFF79EFFF80704D00849B0780968496988476D1C0098EDB20078A842AED8F8BD0000CC1E00085C2100080802000805490978814201D8B5 -:4093C000002070470349D022096A504308187047CC1E00085C21000810B50446054800680168204688470448006801692046884710BD0000FC01000808020008F8B5054673 -:40940000FF20694608702888FFF7A6FE040035D000F01BFD002831D0207909282ED002236A460021204600F076FD012828D02046FDF7EEFE0646E07920210843E07120468C -:4094400004F052FA002823D0294601F005FA02236A46FF21204600F017FD01281AD04620005D00281BD02325E079DF210840E0712946204604F08FFB2846F8BD0220F8BD63 -:4094800068460078012801D02A20F8BD2320F8BD0720F8BD02204034A0710020F8BD002E05D02046FFF72AF90500DDD1E4E70C20F8BD000070B50E460C2501F0EDF80400D8 -:4094C00013D00025228929460A480AF073F80123FF2202212046FFF7BBFDA07801F0F2FB2046FFF725FD022000E000203070284670BD00000E200000F8B5044601F0CCF86C -:40950000002801D00C20F8BD6079A11D00F0DEFDFF2801D00B20F8BD02216846FEF77AFD012859D13248017868460078814201D8002504E02F49D022096A50430D18002D07 -:409540004AD000212846FEF7FFFF2E46002040367071B0712848002100684268284690470620FEF729FB2F46208A60373880E289A189A87809F0A4FCF083608A78800420E7 -:40958000F0760320B0831B4806228778A11D2430FAF7AFFF2079012820D06079F0710121A01D03F007FCFB20074012488770217E012918D0C278FB210A40C2700F482146FF -:4095C0000068826828469047A978204603F0C2F82846FFF7ECF8F8BD0920F8BD0020F07104200743E1E7C17804221143C170E5E7CC1E00085C21000808020008EC010008E0 -:4096000070B5164602461B480D460078D0211A4B5143904201D8002401E0186A4418002C26D0204600F01CFC012809D1186A8431405C1146FEF74CF9002801D104F07AFE5E -:409640000E483146006882692046904700280CD0204680308178A94201D3491B00E000218170208929460AF0F4FB204601F002F970BD0000CC1E00085C210008FC01000869 -:4096800070B505460088FFF767FD040014D000F0DCFB002810D02079092822D0A97825464035A976204604F011FF0646A879012804D06220025B02E0022070BD6A8A0A20C3 -:4096C000424301212046FEF7D7FA01F055FB8021204602F059FD01F06BFB002E01D109202071002070BD0EB5002218216B460292198100905A810120029B00990DF0DFFE10 -:409700000EBD0000F8B5194E0025B07A002824D101F0C4FC26E001F0BBFC1549401801680068CCB287B22146384600F0BFFD012814D010480121478304774577B1720E49AE -:409740000978A14201D8002003E0006AD0214C430019002801D001F08DF8F8BD01F09EFC6D1CEDB20028D6D1F8BD0000A021000800103C405C210008CC1E000810B5044670 -:40978000C0060FD50C4900200B6A0C490A7807E0D021414359180979022909D0401CC0B28242F5D806480068C1692046884710BD00F050F8F6E700005C210008CC1E00081E -:4097C000EC01000810B50088FFF7C6FC040007D04420005D082805D00B2803D00C2010BD022010BD2046FFF71BFA002803D009212046FEF7A9FE002010BD70B50546008863 -:40980000FFF7AAFC040008D0264640363079082805D00B2803D00C2070BD022070BDAC20005910220830A91CFAF763FE2046FFF71BF83079082804D02046FFF783FA0028AF -:4098400003D00A212046FEF77FFE204601F012F8002070BD70B51E491E4D0978814201D8002403E0D0212A6A414354182179022904D0002901D003F0BBFB70BD01228321A4 -:409880000A5501F03FFC032020710820FEF794F900212046FEF758FE0121204601F004F8204647300121064601F078FB0A480068416A304688470246012300212046FFF736 -:4098C000C7FBA078FFF788FDA87B401CA87370BDCC1E00085C210008EC01000810B50C46002121700088FFF737FC03000BD000F0ACFA002807D00948F521807A0840C00684 -:4099000003D4112010BD022010BD022020705A8A188900210AF044FB002010BDAC1E000870B50088FFF718FC040008D000F08DFA002804D0E079C10903D0002070BD0220A8 -:4099400070BDC1068025002908DA2843E07108480221428A2046FEF78FF9EEE7204600F053FC0028ECD1E1792943E17170BD0000AC1E0008F8B50F46002569460D702E4628 -:409980000088FFF7E9FB040010D000F05EFA00280CD0E079410638D4E17E4A0708D48A074021002A1BDA0843E0712EE00220F8BD05F02CFC067021894180E1898180A17EC3 -:4099C0004170218A0546C180022038702978104809F002FF28460AF087FA0020F8BD0843E07102236A460C21204600F04DFA00280BD102236A46FF21204600F08CFA0028CC -:409A000003D1204604F090FD05462846F8BD00001D0400003EB500220F236C460292238100910190628169460EC900200DF047FD3EBD0000F8B50F46054600F04BFE04003A -:409A400052D0032020710026832006552046E6703146473001F0A2FA05F0EEFB25464035EA8B6179FEF716FB1030FF2281B249321346204604F094FD0920FEF79DF8A07884 -:409A800001F05CFB0021204600F00EFF00212046FEF75AFD6E710023AE713A4619462046FFF7D6FA1248002100684268204690471048817B491C8173A078FFF78DFC00F0DD -:409AC000EBFD040007D00B480021243003F072F9204600F0C3FCF8F73BFF032803D14034E08BFCF725FAF8BD284603F081FAF8BD080200085C210008F8B50446FF206946AD -:409B0000087000262088FFF727FB05001AD0FDF77FFB002812D02948807AC00710D0284600F093F900280DD0287903280CD004280AD0072808D0092836D103E00C20F8BDAE -:409B40001120F8BD0220F8BD4420405D01282BD02846FFF71BFB070028D00822211DFAF7C8FC3846A1782030017261881022090A417221460C311838FAF7BBFC02236A46C1 -:409B8000FF21284600F0C7F9012811D002236A460521284600F078F9012809D0284600F03FFC06463046F8BD0D20F8BD0720F8BD01212846FEF7C8FCF4E70000AC1E0008CD -:409BC00010B50E4AC0B21178491E11700C490978814201D8002404E00A49D022096A50430C18208B102108432083A07803F000FA08212046FFF78AF910BD00007A01000855 -:409C0000CC1E00085C21000810B517490978814201D8002404E01549D022096A50430C18002C1AD020464030417902290BD1002141718320005D012810D02046C030417B4E -:409C40007D2211404173207E0021C207D20FA07803F078FA2046FEF7F4FC10BD2046C030417B7E22EDE70000CC1E00085C21000870B505460E460088FFF76EFA04000BD0BC -:409C800000F0E3F8002807D01248F521807A0840C00603D4112070BD022070BD6020005B5E21095B401C48430004C10C6888884201D2122070BD60822079072802D1204699 -:409CC000FEF7F6FC02203070208900210AF090F9002070BDAC1E0008416A491C416204D1017F491C4906490E01777047016A491C016204D1417F491C4906490E41777047CB -:409D0000F3B506463D4881B00078B04201D8002404E03B48016AD02070430C18002C05D0FBF7FEFA807AC00702D00EE00220FEBD2546C0352F68F8F7F1FDD02200212046E3 -:409D4000FAF7E0FB2F60F8F7D3FD2E480299006882682046904705004DD1A6700026E676267131462046FEF7EFFB204600F064F8204603F05FFD244F6782862006551F48F0 -:409D8000F5212038807A084000D00120A07526830298002805D020462021C030FBF7A2FA85B2C020005920220021FAF7ABFB4C20A664065320464030C671FF21C1738173FA -:409DC0000122603042750275C27582754276027603228276C27606774277002022186032401CC0B251770328F8D305484030C07820736034E780E8B2FEBD0000CC1E000857 -:409E00005C210008FC010008FFFF000010B50020074B084AFF2119541418401CC0B221740428F8D31F2119541018017410BD0000A02100085C2100080021416201770162FA -:409E4000417740300170417070470079002805D0012803D0022801D0012070470020704780308079002800D00120704740300079002807D0012805D0052803D00E2801D05F -:409E80000120704700207047F0B5002405461470C07E0126C006002803DA0124142900D116702846FFF7E2FF002803D00124052900D11670E87E470708D480070ED5012469 -:409EC0000C290BD11670E87E400707D5E87E800704D4012B01D10C2905D001248320405D012802D008E00024F8E7A879800703D50124082900D11670012B02D1092900D1FB -:409F000000242046F0BD10B5807803F035FB002800D0012010BDFFB581B0019F04980026403714460D46022810D17879012803D1012D00D120700126B879022800D10126B7 -:409F4000019803F087FC012800D1012600232370797980208122022908D1012D02D0002D02D002E0227000E020700126B979012908D10126002D02D0012D02D002E02270E9 -:409F800000E020700198A030017F032902D0042908D003E0162D11D101262670007F022804D00BE0162D09D1002607E00126182D03D0162D01D0172D00D12270049802282E -:409FC00006D12078C00702D00120207000E02370304605B0F0BD000010B5084A1278824201D8002004E0064AD023126A584310184030C173084602F0CDF810BDCC1E000831 -:40A000005C210008F8B500240F4D104E17E0A04201D8002103E0D020316A604309180846FFF713FF002808D00F464037F87BFF2803D001F09DFBFF20F873641CE4B22878B3 -:40A04000A042E4D8F8BD0000CC1E00085C210008F8B5064600240F4D18E0A04201D8002104E00D48016AD020604309180846FFF7ECFE002808D00F464037F87BB04203D13E -:40A0800001F076FBFF20F873641CE4B22878A042E3D8F8BDCC1E00085C21000810B50449C0B20A78521E0A70FEF77EFA10BD00007A01000810B50449C0B20A78521E0A7098 -:40A0C000FEF78EFA10BD00007A010008F3B50024C70781B0134EFF0F1FE0A04201D8002504E01148016AD02060430D182846FFF7ACFE00280FD02946062248310298FAF76A -:40A10000E9F9002807D14035E879C007C00F874201D12046FEBD641CE4B23078A042DCD8FF20FEBDCC1E00085C21000830B50446FF281BD000210E4B0E4D14E0884201D8C3 -:40A14000002203E0D0202A6A484312181046FFF77CFE002805D04032907BA04201D1012030BD491CC9B218788842E7D8002030BDCC1E00085C21000810B500F055FE0446D0 -:40A1800000F08CFF010002D02046FFF743FC10BD70B5054604468035A879002827D1FF20E075174BA078D0225043196A85300A5CD026521CD2B20A54A078196A7043114E35 -:40A1C0008530768AB24201D300220A54A078D02250430246196A85328E5C84300E54A1783046FDF775FB002802D00120A87170BD0220A871A078314602F0C4F970BD000049 -:40A200005C210008F02100087CB50446FF206A46002110700191014602232046FFF77BFE01280FD002236A4608212046FFF72CFE012807D0A17801A80CF0DAFF002809D09E -:40A2400007207CBD68460078002801D023207CBD2A207CBD2046019DFCF7DAFF00280BD02946204604F016F804480221428A2046FDF702FD00207CBD11207CBDAC1E00088D -:40A2800070B50024074E084D07E0D020316A60430818FEF7D6F9641CE4B22878A042F4D8002070BD5C210008CC1E0008F0B50F46810785B0890F0291000A6946888055484A -:40A2C0000078B84201D8002404E05348016AD02078430C18002C26D000F0DAFE06466846808800280BD00298012840D002283ED0032809D04120005D01286ED085E047481F -:40A3000030180068608180E000200290A17802A80CF046FF002807D04120005D012877D12046FFF7D9FC73E06846029D82882946304602F095FF394830180068608120468A -:40A34000FDF7E6FF01AA21462846FDF7B9FE002807D0384600F0C0FCA17828460CF0B0FF28E0EF772946204603F094FC4DE00020009020890390A17868460CF0FFFE0028B7 -:40A3800002D0002005B0F0BD6846009D8288291D304602F065FF2148301800686081384600F09AFC2046FDF7B3FF8020005D00280FD106E03D205A2108552046FEF75CFD04 -:40A3C00026E001AA21462846029BFDF7B5FE002804D028460CF06AFFECE713E00298FEF700FA01460398287003980901000A0843687068468088A870000AE8702846FFF795 -:40A4000072F905E02046FFF767FC384600F064FC0120B7E7CC1E00085C21000800103C4070B501790546032904D0042904D0072908D109E0052400E006240121FEF716FB45 -:40A44000002805D00D2070BD0824FEF7EDFAF7E7284600F00FFA2C71002070BDF0B587B0054604F0D3FE044604F0C9FE019004F0BCFE009004F0CEFE029004F0DDFE0690D7 -:40A480000098207000982F46000A607000984037000C0590A07000982E46000EE070F87E20710198607101986036000AA07101984149000C0490E071387F2072B88B0522E1 -:40A4C000000A6072B87FA072F88B000AE072307820733088000A6073B078A0737088000AE073204610300391FAF703F80020E870A878039902F0C8FD0020687106980299B5 -:40A500004001084300216175A075000AE07504E0F98B288849004018288000F0A5FC2988042200F05FFE0128F2D023481038417C027C090211433182C17C827C0902114389 -:40A540007182007DB0820298307600983081059870810198B0810498F0811848298801601821204602F0A6F87088F98BC000F8F7CFFA124980B28860012183204155A878C6 -:40A5800000F07EFBB188A87802F0F8FBF98BA878042208F02BFAF8F71DFA0446A87808F0E7FC06494031086200F07CFB2046F8F715FA07B0F0BD00006C21000800123C4046 -:40A5C00010B50021FFF79CFB002801D0002010BD012010BDFEB50546803001908079002839D0AE780096D021294C4E433746206A8437C05D0099FDF780F9012828D0226A66 -:40A600002046D15D491CCCB22249498AA14200D80024019B002199713346FF218533D154026A8636D1550021006A0B4681550A46009802F0C7FAE97DFF2904D0284603F0EB -:40A6400064F8FF20E87503F075FE0026114F1AE0019803218171FEBD00200090224669462846FEF73BF80099002904D0FF231A462846FDF750F9641C788AE4B2A04200D8C0 -:40A680000024761CF6B2788AB042E5D8FEBD00005C210008F021000800B5022000F002F800BD000030B5044608480021036A0848027807E0D020484318180579A54204D012 -:40A6C000491CC9B28A42F5D8002030BD5C210008CC1E000800B50120FFF7E4FF00BD10B5044604F093FD218901808034E16A4160E16A2831816009F085FB10BDF7B50746CF -:40A700000C460879897882B0092807D0F9772046FFF7A6FB4D4E012806D00FE038460CF0EDFD022005B0F0BDA178D0204843326A8430105CFDF7CCF8012824D0A078FDF7FC -:40A7400067FE01281FD03D780121384603F0CCFC2046FEF72BFD0190A17802F07FFF002818D0204681213A4AC0300C2D3ED023DC26464036002D26D0012D27D0062D33D07D -:40A780000B2D4BD128E06846027C21463846FEF713F8C7E7A078D0225043316A85300A5C002A01D12B4A927C521E0A54A17838460CF0A4FD0720B5E7122D24D0142D25D07E -:40A7C000162D2BD104E00122B27101E002227271427B0A43427321E02046FCF719FD01281CD10020307019E00120FBE7E07E400704D4528A04212046FDF73EFAE07E022176 -:40A800000843E0760AE0528A102104E0E07EC00604D5528A40212046FDF72EFA009504AA21463846019BFDF7BFFC69460A7CA0780323019902F03CFCA0780199FCF70CFA8B -:40A84000A17838460CF05AFD00206BE75C210008AC1E0008F02100088A8802804A884280CA8882800A89C2808A890281498941817047000010B50246803293790021002BC3 -:40A8800003D19278002A00D00121064A927A002A00D000210279092A00D10121807802F085FC10BDA021000870B50C460546FCF7AFFC00280BD1012C06D92879092806D06D -:40A8C0002846FFF720FB0446002C02D004E0012402E0287EC007FAD1287E2146C207D20FA87802F02FFC70BD30B47446641E2578641CAB4200D21D46635D5B00E31830BCEC -:40A90000184700000B4B01280BD002280BD004280BD008280CD10748803002630548A83005E0202002E0382000E05020C01801607047000000103C400149886070470000A8 -:40A9400000103C4010B50446FF20F130012C04D0022C05D0042C08D105E0FF20D53004E0FF20D93001E0FF20DD30002202F074FD03490869034A80B2A0431080086110BD63 -:40A9800000103C40E2010008034A1169034B89B2814319801161704700103C40E2010008034A1169034B89B2014319801161704700103C40E2010008F8B5244F14243A680C -:40A9C000054665432C46936813341B5DF1269B0036019B191E4E9B1900931E68B6B2760876001E602C2306465E43002909D190685168035D301D08181649FF22C96902F027 -:40AA000007FB3868A91D80688022035D40181149896A02F0FDFA38680E498068096A035D4019202202F0F4FA38680A4980680C35035D4019496A402202F0EAFA3868012187 -:40AA40004068805B084300990860F8BDD401000800103C40F0210008F8B505460120A84086B214460F46012231467C2002F0F4FC3A463146782002F0EFFC607826780002EC -:40AA80000643E078A27800020243607923790002034307480C2180694D430649401944182660001D44182260001D40180360F8BDF021000800103C40401880B270470000EA -:40AAC00030B5124BCC061B7849095B0701255B0F640E0902ED02012B10D0022B0ED0032B01D0042B09D18007800FD2072843120E0243144306482143816230BD044321439D -:40AB0000D001084303492843886030BDF021000800F13D4080143C4010B5234A12785207520F012A29D0022A27D0032A01D0042A22D1421C13461C78007822465C782402D5 -:40AB400022439C78DB78240422431B061A431202164C0243A260481C024613780978184653781B0218439378D2781B0418431206104300020843E06010BD4278037812020B -:40AB800013430B4A1361C37880781B021843506148780B78000203439361C878897800020143D16110BD0000F021000800F13D4000143C400B4A12785207520F012A09D061 -:40ABC000022A07D0032A01D0042A02D1064A106051607047054A83B21360000C5060916070470000F021000800F13D4000143C40044A002180180268491C89B21029FAD3A2 -:40AC00007047000000103C4010B50C4602F08CFC01494018046010BD00103C40704770B50C46054600F018F821462846FFF7ECFF70BD0000002310B5F121064A09011846D3 -:40AC40008C182360091D401CC0B289B21028F7D310BD000000103C4070B50C46054602F069FC0549054A097D694309190902214389B28018016070BDF021000800103C40A4 -:40AC800010B504490863FF20012220211D3002F0E3FB10BD80103C400149086070470000C0103C4000B50549012088600449442008600420FFF774FE00BD000040123C40AD -:40ACC00000103C400349086302494520803908607047000080103C40054AD1687C2389B2994380000843D06002494D200860704740123C4000103C4070470000054B19688B -:40AD00000722920289B2002801D0114300E0914319607047001F3C4010B5094800784007400F012808D0022806D0032801D0042801D10DF067FA10BD02495420086010BD11 -:40AD4000F021000800103C4010B5094800784007400F012808D0022806D0032801D0042801D10DF057FA10BD02495320086010BDF021000800103C4000B503490888488003 -:40AD8000FFF702FE00BD0000E201000810B5F7F7A7FD012802D10320FAF756FD0120FBF72BFF02495020086010BD000000103C4000B502484088FFF7F3FD00BDE20100082D -:40ADC00010B5FAF779FD10BD03490868012280B2D203104308607047001F3C40884201D8081A03E00022D243101A401880B27047884201D9401A00E0081A044980B28842D4 -:40AE000003D901210904081A80B27047FF7F000000210170704710B50B4602460021F820FAF760FB10BD00000148006BC0B2704780103C4010B50A490978814201D8002443 -:40AE400004E00849D022096A50430C18F7F766FDC0342068C48BF7F74BFD204610BD0000CC1E00085C2100080148806880B27047C0103C400148406880B2704740503D4038 -:40AE800000280DD00C4A90690870000A4870D0698870000AC870106A0871000A48717047064A10680870000A487050688870000AC8709068F0E7000040103C40C0113C4048 -:40AEC00000B5024A00F004F800BD0000FF7F000000B51346FFF782FF984201D8022800D2002000BD0148006980B27047001A3C400148406A80B2704700103C40014840698E -:40AF000080B2704740103C400148006880B2704700503D400148C06B80B2704700103C40F8B50646002402F0EFFA0546304602F023FB064609480021878A0BE001208840A0 -:40AF4000034602462B403240134301D02043C4B2491CC9B28F42F1D82046F8BDF0210008002910D00B4B196B8AB2596B9B6B89B20270120A42708170090A9BB2C17003715B -:40AF8000190A41717047044B996A8AB2D96A1B6B89B2EDE700123C4040103C40012905D0054989690904C90F017070470249403189688907C90FF7E700103C40FFB581B095 -:40AFC00000242D4B2D4D0B9E002805D0022803D003283ED006281DD1A86B2F4684B2A004850E2007000F012802D0252D1AD916E00C2D14D106230021F820FAF773FA0623DB -:40B000000021F820029AFAF76DFA002E01D0B86B1DE0002304980480184605B0F0BDFFF7D3FEF9E706230021F820FAF75BFA062DEFD30A98002806D0AD1F0246ABB200214B -:40B04000F820FAF74FFAB86B002E80B2E1D03080DFE7A86B84B2A004800E0C28DFD106230021F820FAF73EFA06230021F820029AFAF738FAA86BCCE7FFFF0000C0103C40B9 -:40B08000024800684005C00F70470000001F3C400148C06870470000F02100080248806A8006800E7047000000543D40084910B58000084B4218D9687C2489B2A1430843D9 -:40B0C000D8600548101800688006800E10BD00003044010040123C4000103C400148406880B27047001A3C4010B5054B1A8A9C8A5443444398684A432018801810BD0000F4 -:40B10000F021000870B50B4908630B49D024444325460B6AFF2285355A5523460D6A8433EA54096A002286340A550123114601F049FD70BD80103C405C21000870B50B4A6C -:40B14000D02141430D46146AFF23853563550C46156A84342B55126A00238631535400220123114601F02EFD70BD00005C21000870B50B4AD02141430D46146AFF238535E8 -:40B1800063550C46156A84342B55126A00238631535402F0C3F90349C98D02F07BF870BD5C210008AC1E000870B50D460B490978814201D8002404E00949D022096A50435D -:40B1C0000C18F7F7ABFBC0342068C48BF7F790FB02222946204600F005F870BDCC1E00085C21000810B50023884201D8081A03E00024E443201A4018044980B2884201D83A -:40B20000824200D90123184610BD0000FF7F0000024840680006C00F70470000C0103C4070B55478157824022543D47888232602947834435679127936023243002900D02C -:40B2400098230449086303488038181805604460826070BD80103C40FFB581B015460E4607460A9CFFF740FF002C0AD022460B9B049902F021F90549B0004018C55505B066 -:40B28000F0BD0B9A049902F0FDF8F4E7C5210008F8B59C469308394D002403E0A600AF598751641C9C42F9D39207920F4B1C002A06D0012A15D0022A27D0032A39D13EE05F -:40B2C0001D7809782A465D782D022A439D78DB782D042A431B061A4312020A43A100425027E0A600AD590C78CB7822464C781B06240222438C78240422431A431202EBB24E -:40B300001A438251C978301812E0A200AB584C780D7824062D042C431D042D0E2D022C43DBB21C438450CB788C7819022143101841606046012801D1FFF7EEFCF8BDA40087 -:40B340002A59097815022D0E09062D04294315042D0E2D022943D2B2114301511A461B78194653781B0219439378D2781B041943120611430902090A2018D9E750F13D400C -:40B3800070B50C4D2A785407640F012C08D0022C06D0032C01D0042C01D100F00FF870BD02460B46044CA888082121620021FAF71FF970BDF021000880143C40F0B52B4A11 -:40B3C00008232A4E503A5363546B9C435463820703D000238F08BF001DE08C08002203E09300C558F550521CA242F9D3A30014E0C218521C144625782A4665782D022A43D8 -:40B40000A578E4782D042A4324062243C45C12022243F2501B1D9F42EAD88A0724D089070022890F012904D0022904D0032917D107E0C25C14E0C018417800780A0202437D -:40B440000EE0C01801460A7810464A78120210438A78C97812041043090608430202120A0248103818180261F0BD000050F13D4070B51A4909784907490F012921D0022911 -:40B480001FD0032901D004291AD10446FFF75CFC134D00216018401C02461378184653781B0218439378D2781B04184312061043625C000210434A191061091D1029E9D3EB -:40B4C00070BD212504466D01FFF73EFC1023224600212846FAF78CF870BD0000F021000800F13D40154909784907490F012918D0022916D0032901D0042911D1411C0A463B -:40B5000013780078194653781B0219439378D2781B0419431206114309020143084801627047417802780902064B0A439A63C178807809020843D86370470000F021000805 -:40B5400000F13D4040143C4008B5094A127D4243521812020A4380210A4369460A8001F0E9FF69460988034A8018016008BD0000F021000800103C40FEB5044600266846DD -:40B580000680868006810125A078FBF7DDFD0746A078FFF7C5FC0743A078FFF787FD0743A07802AB01AA694600F020FA3146264660363177002F55D12079092852D06846F3 -:40B5C000808800284ED0204602F03AF9002849D0684681882046C030002909D00168CA79022A05D0CA7AD30902D05206520ECA720068817A002905D0C17AC90902D1217EAF -:40B60000890600D50025214640318A79012A06D04979022903D0BC21095D02290CD1718BC08BFFF7DBFB69468988C91C884202D30D49884200D9002568468088002811D066 -:40B64000012D0FD10421204600F0B0FD01203077684681880422204600F0CAFD208B082188432083FEBD0000FF7F0000F8B5044680782521C001C9024018394940184069BB -:40B6800086B2F7F74BF9FFF7C3FD002864D0207E000761D420466030017F01295CD146210B5D00252146C0312A46012B07D1438B0868C08B834251D0401C83424ED0294888 -:40B6C00003689BB200938368FFF7CEFB5F06264B03D5009D2D1AED18ADB20F687988814201D2401A05E0814209D93F888F4206D2081AC01882B21D48824200D900221B4848 -:40B70000854229D8D00700D0521C50083146F7F7FFF907464800301A4004010C0A2901D9012300E00223581C704340000A30A84212D81021204600F039FDF81881B210226A -:40B74000204600F055FD204600F08EFC00F01EFC208B082108432083F7F7CAF8F8BD000000103C4000503D4000000100FF7F0000FF2806D0034B196A012289B28240914376 -:40B7800019627047801F3C4030B513490A680146C0310B689A80037902464032022B13D00B6800241B88958B6D00EB181B190C689BB223809279012A05D160304088096847 -:40B7C00000011818888330BD044B5B6A93830B6803249B88E7E7000080503D4040123C40F0B585B0002704460546C03403972068252201880291A978D202C90189182E466D -:40B8000040360191B17901297ED044494A68828088682168802208822068022781880291C17A1143C17203F007FDF28B6979FCF731FC0146284660300090C18203F0FCFCF0 -:40B84000B18BC9198AB26979FCF724FCB179344A012921685FD00B8AD31A1B18D833CB8103992F4B0918F07E5843081821688881B08B410002980818C01987B22068591EAA -:40B88000078020680290C089884210D9491CF7F73FF90299381A088027682149F889F7F737F9F9812068022901D20221C181B07901282BD1009920684988028809015118B1 -:40B8C000818300980321C08A09030005000D8843A035297D8907C90F09030143687D8007C00F42030A430F4901984018C26221688989C16320680B49028A0198403140185F -:40B9000042602168C98900E002E0C16005B0F0BD8089039087E7CB891B18A0E780503D407102000000103C40F8B52F4DAA6AEB6B92B29CB28378E606F60EB34214D12A4E7F -:40B94000034689074036C03300290EDA002160300177186801884180F06819680880A00602D41968A009C881F8BD1968CC8B641CCC83696A1C68A183E96A1C685704A18007 -:40B9800011061C68890FE17191041C68890EA1711968FF0FCC7AD20B3C43CC7219688A728321095C002910D11968002A07D10A884A80F1681A681180696B1A68D181296BBA -:40B9C0001A681182A96B1A68918119688A7A002A06D000224A830022042100F0BFFCF8BD4A8B521CF6E7000000503D4010B52524C001E4020019044C001944690C80816928 -:40BA00001180C069188010BD00103C402522C001D2028018024A8018406908807047000000103C403EB5044600F06EFD684606F0D5F9684600780022022836D26846817864 -:40BA40001B4803781B48994201D3002103E0D025036A6943591821604078430706D4800707D514482030007E800702D060318A8015E00A4660326846D388808883420DD9E2 -:40BA800083235B5C002B07D1C0310968C9890C2902D8012800D9401E908000E093800298002801D000F0F8FC3EBD22603EBD0000CC1E00085C21000802488068C006C00ED4 -:40BAC0007047000000503D4008B5034680786946FFF79CFFFFF7C8F9C0331968801C0988401A01210904401880B24910884207D2694609884900F7F70BF8401CC0B208BD10 -:40BB0000012008BD2522C001D2028018024A8018806908807047000000103C40F8B5054604464034A0792F462E466037C03601282AD13068798BC08BFFF750F92D49884244 -:40BB400005D2032803D24021284600F01DFBA079012819D13168788BC98B884214D18320405D0028284613D0FFF70EFE2021284600F00AFB284600F03DF9284600F0CEFA33 -:40BB8000E08A82210843E082607902280ED019E0FFF726FE4021284600F0F6FAF6F7D8FE0328E7D1E08BFAF7C3F9E3E73168788BC98B884206D1284600F006F9E08A042123 -:40BBC0000843E082BC20405D022811D13168788BC98B88420CD108480068416A284688471021284600F0D0FA208B012108432083F8BD0000FFFF000008020008F3B506460F -:40BC00000446C036306881B0818B0088FFF7E6F821792546204F4035032919D91921C902884215D9FFF720F93168898BFFF748F9717900290CD1002820D081004018C20831 -:40BC40002046A178154B7E30F9F75AFF012070718320005D00281DD1207903281AD90E4B0299703330685943AF238289DB00C91A8A420FD9A979012909D103E0E88A38430F -:40BC8000E882E3E76034C08B618B884202D0E88A3843E882FEBD000001020000C19B0010F8B582782523D201DB02D51876220446125AC03420684A43C1898918C1812068D0 -:40BCC00081898918818126682721F0890901884211D94F1C3946F6F71BFF3188081A308026683946F089F6F713FFF1812068022901D20221C1812068024980896918C863A4 -:40BD0000F8BD000000103C402521C001C90242180D4800211018016041608160C160016141618161C161016241628162C162016341638163C16304484030101801604160EA -:40BD40008160C1607047000000103C40F8B50446FFF712F88320A178005D06F039F91649086882B28868254680B246060023C035002E1CDAC006A478C00EA04217D1FFF7BE -:40BD800073F8101A01221204801880B201280ED90124CC60C8688007FCD56846FFF742FE0098002801D000F015F92C7100E02B71FEF7FEFFF8BD000000503D4010B500F04D -:40BDC000A3FB06F06DF910BD81782522C901D20289186030064A038A89180B62428A4A628A6A808A92B2120A120210438862704700103C4081782522C901D20289185E2219 -:40BE0000135A074A89184B610246603213888B615288CA61C0300068808B48637047000000103C4081782522C901D20289180A4A8918CA6A032392B21B039A43A030837D63 -:40BE4000C07D9B07DB0F1B038007C00F134340031843C8627047000000103C40F0B581782522C901D2028B1801466031244A0C899A1814604C8954608C89946004464034AD -:40BE8000E67ECD8936023543D560E48B54610C8894614C88D4610C8A14624C8A54620D7E46792D028C8A760335432543ACB294628324134E245C40360025C030002C0CD03E -:40BEC000D56200689B19808818600E4B0A2018628888106355639563F0BDCC8A03272405240D3F03BC43D4620468A489D4630468278A9C1967600768FF89E760E1E70000D2 -:40BF000000103C4000543D4030B581782522C901D2028C181C4962181368014660310B8153684B8193688B81D368DDB2CD811D0A03464033DD7615699D835569DD839369EB -:40BF40009BB20B80D5694D80156A0D82556A4D82926A92B2D5B28D82D504ED0E520B0D764271002B01D000220A770749403161180A68C03003689A804A6803681A82C9685B -:40BF80000068C18130BD000000103C4008B510490122086883B2886840060FD5FEF764FF181A01231B04C01880B201280ED90120C860C8688007FCD5002A07D06846FFF709 -:40BFC00031FD0098002801D000F004F808BD000000503D4070B581782522C901D2028B18144A9168490604D50121D160D1688907FCD50146C0310C46096809881160642170 -:40C000000D4D095A5B191963014680310B46C97800290CD000215160DB7881785B014024234319439160807806F0A2F870BD2168C989F0E700503D4000103C40044A1168AC -:40C04000FF23F13389B29943000101431160704740503D4003490869012280B21203104308617047001E3C40FEB5044680786946254648708035E8780870062027468870D6 -:40C08000C03738680088088102A9684606F08CF8002838D10520694688701E480126807A800603D5286B017E807A01E01B210846EA78002A00D102262246A032137D012B31 -:40C0C00022D089003C313B68527D9C890919012A1DD080003C30FF302D300F4F08183946F6F716FD801985B26846858060003946F6F70EFD401CA84201D96946888001A937 -:40C10000684606F051F8FEBDC9007031DBE7C0007030E0E7AC1E0008710200001CB581786A4651708321095C1170042191704030C08B908001A9684606F036F81CBD10B5EF -:40C1400086B081786C466175014680310A46C97821750821A17500212181A1725E231B5AA3810223E381D278A274012222700191C02109580988218280786075214605A833 -:40C1800006F012F806B010BD10B5807805F0F8FF10BD0000FF2806D0034B196A012282400A4390B218627047801F3C40C030026810290ED09179D18201680A884A800168FC -:40C1C000CA8B0A830168CA894A820068818981827047518AD18101688A8A8A8101684A880A8001688A7D8A710068018BC1837047F7B5064680780D46252288B0C101D2027D -:40C200008918039106AB05AA01A9FFF7EFFB3446C034374620686037798BC08BFEF7DEFD03462068798BC08B401980B2FEF7D6FD01460A98082828D1304640308279012A25 -:40C2400023D1444A914220D993421ED2002B1CD02268B97E927F891AC9B20091C08B029068466A1A8088049050430299F6F73AFD00994018401C85B202984200681A4243AF -:40C28000049840004843101803E0684680884000684321680A8810180880206800908179387E684308182521F6F732FC009881710A98082809D02068C18B4919C183803647 -:40C2C000F078254E00280DD033E03079032803D12068418B491941832A460821304600F03DF8ECE72168F88ACA8968431218CA8121688A891018888125682721E889090187 -:40C30000884211D94F1C3946F6F702FC2988081A288025683946E889F6F7FAFBE9812068022901D20221C1812068818903988019C1632068C17980798A07D20FC9079200CC -:40C34000090F1143000208430399891988630BB0F0BD0000FF7F000000103C40FEB50F460446002069460880888016460881A07801AB02AAFFF73AFB254620460123C0354E -:40C3800040302179042F02D003294AD053E0092902D0032908D030E0217EC9062DD4C18A01221943920226E029688A7A012A1AD18A8B002A10D1A2782526D201F602961960 -:40C3C000264A926862273F5B3F01BA1892B28A832249C03971184A63C18A02221143C1822179032909D12968498B062905D3C18AFF22194301321143C1822046FFF78EFB2A -:40C40000684601882046FFF7F9FB8320005D002806D168460089002802D02046FFF7ACF8FEBD2968498B062905D3C18AFF22194301321143C182002708E02868C18B491C3C -:40C44000C1832046FFF76AFB7F1CBFB2B742F4D3684601882046FFF7D1FBFEBDC0103C40F1B50B4F0025386A84B20A48406986B202E0A01984B20125012221460098FEF747 -:40C48000B1FE0128F5D0002D00D03C62F8BD000040123C40C0133C40F8B5002405F0F0FC0546174E174F27E0E80722D03078A04201D8002003E0D020396A60430818FFF710 -:40C4C00003FB01463078A04201D8002003E0D0203A6A604310180822FFF78AFE3078A04201D8002003E0D020396A60430818FFF7BBFD6D08641CE4B2002DD5D1F8BD00000D -:40C50000CC1E00085C210008FEB5684605F0E6FC68460078002830D00024184D184E29E0C00722D02878A04201D8002003E0D020316A60430818FFF7C7FA01462878A04221 -:40C5400001D8002003E0D020326A604310180822FFF74EFE2878A04201D8002003E0D020316A60430818FFF77FFD01984008641CE4B2019001980028D2D1FEBDCC1E000865 -:40C580005C21000810B50C4600F0C8FF06494018016889B20A091201FF21224301310A43C9008A43026010BD00103C4070B526490446097800204907490F40250346012963 -:40C5C0000FD002290DD0032901D0042924D100201E4E0146012C24D0032C1ED0052C25D122E000211A4E0A46012C08D0032C02D0052C09D106E0B56002210A2204E00421BE -:40C600000C2201E004210D223461306AC0B204460C42FAD03262336170BDB56202200A2104E004200C2101E004200D21F462726B14460442FBD07163706B0821884370635F -:40C64000F362D0B270BD0000F021000800F13D4080143C40F8B505460D48164600780F46A84201D8002404E00A48016AD02068430C187F20005DF9F7A7FABA1B0A20424351 -:40C680002046054B29467F30F9F73AFAF8BD0000CC1E00085C210008B5A00010044A106303488030816102494B2080390860704780103C40024610B50B460F20002180018A -:40C6C000F8F796FF10BD000013B50C46002269460F20F9F70FF869460978E0030843034980B208630249472008601CBD40113C4000103C407FB50E4604461D46002202A943 -:40C700000E20F8F7F7FF1048F10100780F4A4007400F03280BD0042809D0A00208436946097A084380B21063A009906307E0E80301436846007A014388B21063946304490C -:40C74000462008607FBD0000F021000840113C4000103C40017E012901D9012101764279C9B253000B430179CA001A4310210A4303498A6002880A604088486070470000DA -:40C7800040103C4006490978814201D8002004E00449D022096A50430818603043837047CC1E00085C2100080349884200D908460249486270470000FF0F000040113C4090 -:40C7C0000148806B80B27047C0103C402521C001C902401807494118086A1070000A5070486A9070000AD070886AC0B21071000A5071704700103C4070B50E4D14462A78D6 -:40C800005207520F012A09D0022A07D0032A01D0042A02D1224600F00FF870BD02460B46E8880021F8F7CCFE012CF6D1FEF774FA70BD0000F0210008F8B594461B4F8207B2 -:40C8400005D01A4F0023103F8E08B60015E08C08002303E09D007E5946515B1CA342F9D3A3000CE0DA191469C454240AC5186C70240A220AAC70EA701B1D9E42F2D88A07B9 -:40C880000DD00A4A103A9A18146900228907890F03E09D184455240A521C9142F9D86046012801D1FEF738FAF8BD000050F13D4010B5114909784907490F01290FD002295C -:40C8C0000DD0032901D0042908D10C49496A0170090A4170090A8170090AC17010BD084A11680170090A417051688170090AC170FEF712FA10BD0000F021000800F13D40C3 -:40C9000080143C400148806B80B27047C0103C4010B50A49F1240A681421414393681331595C24018B001B19102906D251682C225043085A02495918086010BDD401000873 -:40C9400000103C400121814010B589B200227C2000F082FD10BD0000FEB5FF210120FDF7F1FF3F210220FDF7EDFF1F210420FDF7E9FFFF210820FDF7E5FF3020FEF704F873 -:40C980007D48802101607D4C20784007400F032801D0042803D10BF03BFD0BF01FFC7748774E00784007400F022806D0032804D0042802D0012807D00BE00321316003281A -:40C9C00005D0042803D004E00020306001E00BF02FFC002211460320F8F78CFE69486A49028D4A61428D8A61828DCA610546624F00242035803709E03C636248818E62480A -:40CA000001632046FEF7B4FB641CE4B22878A042F2D85D480621C03881635A4C5A48218F816320460C30029000F0B0F9062268460299F7F75EFD69464879C02108436946D0 -:40CA40004871684600F0DAF900F0B0F8FFF702FB4A4800784007400F032829D0042827D0E08FB8634748444940304088C0314860E08D0121C903084343490862434901205A -:40CA8000086141498031C8683F2280B212029043072212021043C8603F20FDF781FF374C20784007400F022804D0012802D008E04820D6E7FEF748F9354907208861FEF72D -:40CAC0002BF9E020FEF794F8E820FEF791F8F020FEF78EF80020FBF7D3FA2C490020486110228A618915F96227494031C86022485B21016020784007400F032801D00428A7 -:40CB000001D10BF095FB20784007400F022806D0032804D0042802D001280AD00BE01D4830601D490869012280B252031043086101E01A4830601448C038416B0122114303 -:40CB400089B24163816B114389B2816314494015086014482978006805F0FEF906F00CFB00231846FFF7D0F85B1CDBB2042BF8D30D4900204870FEBD00103C40F021000844 -:40CB8000001F3C40AC1E0008C0113C40001A3C4080143C4003200000001E3C40E023000040503D40D00100089C21000804480021C1638163024974204039086070470000BE -:40CBC00040103C4070B51E4614460D4600F0A6FC0C49411808680122D20280B2012E09D0904300090001FF22284301329043002C04D005E01043044A1040F2E710221043AF -:40CC0000086070BD00103C40FFF90000F3B5254A84B0926900924A780B78120213430393CA788B78120213434A790979FF20120211438C461C499E46CA6B92B20292896B27 -:40CC4000742289B20191184940390A60174900220F7F24E00121144B9140009C403BE3181C6889B2A5B21C681B68A4B2039E9BB26E407546654064462E435C4026430CD129 -:40CC8000029B194209D00199D140CB070499DB0F8B4202D1104606B0F0BD521CD2B29742D8D8F8E7F021000840103C40CC1E000830B50A49FF20C96B094A8CB200210125B2 -:40CCC000137F05E02A468A40224204D0491CC9B28B42F7D830BD084630BD000040103C40CC1E000810B50446E020FDF781FF20782246401CC3B20021E020F8F711FC10BDAB -:40CD000042790021012A02D901214171090342790A430179042914D049001143827B032A01D8D2001143427B52010A43817909021143012252031143054A91610088D0615C -:40CD4000704711460122920211430222E5E7000000103C4000B50120FDF716FE01494120086000BD00103C4000B50120FDF718FE01494020086000BD00103C40024A1063EA -:40CD800001488030C160704780103C404178027809020A4306490A60C2788378120213434B604279007912021043886070470000C0113C404278130202781A4301290CD0D5 -:40CDC0000C498A62C278837812021343CB6242790079120210430863704707490A63C2788378120213434B6342790079120210438863704740103C4000123C404178027895 -:40CE000009020A4306498A61C278837812021343CB61427900791202104308627047000040103C404178027809020A4306494A60C2788378120213438B60427900791202B7 -:40CE40001043C86070470000001F3C40F0B50021FF2501350E4E0F4C15E0F1238A001B01D21893191A6892B2D7070AD0520852001A60884201D12A4300E0AA4301273A43AA -:40CE80001A60491CC9B2E27A8A42E6D8F0BD000000103C407C21000810B500222021302000F0DAFA05494320086001F009FDC007FBD10220FDF768FD10BD000000103C40A1 -:40CEC00030B591B0054640216846FDF7A4FF0A4C0849A1630220FDF763FD6A782021302000F0BAFA4220206001F0EAFCC007FBD011B030BDFFFF000000103C40017942792B -:40CF0000490011438279D2000A43FF2101310A4303490A6302888A624088C8627047000000103C4010B50446E820FDF761FE20782246401CC3B20021E820F8F7F1FA10BD2C -:40CF40004178027809020A430749CA63C17882780902054B0A4340331A60417900790902084358607047000000123C40024A1063014880304160704780103C40094810B529 -:40CF800081420DD8C8000521F5F7C2FD064989680818064980B2486003497220C039086010BD0000409C0000C0103C40001A3C4010B5074948200860064C206B4006FCD405 -:40CFC000002211461020F8F795FB606B80B210BD00103C4040113C400349732008600349042048637047000000103C4000113C4010B500F093FA0121490200F04BF910BD04 -:40D0000010B500F08BFA0121890200F043F910BDF0B515460F4604461E46FF2A04D000222946184600F0D6F86078237800020343E078A17800020143607922790002024336 -:40D040000C207043C419084827183B60241D23181960241D20180260FF2D04D001222946304600F0B7F8F0BD00103C40012808D8044A916901235B0299434002084380B2AD -:40D080009061704700103C40084A106348780B78000203439360C8788B7800020343D36048790979000201431161704780103C40F8B51C4615460E46074600F041FAA9009E -:40D0C000044A2143801801600349B0004018C455F8BD000000103C40D92100080149C86070470000C0103C40044A916B8905890D8002084380B290637047000080103C403D -:40D1000010B50E490B68142141439A681331515CF122890012018918094A89180A6892B2D40709D0520852000A605A682C235843105A01221043086010BD0000D401000852 -:40D1400000103C4038B5174B1B78834201D8002304E0154BD0241B6A60431B182024012906D0022904D0002A05D0002903D005E0188B204301E0188BA0431883187E8006A6 -:40D180000ED58320C05C00280AD198786946FEF7B9FC68460088002802D01846FEF766FA38BD0000CC1E00085C21000810B50C4600F0B4F90649401801688AB240218A43E4 -:40D1C000A10111430122D2029143016010BD000000103C40F12380001B01C018054BC3181868002A80B201D0084300E0884318607047000000103C4070470000F0B5174BE5 -:40D200008C07C318002C03D000209508AD0014E09408002003E01D6886008D51401CA042F9D3A0000BE01C680C54240A0E187470240AB470240AF470001D8542F3D89407BC -:40D240000AD01C6800239207920F03E0C5184C55240A5B1C9A42F9D8F0BD000000103C40134610B50A4A12785207520F012A09D0022A07D0032A01D0042A02D11A46FFF7F5 -:40D28000BDFF10BD0A460021F8F72CF910BD0000F0210008034A8018026892B20A4302607047000000103C40F0B5264BC518880703D000239708BF001DE09408002003E083 -:40D2C0008300CE58EE50401CA042F9D3A30014E0C818401C044626783046667836023043A678E4783604304324062043CC5C00022043E8501B1D9F42EAD8900721D092070E -:40D300000020920F012A04D0022A04D0032A17D107E0C85C14E0C81841780278080210430EE0C81801460A7810464A78120210438A78C97812041043090608430002000A81 -:40D34000E850F0BD00103C40F0B5424C00198C0704D000249D08AD00AC461DE09D08002403E0A6008F598751641CAC42F9D3AC0014E00D196D1C2E4637783D4677783F02B3 -:40D380003D43B778F6783F043D43360635430E5D2D0235430551241DA445EAD89B079B0F551C002B22D0012B31D0022B40D0032B1BD112780B5D1206134309198A784978E2 -:40D3C000120409020A43134303512B78EA7819466B7812061B021943AB781B04194311430902090A0019401C0160F0BD2B462D78127829465D782D0229439D78DB782D0492 -:40D4000029431B061943090211430151F0BD1678D578334656782D06360233439678095D360433432B431B020B430351D178D9E755780B5D2D062B431578091949782D04D1 -:40D4400009020D432B430351D178927809021143C8E7000000103C4070B5094BC5182868002384B2080003D104E040085B1C9BB2C607FAD08C439A40224390B2286070BDFB -:40D4800000103C40134610B50A4A12785207520F012A09D0022A07D0032A01D0042A02D11A46FFF701FF10BD0A460021F8F7A0F810BD0000F021000838B514460C4A1278FC -:40D4C0005207520F012A0BD0022A09D0032A01D0042A04D11B1F9BB22246FFF735FF38BD00930A4623460021F8F79CF838BD0000F0210008034A80008018405C8007800F43 -:40D5000070470000D921000800B500F00DF802494018006880B200BD00103C40014900014018704708420100014900014018704704420100A121000149024018704700009F -:40D54000034A928A424350180249800040187047F021000800410100054B02469B8AFF208B4203D9880003494018805C70470000F0210008C521000800B5FFF7DBFF024905 -:40D580004018006880B200BD00103C40F0B5304902460B680020002B14D10A6052070D26520F0024B601012A0DD0092503276D02FF020423022A1BD0032A2FD0042A2DD090 -:40D5C00012200C60F0BD112292018A80CA80032252028A600122D202CA6040220A8205224A828A82CC610C624C628E618C62F0BD8D80CD8001225203CF608A6012110A82E8 -:40D600004B828B82D2008E61CA61832252010A62432292014A628922520116E08D80CD800522D202CF608A60FF2201320A824B8229228B82D2028A61064ACA61054AC0323A -:40D640000A62054A4A62044AC0328A62F0BD0000F0210008C0480100404A010010B503460C460846FFF788FF02462046FFF74CFF012199400A4001400A4301D0002010BD12 -:40D68000012010BD0A4600B501461046FFF764FF00BD000010B50F4801680F480818846AFF2102310C4202D0F8F750F80DE0406B400F022801D1A00607D5FAF72BF9074867 -:40D6C0000069012180B201F071FA20460AF0E0FA10BD00006801000840F03D4000103C40F8B50446002000900E461546A178684609F07EFD002801D00720F8BD2B46324611 -:40D700002046009900F0A8FEF8BD38B50546002000900C46A978684609F06AFD002804D1009928464C7000F0F2FE38BDF8B5044600206A46107005460846FBF721FB0600AD -:40D7400004D0012806D0162E3AD10DE001236A46002102E001236A4619462046FCF7DBFB0546012804D02BE001236A461621F4E78320005D012811D1CD20005DC0070DD02F -:40D7800068460078C1090DD1C00701D0232200E02A2231462046FFF7A3FF11E068460078C0090DD068460078C10720464030002901D0232100E02A2181762046FBF75CFB8D -:40D7C0002846F8BD10B582790A4201D0FAF774FA10BD10B5044680780021FFF7CFFA01212046FDF761F810BD8030C368002B0AD00B60817A11700169C160C17A81720021D3 -:40D80000016108467047014870470000FFFF00008030C368002B04D00369002B04D004487047C160827201E00161C27200207047FFFF000000218030C160016170470000CF -:40D840008030C068002801D00020704700487047FFFF000070B505468035E8680024002806D0FBF78DFA002801D0012800D101242869002806D0FBF783FA002801D00128BB -:40D8800000D10124204670BD70B50446C0790E461546C1090AD04006400EE07101F0B6FC067021894180856006F0F1FA70BD70B50446C0790D46810601D43A2D13D13A2D7F -:40D8C00002D0DF210840E07101F0A0FC0570218941805E21095B818060342188C1806188018106F0CBF970BD38B54621095C04468034002910D1A16A00290DD18178684622 -:40D9000009F088FC002807D100980021A062C181A06A4185A06A4180A06A38BD01480078704700003C22000810B50446FCF798FA01280AD10648A178026AD020484384305B -:40D94000105CF9F7C5FF012801D000F0F3FC10BD5C21000870B50C460546F9F759FC012838D02879032803D0042801D0072830D1E079A67900020643A8783146FDF714FCFA -:40D9800001282DD0284660304683A17809020182627811430182217909024182E27811434182617981823246611C284600F09DFB02212846FAF7C2FD2846C030417B822282 -:40D9C00011434173287E0221C207D20FA878FFF7B9FB70BD01222421284600F04AFD70BD28215A2041552846FBF746FA70BD704770B50C460546FAF7E9FC00284FD120217D -:40DA00002846FAF759F9F4F789FF284661784030C176E17809028183A278114381836179C38B0A022179114320228B4203D0EB791343EB71C183E1792E460B02A179603611 -:40DA4000194333888B4203D0EB791343EB713180617A0B02217A1943738843828B4203D0EB791343EB717180C18B70888000F5F74FF8401E318880B2814200D93080012134 -:40DA80002846FAF75EFDC035687B822108436873E07AA17A000201437183F4F729FF70BD70470000F8B50D4606460027F9F7B0FB012845D0264CA07AC00707D04420805DAE -:40DAC000002806D0102803D01F212CE01A212AE001273046FBF75AFB002823D0344680340822691CE06AF6F704FDE06A697A20300172A97A4172E06A2946183008220B314A -:40DB0000F6F7F7FC29463046042213313830F6F7F0FC39463046FBF72DF8002810D1002F0FD012E007210322304600F0A2FC628A08213046FAF7A0F811213046FAF704FD61 -:40DB4000F8BD06213046FAF710FD01202070F8BDAC1E0008704770B50446403000790D46022813D126468036F06A08222030691CF6F7BFFC29462046042209313C30F6F7FC -:40DB8000B8FC2046FAF7A2FF0120307070BD10B5FBF732F810BD70B50E4605462021FAF78BF82C468034A06A002804D0A97809F0B1FB0020A06231462846FFF778FE00211E -:40DBC0002846FAF7BEFC2846FAF73BFD002070BD38B504460020009020790D46032803D0042801D007281CD12046F9F711FB012818D0A178684609F0FBFA002811D10C48B8 -:40DC00006A78807A00991040F5221040A075E07E08221043E076204600F05CFB2046FAF710FD38BD08222421204600F022FC38BDAC1E00087047000070B50D460446022126 -:40DC4000FAF73AF82046F9F7E3FA012805D009222421204600F00DFC70BD0C486978807A6A1C0840F5210840A075E07E08210843E076E079EF210840E07100212046FFF73D -:40DC800003FE2046FAF7DDFC70BD0000AC1E000870470000F3B581B004460298FBF770F805462046FCF7D1F800287DD0192D04D32046029900F0ABF976E0264640363079F1 -:40DCC000002700900300FCF70FFE0E1C1C1C08081C1C1C0808080808081C0298354A01780020135C8B4201D1012702E0401C0728F7D38320005D002801D1072901D0002F0F -:40DD000003D00098022816D02EE0A078FFF770F9002301223D212046FAF700FE3D20B0762046FFF756FDA178029809F0C9FA2046FBF7FEF8FEBDFFF7F1FD002814D1042D1E -:40DD400012D00D2D10D0112D0ED0152D0CD0072D0AD0092D08D0202217480299F6F7C9FB012000F003FC1FE020460299FFF7DEFC012819D0A8000F4D029908352A582046AE -:40DD80009047A178029809F09BFAFFF7C7FD0228D0D109480849007880002A5820469047002000F0E3FBFEBDA178029809F088FAFEBD0000D84600101C22000870B50D46EF -:40DDC00011490978814201D8002404E00F49D022096A50430C18002C15D0204600218030C1718079032802D12046FCF7F3FB2046FFF79AFD192D04D20549A80009582046AC -:40DE00008847FCF73DFA70BDCC1E00085C2100084447001010B50446403000790E2805D12046FAF72FFF01208034207010BD10B50446F9F7EDF9012802D1002040342070EA -:40DE400010BD10B5044640300179062905D00F2902D12046FAF73BFF10BD2046FAF748FE01208034207010BD70B50446054640342079072805D12846FBF7DEFF2846FAF738 -:40DE800031FE20790F2801D10020607070BD000038B5044600220E4800920D46807AF5210840C0060FD52046FBF7E0FF01280AD0A178684609F09CF9002803D12046009954 -:40DEC00000F0B4FA38BD2946204600F0A0F838BDAC1E000810B504461021F9F7EDFE2046FAF7E6FB10BD000070B5054610480C46807A400704D409782846FFF706FC70BD04 -:40DF00006078032803D1A1782846FAF75DFD6078122803D110212846F9F7CEFE60781628EDD10448A1780068C2682846904770BDAC1E00080802000810B5FAF7D1FE10BD84 -:40DF400010B54978FAF740FD10BD10B5FAF7C8FE10BD10B54421095C032901D1FAF7E8FD10BD012140304170704710B54421095C042904D00C2901D1FAF7C8FE10BDFAF7A1 -:40DF8000F5FD10BD10B50446F9F742F9014620464030012900D1417000790D2802D12046FAF7AFFE10BD70B502790D460446052A03D0062A01D0082A01D1FAF717FD687824 -:40DFC0005A21085509212046FAF7CFFAFCF7D4FE80212046FEF7D8F8FCF7EAFEA078FFF70FF82046FCF746FC70BD10B50446FF21F9F762FE16215A2001552046FAF798FF42 -:40E00000A078FEF7F5FF2046FCF734FC10BD70B50C460546FBF724FF002802D02078E87570BD21782846FFF770FB70BD70B5054648780C46032802D12846FAF7E3FC60786B -:40E04000122806D110212846F9F736FE2846FAF72FFB0748214600684268284690476078162804D10348006881682846884770BDFC01000808020008704770B50D460446B5 -:40E080000421F9F719FE6878A076E8780002E081A9780843E081687900022082297908432082E07E04210843E076800704D4204600F03AFA072815D0E079410612D5BF2112 -:40E0C0000840E07101F0A2F80021017021894180E1898180A17E4170218AC18005F004FFFCF7CEF870BD7047704770B50446C07815460A4600280AD00020E070C1B2A0783D -:40E10000FDF78EF8A0782946FEF7C8FA70BD0120F3E70000F8B5064601200C46087005221949601CF6F7E5F9B078FCF783FE0546B0786946FDF7E6FC684600880A214843CB -:40E14000114942191039887B002802D0401E4300C018101835460C30603568834A7C0B7C12021A432A82CA7C8B7C12021A436A82097DA982A071000AE07108223146204694 -:40E18000FCF7BCFAF8BD00006C2100087CB505468030866A0C46A878FCF74CFE014628465C30009001AB3246284600F031FAA878FCF740FE69468988FCF710FE69462846F4 -:40E1C0008988603041830021217029464031CA7E62700A7FA2708A8B120AE2708A7F2271C98B0C22090A61710178A1710188090AE1718178217240886946000A6072888885 -:40E20000A072000AE07229462046FCF777FA7CBD70B5054603200C4608702E4680360822601CF16AF6F765F9F06A08222030017A6172407AA072F16A204618310B30F6F70B -:40E2400058F929462046042238311330F6F751F9172229462046FCF751FA002070BD70B50546042008700C46AC20415908222031601CF6F73EF92946204604223C31093056 -:40E28000F6F737F90D2229462046FCF737FA002070BD000070B505460C46C07910210843E8710820207002460021601CF6F72AF90748F522817A11406170C07A0922C007A0 -:40E2C000C00FA07029462046FCF718FA002070BDAC1E000870B5054609200C46087008220021601CF6F70EF9A87D607005480922C07A2946C007C00FA0702046FCF7FEF91C -:40E30000002070BDAC1E00080B4610B501460A20187001221846FCF7F1F9002010BD0B4610B501460B20187001221846FCF7E6F9002010BDFEB50020694608720546334F4B -:40E3400060E03348016AD02068430E183046FFF777FA002854D18720805D002850D101AA69463046FFF740FA002849D100980478002C09D0012C16D00C2C23D0092C21D000 -:40E3800069460A79314629E0012302AA00213046FBF7C1FD012804D030460099FFF7F6FE2EE00C221FE0012302AA19463046FBF7B2FD012804D030460099FFF7ABFE1FE073 -:40E3C000082210E0012302AA21463046FBF75CFD00286846027906D131460098FCF78EF9022C05D00CE031460098FAF7E5F907E0B0780121FEF7DAFE09213046FAF7B5F851 -:40E400006D1CEDB23878A8429BD8FEBDCC1E00085C21000810B50B46122119708178D977014601221846FCF769F910BD10B50B46132119708178D9770649896AC90603D16F -:40E44000018B402211430183014601221846FCF755F910BD00113C4010B50C461121217062700146A37003222046FCF747F9002010BD38B50446002000900D46A1786846C1 -:40E4800008F0B6FE002801D0072038BD00980D210170457002222146FCF730F9002038BD0B4610B501460520187001221846FCF725F9002010BD0B4610B50146062018705F -:40E4C00001221846FCF71AF9002010BD38B5044600200090A178684608F08AFE002801D01F2038BD009D022028705A20005D6870A078E877208B1021084320832046FFF7AA -:40E5000068F9022221462846FCF7F8F838BD10B50B46072119708178D977014602221846FCF7ECF8002010BDF8B50546002000900D4EA9783488684608F05AFE002801D035 -:40E540000720F8BD00980C210170717941708470210AC170F2880271110A417106222946FCF7CCF80020F8BDAC1E0008094A1178002906D0012909D0022908D1002807D00E -:40E5800001E0012804D00021002900D0107070470121F9E73C22000800B500F016F800BD704770B50546FFF79FF9044602884188A87804F085FCA084E0886082A088208235 -:40E5C0006088E0812088A08170BD4018400870470246603000885E21895A401C4843C10800D101214008528A00E0401A8242FCD9704710B56021095A80780A01511A10311A -:40E600008CB2FCF717FC2146FCF756FA10BD0000FFB581B0054604464035288A69460A9F08801E46A078FDF76DFA694609880A20491C41431048807B002802D0401E420087 -:40E640008018081881B20298FCF736FA3080A07804F024FC06468320005D012804D1E98BA078042204F0C2F9A078314604F05CFD388005B0F0BD00005C210008F8B51546E8 -:40E680000E46074600F00EFA0446012804D02A463146384600F0B6F92046F8BD014600B50020890701D500F00BF900BD014600B50020890701D500F003F900BDF0B593B015 -:40E6C0000020FF210391059007901290012612A92F2005F008FD002804D000F097FD0446002600E0129CFEF76BF881040507890E40060891C00F891F2D0F06900491202949 -:40E7000031D2062D2FD800F0DBF8C0072BD03E2020700220A0700120E07003210420624F062D2DD0022D2ED0042D2ED025715E48417949084900417106986071A01D06216C -:40E74000FCF769FBFCF79CFC070006D0574A611D1268A01D126A904703900498012DC0B2029020D044E0002E02D0204605F0C2FC00F04CFD402102A8FCF74DFB13B0F0BDB4 -:40E7800002202071D3E72171D1E720717879C007CDD0002E02D0204605F0ACFC002600F035FD0446C3E70398FF280BD040482C220068416803985043095A4120884301D16A -:40E7C000012007903B48407E012804D10799002901D1012F02D0002F06D007E00120059020730D270B2006E00128F7D00020029020730D270220A0700898062824D0049812 -:40E800002746C1B20D373846FCF705FB0598012817D12948006B03A9C007C00FFCF730FBA07C8009012806D13946062203A8F5F751FE002805D10020203FF8770290022087 -:40E84000A07002980D30C7B2FEF75CF8694688806A4601A90620F6F74DFF69460878E0557F1E16486770407801280BD12A46A01D069900F017F9012811D02A46A01D0699EA -:40E8800000F0C0F8002E04D02046059905F018FC74E7054801224179114341716EE7204605F028FC6AE700005C210008EC010008D4010008A021000800103C407D2200089E -:40E8C0000248806B0004000E7047000000103C4010B50446000701D5FFF7F0FEE00601D5FFF7ECFE0248006881692046884710BDEC01000810B502460178FFF7E1FF814270 -:40E9000001D10C2010BD0D485378002443705470002908D000F06EF81046FEF7D1FA0420F9F74AF907E01046FEF7B6FA0520F9F743F903480476002010BD00007D22000801 -:40E940007C210008F8B50446FFF7BAFF002801D00C20F8BD6079164DFD2702260128E8781DD03840E87013480068416820468847A0790128A87814D03840A8702046FEF7D2 -:40E98000BDFA0B48218862882030914203D1017E0122114301762179012904D006E03043E0E73043E9E7017E314301760020F8BD5C210008EC01000838B5002001460090BE -:40E9C000684608F0FFFB002801D01F2038BD009C002161712171A1711021218020466180FEF78CFA204608F077FC00F003F8002038BD000002480021017007218170704706 -:40EA00007D220008F7B50C2082B0254D0F46002400902878E040C0072DD02148E10040380E18062230460299F5F754FD00280AD1B079B84207D1F079002801D0062802D167 -:40EA4000049804280BD02878E040C00713D0641CE4B2082CDDD300980C2803D00BE00420F07119E0A878401CC0B2A870082801D10020A870C4B20A48E10040380E180622D8 -:40EA800030460299F5F735FDB7710498F07128780121A14008432870002005B0F0BD00007D220008F7B5164E00243546403529780120A040014217D0E0008719B979019818 -:40EAC000814211D1062238460099F5F703FD00280AD1F879022810D004280ED001280CD0002807D0062805D0641CE4B2082CDED30020FEBD02980428FAD00120FEBD000075 -:40EB00003D22000801484078704700007D22000870B5064614460D46500702D5A8B2FAF72DFE200702D5B0B2FAF7E8FBA00702D5280CFFF7CDFEE00702D0300CF9F72AF99E -:40EB400070BD70B5044660C8F8F7C8FA2089C01F0300FBF7C9FE0C071A121E212412122712171312F3F7F4FE032801D1F7F76EF9294630466289FFF7CBFF70BD284604F054 -:40EB800063FD70BDFAF750FB70BD2846F8F74CFC70BDF8F74DFF70BDFAF76CFB70BDFAF793FB70BDE8B2FAF7ADFD70BDF3B5002189B0069105910C460391009101910291C7 -:40EBC000F74989688EB230400490B00618D5FCF74BF9F44908800120F6F7B2FEF24900200870F3F77DFE012802D10020F6F72CFE2020FBF7A1FE0420F7F75CF901200590EA -:40EC0000EA487107009024D5E5484030006987B20498400718D5F80613D5E5480021026A009800780BE0884201D8002502E0D0234B43D5182B79022B29D0491CC9B288426B -:40EC4000F1D8B80880000390394600220420FBF759FE300775D5D748406B80B20190D0488030806A87B2049800076BD5019804218843384367D0D048C06BC006C00E02906A -:40EC8000009801780298814211D8002515E02846FDF7E4F82846FCF777FD2846FDF74FFA40212846FDF770FAFDF770F9C9E7C048D022016A029850430D18002F05D02846C2 -:40ECC0004030C18A3C433943C18201988207B84801463C31403006910090002A3DDA2879002803D1C420405D002833D102212846FCF71AFE2846FDF7B7F907A90298FCF738 -:40ED000001FFA878012103F0A1F9002817D1FDF755F8002813D14620405D012807D1C0217A204959405BC98B401E884207D08320405D002808D16846808B002804D0012081 -:40ED400006E0ABE099E095E00698FCF76BFE0020009908700120F6F703FEF80657D52879002803D1C420405D00284DD104212846FCF7DAFDF3F7ECFD03280CD1C0204059BB -:40ED8000807A002810D18320405D00280CD101212846FCF785FFC0204059807A002803D18320405D00280DD000980078012809D0002810D17E480021C06B807803F046F9F9 -:40EDC000002808D02846FDF74FF90698FCF72AFE0099002008707648C06B002809D001216A465172017B1172FDF7F4F802A8F6F739FD28460A3009F015FA2846C0300179CC -:40EE0000002901D1012101710220F6F7A9FDF80705D07805400F022801D1F6F7A1FD28464030018B06912946C031CA88C08A824201D00443C880087B002805D1A035287F49 -:40EE4000012801D010208443600609D500984078002802D04020844302E0009801214170394600220820FBF74DFD544901980840504948633F2000028443019840070DD5EE -:40EE8000F6F71EFBF6F78CFF4A4904204863FCF7BFF9012802D10220F6F762FDB00719D53F48806B85B20498800709D50399280408430390FFF704FDC00701D00120059023 -:40EEC00081210398490488430390294600220220FBF718FDF0073AD03148006A85B20498C0072CD02804044329208001054206D033492846096849698847012864D005203E -:40EF000040068443A8071AD50220F6F729FD284F2037B87AC00712D0787B00280FD0387BF97A88420BD2274800688168387B14225043801D0818FDF775FF00207873812074 -:40EF400040048443294600220120FBF7DBFCF00605D50120F6F7F4FC1020FBF7EDFC700602D54020FBF7E8FC039806992043084301D00120059007206946088103980090B6 -:40EF80000194049848810598002807D069460EC90A98002850D0002008F04CFA0BB0F0BD00103C40E6010008CC010008CC1E00085C21000800113C4000503D40FBFF00006A -:40EFC000EC010008D4010008FBF784FB074600218030C170384640300090807BFF2808D138464830FBF7BCFF384600214730FBF7D5FF00983946C0794831FBF767F8FF2846 -:40F0000005D0292080058443FDF7AEFE7AE73846FCF77AFF3846FCF7E3FB3846FCF71EFF3846FDF78CF840213846FDF7ADF8FCF7ADFFFDF78FFE65E7002008F040FAADE7DE -:40F04000F0B587B0054605A81E461746019100900C9C04AB06AA02A903A800F0CFF92846FCF706FA21463046FCF78AF96846017A0398FBF79FFD05A904A8FBF74DFD68467A -:40F08000027E21463846FBF71BFD07B0F0BD000070B50948C4782046F8F758FE06462046FFF7FCFA05462046F9F7C8F9014630462843084370BD00005C21000870B5094885 -:40F0C00084782046F8F74AFE06462046FFF7EEFA05462046F9F7CEF9014630462843084370BD00005C210008F8B5069E1F463478042C17D3231FDDB23B460095FFF7A0FF62 -:40F100003819001FFCF7EEF90520FDF74FFA0446012229460798FDF76FFB3570E00701D00020F8BD1F20F8BDF8B51C46009301271346069E079D3A46FFF782FF2846FCF761 -:40F14000D1F90520FDF732FA0546012221463046FDF752FB2846F8BDF8B51D4616460F460024FCF785F931463846FCF709F90320FDF71CFA012231462846FDF73DFB2046CA -:40F18000F8BDF8B5069D089E2C780094FFF758FF0120FDF70BFA07463046FDF789FB0023224631460798FCF773F8241D2C70780701D41F20F8BD0020F8BDF8B51C4600932F -:40F1C00001271346079E069D3A46FFF739FF0120FDF7ECF90746002221462846FDF70CFB3046FDF765FB3846F8BD10B500F02CF90446F9F7B7F80128F8D1204610BD10B5B5 -:40F2000000F022F90002000A10BD0000004870478422000808B500F017F96B4600210090585CC006C00E421F0B2A04D9491CC9B20429F5D3EFE708BD08B56A4600210B203A -:40F24000F6F758FA6846007808BD0000FEB5064601200290042017460D46444C0090FBF703FE28802146FBF727FC3080F8070BD0FBF73EFE019028880199FBF721FEA04221 -:40F2800002D2044601983080B8070BD5FBF742FE019028880199FBF713FEA04202D204460198308078070AD5FBF728FE074628883946FBF705FEA04201D204463780F6F765 -:40F2C0000BF900280AD0FBF709FF074628883946FBF784FDA04201D2044637802448807B00283BD0FBF710FE074628883946FBF7E7FD0546A04231D2FCF7DEFB1D4909789A -:40F30000814201D8002004E01949D022096A504308180190F7F77CFF002817D101983D21C0300068C089F3F7F3FB401DC0B200900A280BD90A21F3F7EBFB0091854204D39A -:40F34000391A281A8FB285B200E0002537802C460198F7F75DFF002800D102900098FDF7BDFE0298FDF7C0FE2046FEBDFFFF00005C210008CC1E000810B50E4C0C492346DE -:40F380000833A160002142189278002A00D05A54491CC9B20429F6D3FF21A0689A314843A06000F051F8F8F7DDFF0128F9D110BD040302015C21000870B5059C049D207046 -:40F3C000060A6670060CA670000EE0704806D101400E0843207104221946601DF5F789F82046042229460930F5F783F870BD00000149086070470000E8010008F8B5079C76 -:40F400000E46E178069D09020160A77839430902016067783943090201602778394301602079611D4006400E30702079C009107004221846F5F75DF821460422093128469F -:40F44000F5F757F8F8BD000010B5FBF70DFD094A916848400849096848408108C3084409414063405940C30F59404008C9070843906010BD5C210008E8010008F3B5074669 -:40F4800081B00E4800240E4E0E4D10E031682C234A6821465943535CDB0706D01B315118029801F02BFB002805D0641CE4B2E97AA142EBD8FEBD3C70FEBD0000FFFF000054 -:40F4C000D40100087C210008FFB585B00C4600200090A004850E0E99684601810026FFF711FB6106C90F27073F0F0191012805D13A460798FFF7C2F8012849D069462F200E -:40F5000004F0F1FD002843D1009C3E2020700599022001290CD0A070A81FC6B20120E0703B00FBF7E1F907080A0C120E121012000B20A070F2E7002008E0012006E00320D7 -:40F5400004E0042002E0022000E0FF20207101986071A01D06220799F4F7CBFF0598012818D0267320460D30AA1F0899F4F7C1FFED1DEDB203AA02A90620F6F7BBF86846D7 -:40F58000007B60556D1E65702046059904F098FD09B0F0BD01202073E4E700000249014808607047A8470010EC010008704700207047FF2070470120704710B5400606D580 -:40F5C000FF210020FAF736FA0220F8F7F5FA10BD7047704770470020704770477047002070470020704700207047002070470020704700000249014808607047EC4700104A -:40F60000EC01000870B512248AB00D46064600292FD000200290039004900590102202A92846F4F757FF002823D00821684607F040FB6946487940214006400E08436946FC -:40F64000487103226C46C91C02A8F4F752FF0322E11CF01CF4F74DFF06AA294602A8F7F755F90404240C04D1032206A93046F4F740FF20460AB070BDF0B50546FF2129704E -:40F680000022144C144B072011462468DB7A0FE02C2766684F43F65DF60707D014274F43A6681337F75D0126BE403243491CC9B28B42EDD8D143002207E0CC0702D02A7060 -:40F6C0000020F0BD4908521CD2B29342F9D90029F3D1F0BDD40100087C21000870B50546FF210D4A297014680C4A0A480021D37A0CE02C2266684A43B25AD60704D052077A -:40F7000002D52970002070BD491CC9B28B42F0D870BD0000FFFF0000D40100087C210008F8B50C460546FF206946087068798009012807D022782946684601F063FA68463D -:40F740000078F8BD2946684601F092FA68460178FF29F4D00A4E2C22306851434068091D411806222846F4F7C4FE30682C2241686846007850430A30085C801C2070DEE79C -:40F78000D40100083EB50446FF206946087213480068C007C00F19D001216846FBF7E0FB684640798009012813D02278694602A801F028FA6846017AFF2907D008482C2240 -:40F7C0000068514340680A31405C20706846007A3EBD694602A801F04BFAF7E7001F3C40D4010008F0B589B01646044600256A461570FF201075CC48072700680278CB483D -:40F800000790C07A82426FD2204606F0C7FB07006AD10C27F7F7E2F8FBF732FC002804D0C248203840784007F2D1A27A211D684601F0E8F9BE490746884220D1684606902A -:40F8400000208446FF206946087007990727CB7AB5490020096807910EE007992C2249684243895CC907C90F614503D106990027087012E0401CC0B28342EED80DE0002E61 -:40F880000BD1A9486A46006881681078142250431330085C6A46107501252846384303D105A8FFF7E9FE0746002FB1D16846017D9D48142300688268684600785843133044 -:40F8C0001154012E11D098482C230068002241686846007858430A52934800684168684600785843801C0AE01AE18F482C220068062341686846007850430A5A1A400A52B4 -:40F900000020019002900390049087482C230068A27A41686846007858430A300A54824800684168684600785843002A03D00A5A10231A430A527C482C22006841686846FF -:40F94000007850430B300818214610220B31F4F7D0FD75482C22006841686846007850431B300818214610221B31F4F7C2FD6E482C2200684168684600785043001D0818BA -:40F980000622211DF4F7B5FD6748142200688168684600785043081806220021F4F7B2FD6148142200688168684600785043801D081806220021F4F7A5FD5B481422006895 -:40F9C00081686846007850430C30081806220021F4F798FD012E33D0534C2C22206841686846007850431B300818102201A9F4F771FD0223002820686946406809780FD00B -:40FA00002C225143425A1A43425220686946426808782C214843801C115A012319430EE02C225143425A9A43425220686946426808782C214843801C115A4908490011527D -:40FA4000394C2C22206841686846007850430B300818102201A9F4F73DFD0028206822D06946097842682C204143505A04231843505221682C234A6869460978594380235A -:40FA8000184350526946226808782C21414353680B315918142392685843801D1018FFF7B1FD074608E04168684600782C2250430A5A84239A430A5220682C2142686846CC -:40FAC00000784843011D0A305118105CFDF79EF80823FF28206869464068097804D02C225143425A1A4303E02C225143425A9A43425220682C2241686846007801235043BD -:40FB00000A5A1A430A52684600210078FAF754FF38462843304303D120680178491C0170384609B0F0BD0000D40100087C210008FFFF000038B50A461B4909784907490FE8 -:40FB4000022903D0032901D004292AD11749897A490626D50146684601F054F80006000E1FD1134C2C222068082341686846007850430A5A1A430A5268460078FAF7D6FAB9 -:40FB800000280AD020682C22416868460078012350430A5A9B021A430A5268460078FDF7AFFA002038BD0000F0210008AC1E0008D4010008F1B584B000260396FAF78AFD7C -:40FBC0000446FBF75DFA002830D0049880057DD5FF2069460870002101A8FBF7C1F96946487A8009012824D0022836D001273A4601A9684601F006F805000AD0012047405E -:40FC00003A4601A9684600F0FDFFB6490546884225D0B5482C2200684168684600785043085CC04380071AD4AE4D1AE0012005B0F0BD01A96846FFF721FC050011D101201B -:40FC40000390A9482C22006841686846007850430A30095C4720015503E00027C7E747200755F8F78BF8002D57D1012823D0042821D00220F8F75EF801281CD19A4D2C2160 -:40FC800028684268684600784843011D0A305118105CFCF7BBFFFF283FD028682C22416868460078082350430A5A1A430A5268460078FDF725FA039800281CD08A4D1422CC -:40FCC0002868816868460078504300E032E00818062201A9F4F70DFC286814228168684600785043024613328B5C08187F492022096AFDF78DF9684600784E2108557A4952 -:40FD00002C22096850434968001D0918204606224830F4F7EEFB012675E0754880694007800F012803D100217248FDF743F8FDF71BF868E00498400665D5FF2668466E49B4 -:40FD40000670684F0868012280B2920310430860002101A8FBF704F9FBF792F925464035AE73012600284ED06846407A8009012828D0002201A9684600F044FF002806D0E0 -:40FD8000012201A9684600F03DFFB8420AD056492C2309684A68694609785943515CC943890701D5002812D05448807AC0072AD00020FDF71DF94E4880694007800F0128C3 -:40FDC0001AD01DE001A9684600F052FFEAE768460078A87344492C230968584303464A680A33D25CEA714968001D0918204606224830F4F77EFB06E000213E48FCF7DAFF16 -:40FE0000FCF7B2FF0026049800053CD5FF2568460570344E002101A8FBF7A2F8002201A9684600F0EFFE002806D0012201A9684600F0E8FEB04221D02B492C2309684A68B8 -:40FE4000694609785943515CC943890716D428488169006A89B2C0050CD44807800F012803D100212348FCF7A5FF0020FDF7C0F8FCF77AFF4034A5730020D8E6002804D043 -:40FE80004034A57301263046D1E6174D2C222868022341686846007850430A5A9A430A522868142281686846007850431330085C00221946FDF78EF96846214600784031F3 -:40FEC00088732A682C256843054653680A355B5DCB715168001D0918204606224830F4F708FBCFE7FFFF0000D4010008F021000800103C40F0010008001F3C407C210008E6 -:40FF0000F0B500278BB004463E46FAF7E3FB08907A4D60057ED500200690059009A9039004900191009007AB03AA05A90320FBF745F86946898B4906CA0F002816D16846B9 -:40FF4000407C03A98009012802A815D000F05AFE6B4988420AD029682C234A686946097A5943515CC943890700D465486946497E8909012904D011E0FFF780FA0127F5E7A3 -:40FF8000002873D128682C2241686846007A50430B30091805A800F0B1FD0126002865D10120F7F7C7FE01281BD169460A7A28682C214A434068131DC1180A32805CFCF725 -:40FFC00025FEFF2852D028682C2241686846007A082350430A5A1A430A526846007AFDF78FF83800474F1AD02868142281686846007A50430818062203A9F4F77AFA286863 -:020000041001E9 -:40000000142281686846007A5043024613328B5C081800E02AE02022396AFCF7F9FF002E24D028682C2241686846007A402350430A5A1A430A522868142281686846007ADD -:4000400050430C300818062205A9F4F752FA2868142281686846007A5043024613328B5C0C3008184022796AFCF7D2FFE00606D525490868012280B2D20310430860E004D9 -:400080002AD500206946087209A90191009007AB03AA05A90320FAF791FF00281CD16846808B03A94006C20F6846407C8009012802A804D000F0A6FD002803D00CE0FFF7D8 -:4000C000DDF9F9E728682C2241686846007A5043085CC04380070ED509208001044201D1200508D508984030817B0020F9F7A2FC0220F7F761FD0BB0F0BD0000D401000806 -:40010000FFFF0000F0210008001F3C4070B50C24F6F764FCFAF7B4FF002803D00E484078400717D1FAF786FD0C4D002128680A4C01702034E27A2C214A4340680021F4F70C -:40014000E1F9E27A14204243286800218068F4F7D9F90024204670BD5C210008D4010008F8B5144800784007400F022803D0032801D004281DD11048807A400619D500244D -:400180000E4F08250E4E11E038682C21426820464843115A0B4BA94311523A681940526811522046FCF7ACFF641CE4B2F07AA042EAD8F8BDF0210008AC1E0008D401000813 -:4001C0007C210008FFFB0000F0B504468BB0AD48002607903546600605D4A00603D4E00501D4A00528D5FFF711F809A90191009008AB03AA05A90020FAF7E0FE0790600624 -:4002000001D4A006EED5002069460872FF2000900798002810D1088C41060007000F01906846407CCA0F8009012803A902A804D000F0E8FC002804D000E1FFF71FF9012659 -:40024000F8E76846407E904F8009012810D1019801280DD138682C2241686846007A50430B30091805A800F049FC01250028E3D186488078F8F7FEF801281CD169460A7A9B -:4002800038682C214A434068131DC1180A32805CFCF7BCFC0090FF28CED038682C2241686846007A082350430A5A1A430A526846007AFCF725FF019801283DD1002D3BD01A -:4002C0003868002E05D081686846007A1422504305E041686846007A2C225043001D0818062203A9F4F7F6F80006000E01D1002E24D168463A68007A2C23434351680B3361 -:40030000C9181423926858430C301018FFF77AF909903868142281686846007A504302461332801D8B5C081859498022896AFCF76FFE099800287DD1002E3CD03868142241 -:4003400081686846007A50430818062203A9F4F7D0F83868142281686846007A5043024613328B5C08184A492022096AFCF750FE0098FF281FD0386842686846017A2C202E -:400380004143505A430702D5019B012B01D1002D03D001235B021843505238682C2241686846007A202350430A5A1A430A526846007AFCF7A5FE002D40D038682C22416892 -:4003C0006846007A402350430A5A1A430A523868142281686846007A50430C300818062205A9F4F786F83868142281686846007A5043024613320C308B5C08182449402294 -:40040000496AFCF705FE21482030807A400715D50098FF2812D038682C2142686846007A4843115A4B0703D501235B0219431152684600E002E0007AFCF762FE200606D531 -:4004400014490868012280B2D20310430860E00501D4A00510D5002069460872079800280AD1088C4006C20F487C03A98009012802A803D000F0C6FB0BB0F0BDFEF7FEFF46 -:40048000FAE70000FFFF0000D40100085C210008F0210008001F3C4010B5054A01781175411C034806220E30F4F723F8002010BDA0210008F8B515461E46024600206B46E5 -:4004C0001870684600F09EFB0406240E02D002242046F8BD0948002E006881686846007802D01422504302E014225043801D091806222846F3F7FDFFEAE70000D4010008CA -:400500000148C07A704700007C210008F8B50646002768463C4D0770286802240078002818D0304605F03EFD040013D10C24F6F755FAFAF7A5FD002803D0344840784007CD -:4005400008D13278711C684600F05CFB0406240E02D002242046F8BD28682C2241686846007850430F5268460078FCF7D1F9296808780028EED06A461278431E93422AD042 -:400580004B682C2148432C3819182C20424398182C22F3F7AEFF2968142288680978142351436A461278143941185A4380181A46F3F79FFF28682C224168007850432C38BF -:4005C00008180021F3F79EFF2868142281680078504314380DE048682C214A4380180A460021F3F78FFF286814228168684600785043081814220021F3F784FF28680178E0 -:40060000491E0170A6E70000D40100085C21000838B50A46174909784907490F022903D0032901D0042922D11349897A49061ED50146684600F0E6FA0006000E17D10F4B56 -:4006400069461868097842682C204143505A0824A043505219682C234A68694609785943074B1840505269460878FCF749FD002038BD0000F0210008AC1E0008D401000816 -:40068000FFFB0000F0B58BB00446FF206946087200200A90A00605D4600603D4200601D4A0057DD5FEF7B2FD08A909900191009007AB03AA05A90020FAF780FC01908E4E4F -:4006C000A00601D460066CD50198002869D10025694600950D72888B4006C20F487C03A98009012802A804D000F08CFA070009D013E0FEF7C3FE070001D001250DE0012020 -:400700000A900AE030682C2241686846007A5043085CC043800700D4784F6846407E800901281BD16846808B0007000F012815D130682C2241686846007A50430B300918D4 -:4007400005A800F0DBF9002804D00225384304D0012703E001210091F8E70027002F7AD167488078FDF7A2FF01281ED130682C2142686846007A4843011D0A305118105C95 -:40078000FCF744FAFF2866D030682C2241686846007A082350430A5A1A430A52684601E0A5E06EE0007AFCF7ABFC30682C2142686846007A4843115A4B0707D501235B0247 -:4007C000194311526846007AFCF79AFC00984D4F002824D030686946097A40682C225143425A40231A434252306869468268087A142148430C301018062205A9F3F779FEE7 -:40080000306869468268087A1421484301461331535C0C3010184022796AFCF7F9FB0A98002818D03068142281686846007A50430818062203A9F3F75CFE30681422816868 -:400840006846007A5043024613328B5C08182022396AFCF7DDFB002D13D06846818B0807000F012805D12848407E012801D1022D10D06846008C009003AA0020099BFEF72A -:4008800023FEA00533D50020694608720198002807D015E06846008C009005AB03AA0120EDE7888B4006C20F487C03A98009012802A81ED000F0A6F96846007AFF2816D0D0 -:4008C00030682C2142686846007A4843115ACB439B070CD50A4B20339B7A9B0707D501235B02194311526846007AFCF709FC0BB0F0BDFEF7C3FDDFE7D4010008FFFF000061 -:400900005C210008F0210008A021000870B5054605F05AFB04000DD107484078400709D1F6F75CF8FAF7ACFB01462878884201D0FAF7E4F9204670BD5C21000870B50646DA -:4009400005F048FB040010D1094D287EF5F73CF900280AD132887D20EA82C00042432846044B00211830F5F7CBF8204670BD0000A02100085D0B011038B505460020694681 -:400980000C240870FAF77CFB002803D01E484078400708D12A78691C684600F033F90406240E02D00224204638BDE8790223174A002810684168684600780ED02C2568433E -:4009C0000D5A9D430D521068142281686846007850431330085C002211E02C256843851C4D5DED07DFD00D5A1D430D521068142281686846007850431330085C01220221FA -:400A0000FCF7E8FBCFE700005C210008D4010008F8B50024264E054600291AD00C213046F4F760FC0004000C40D1E9792C2041433068001DF4F756FC0004000C36D1E9797D -:400A40001420414330680830F4F74CFC0004000C2CD118484022817A002711438172E879154D2C21E87230680770EA7A40684A433946F3F747FDEA7A1420424330680021EE -:400A80008068F3F73FFDFF2007E014223168624313328968641C8854E4B2E97AA142F4D8E1200649AF728000C8820020F8BD0000D4010008AC1E00087C210008A021000847 -:400AC00070B5FF2815D00B4A0446126853682C2254431A5BD5070CD055070AD5002903D0012189020A4301E003490A401A53FCF707FB70BDD4010008FFFB000070B5164C4A -:400B000088B00E46050023D0002E21D0002000900190029003906879400619D5102269463046F3F7D7FC0006000E11D00322E91C6846F3F7DEFC04AA31466846F5F7E6FE4F -:400B4000032204A92846F3F7C5FC002800D10024204608B070BD0000FFFF0000F8B51E491F4B0878401E08701C480021C28A7D20C000424319481830F4F7C2FF0024194DBE -:400B800023E0194B20461A682C26516870430E5CF60718D00B30091820461423584392680746861D9019FEF72DFD0006000E0AD10D48133700680D498068896AC35D8019B3 -:400BC0008022FCF725FA641CE4B2E87AA042D8D801206873F8BD00007A010008A02100085D0B01107C210008D4010008F021000810B5014606220248F3F77BFC10BD00007A -:400C0000F0010008F7B582B016490091FF20029900240870144E154F1FE030682C21254640684D43291D401806220399F3F752FC002810D13068294640680A31425C049982 -:400C40008A4208D1405DC00705D0029804700020009005B0F0BD641CE4B2F87AA042DCD80098F6E7FFFF0000D40100087C210008F3B581B0FF200199114F08700024114D77 -:400C8000114E17E02868062281681420604308180299F3F71FFC00280AD1286841682C206043085CC00703D001980027047004E0641CE4B2F07AA042E4D83846FEBD00000E -:400CC000FFFF0000D40100087C210008FEB50446002069460190087007460646014606225448F3F70FFC5348FCF72AF96079524D022801D003287DD1A279E11D6846FFF7AC -:400D000081FF0606360E23D14C482C230168684600784A684343D25C120619D5142289685043801D0818FCF77DF84448142200688168684600785043024613328B5C801D55 -:400D40000818892180224901FCF762F9012001902079012801D0042815D168460078FF2811D036492C22096842434B681B329A1889681423584308181146FEF743FC0606FB -:400D8000360E0BD000260198002842D0A87A01210843A87268460078287345E0274F2C2238684168684600785043085CC043800702D5E01DFCF7C4F83868142281686846E8 -:400DC0000078504309180622E01DF3F792FB386814228168684600785043024613328B5C081817492022096AFCF712F938684168684600E014E000782C2250430A5A012360 -:400E00005B021A430A5268460078FCF779F90127B9E76079022801D0032801D1801E6071A87A40084000A872002F01D00120A0713046FEBDF00100087C210008D401000867 -:400E4000F0210008F3B587B00C46FF206946087000250595019508728548039060792F46022801D0032800D10127207E022801D0032800D10125FAF703F9002810D02079FD -:400E80007C4E012819D06279002F01D0921ED2B2A11D6846FFF7B6FE0390002816D0BEE0002F02D06079801E6071002D02D06079801E6071002009B0F0BD002DEFD002A846 -:400EC000FEF70CFC039000287ED0A8E06A482C230168684600784A6843431B33D31889681422504308181946FEF78CFB0799039040310491002836D0002D66D05E482C22F0 -:400F000000684168684600785043085C40075CD506220021A01DF3F7F5FA04986179C1710121A01DFBF746FF534D1422286881686846007850431330085CFBF787FF2868B7 -:400F40002C22416868460078032350430A5A1B021A430A5268460078FCF7D2F8B07A04210843B07279E04448142200688168684600785043024613328B5C08183F4920223F -:400F8000096AFCF745F806220021A01DF3F7BAFA04986179C1710121A01DFBF70BFF0120019035482C220068FF23416868460078013350430A5A1A430A5268460078FCF794 -:400FC0009FF82D48006801E01AE028E0816868460078142250431330085CFBF737FF002D1DD025482C2100684268684600784843115A4B0713D501235B0219431152A9E7E7 -:401000001D482C220068012341686846007A50430A5A5B021A430A526846007A9CE7B07AFB210840B072002D17D00598002814D1207E801E20766846007AFF280DD00E4925 -:401040002C2209685043496801230A5A5B029A430A526846007AFCF753F8002F05D00198002802D16079801E6071039823E70000FFFF00007C210008D4010008F0210008CB -:40108000FEB5054640790027424E022801D0032845D16846FEF722FB07063F0E12D13E4C6846226800782C21414353680B315918142392685843801D1018FEF7A3FA0706E6 -:4010C0003F0E05D06879022827D0032825D026E020681422816868460078504302461332801D8B5C08182D498022896AFBF790FF0120687120682C224168684600780123C6 -:4011000050430A5A5B021A430A5268460078FBF7F7FFB07A022108431CE0801E687101204002002401900FE01B482C22006862434168019B885A98438852C00702D02046E9 -:40114000FBF7DEFF641CE4B2F07AA042ECD8B07AFD210840B0720F49A8792039104A03280BD0022812D001280CD0002050768878FD22104088703846FEBD01205076A879F7 -:40118000801EA871887802221043F3E701205076F1E700007C210008D4010008F0210008A021000810B509490748096888420AD10748084BC28A7D20C0004243044800214B -:4011C0001830F4F79DFC10BDEC470010EC010008A02100085D0B0110F7B515460C46F9F74FFF0746FF2C3DD0002F3BD014212646687C4E432C2180094C4301281AD11C4893 -:40120000214600680A314268525C0099921C4031CA714168201D0918284606220C30F3F768F91348062200688068811928461830F3F75FF90098F5F7EBFF002815D0042031 -:401240000C49897A01420DD0094800684168095D490707D58068B61D8119284606221230F3F747F9F807C00FFEBD0120E8E70000D40100087C21000810B510490A781049B7 -:40128000824201D8002003E0D0230A6A58431018002812D00A6B138802468032146B23800B6B146B5B88A3810B6B126B19881289914202D05A8800F009FB10BDCC1E0008C9 -:4012C0005C210008024901484860704750480010F8010008F7B50D463449334F897A84B03E4689065DD52C468034216B0A8B2946C0310091824204D3886820308078002820 -:401300004FD0002A02D12A48006B828828460699F5F7A6FD0646B84208D12889002102F098FD069805F0D8FF00263AE00027FF2069460197087200988068203081780129F2 -:4013400003D1A178002900D0C170A078401CA070A878FCF711F90407240FA878FCF7D4F80007000F04430F2C00D00127002416E00120009002AB03AA01A92846F5F7B8FC2B -:4013800000280AD10199002907D06846037AFF2B03D0027B2846F6F7BEFA641CE4B2BC42E6D3304607B0F0BDFFFF0000AC1E00085C21000870B50446C034217B0546002969 -:4013C0000CD0284600F0CAFA072807D0207B152802D1284600F018F80020207370BD704700487047FFFF000070470120704770470020704700207047024901484860704755 -:4014000030480010F801000870B50646FDF7FEFE04463089354620808035286B4089E080286BC08A2081286B00896080286B808AA0803046F7F705F9204604F027FF70BDED -:40144000FEB5044600790D46C01E05280DD848482E78807A20278006002807DB31462046FCF753F9E07E3843E076FEBD40212046FCF7A8F9A8786946000288806978084346 -:401480006946888029790A026946CA80E9780A436946CA80A9790A0269460A8069790A4369460A80297A0A0269464A80E97925460A4369464A808035296BC88069460888CD -:4014C000296B88806946C888296B488269464888296B0882204600F099FA2046F5F798FE00281ED1FDF7A8FE5E210A5B6179F6F7D1FD22460146A032507D0128286B408988 -:4015000026D080003C3083B2107D0128286B008B21D080003C3082B2103189B22046FDF73FF86420015BA078FBF728FC142E15D00F49A07D897AEF2239400843E17E384346 -:4015400011403943E176A0752046FFF75DFFFEBDC0007030D7E7C0007030DCE71521CC200155A07D3843A0752046FFF723FFFEBDAC1E0008014A526812691047F801000876 -:40158000014A526812691047F8010008F3B585B0FF206A460024107301941472184A2046927A920628D5059EC036B26820329578002917D1002D14D0009003AB02AA01A9B4 -:4015C0000598F5F795FB07466846037BFF2B06D00199002903D0027A0598F6F79CF9002F00D00124B0682030C178002904D0002D02D00124491EC170204607B0F0BD0000E0 -:40160000AC1E000870B504464878142801D015283BD1E07EEF21084020210843E076A07DDF210840A07540212046FCF7CBF82046F5F7EEFD002820D1FDF7FEFD5E210A5B9B -:401640006179F6F727FD22460546A032517D204680300129016B498918D089003C318BB2006B117D008B012913D080003C3082B21035A9B22046FCF793FF6420015BA0785F -:40168000FBF77CFB2046FFF7BFFE70BDC9007031E5E7C0007030EAE710B5044604F036FE00280CD106490A6B928822800A6BD28862800A6B1289A280096B4989E18010BD01 -:4016C0005C21000810B5044604F026FE002806D103490A6B12882280096B4988618010BD5C21000870B5054604F01CFE002817D12888F7F731FD040013D0F8F7A6FB0028D1 -:401700000FD0207909280ED02046F8F7AFFB01280BD0F5F763F9AA886988204600F0D6F870BD022070BD0C2070BD2A2070BD000010B5044604F0FCFD002806D10349228853 -:401740000B6B1A80096B62884A8010BD5C210008F3B5064631480025807A83B080065AD53746C0373868344680340090206B0290B8680190F1F7D2F8D02200213046F2F7A7 -:40178000C1FE029820630198B86000983860F1F7AFF8049801280FD130462421C830F3F7A1FD05042D0C36D130461A21B030F3F799FD05042D0C2ED11A220021206BF2F791 -:4017C000A1FE3046049900F05DF81549226B086B80881080086B226B00895080226B1B209080226BD080226B1081226B50810A6B236BD2889A81096B226B4989D181FF21B5 -:40180000226B49311182226B5182226B9182226BD182216B0883284605B0F0BDAC1E00085C21000810B504460020002906D00C211248F3F757FD0004000C1DD10F491B226A -:4018400030390B6B1A80FF220B6B49325A800B6B22889A8022880B6BD2007032DA800B6B62881A816288096BD20070324A81044920238A7A1A438A7210BD00008C210008D4 -:40188000AC1E000870B50546C03500290FD1A86820308678002408E0A868E1004058002801D005F019FD641CE4B2B442F4D324220021A868F2F726FEA868FF2120300170A9 -:4018C000A86800212030417070BD000070B5064604468036306B03898B4206D1838A934203D11D4B1B78002B07D0E37E9D0606D5A57DAD0603D41A2070BD002070BDDB067A -:4019000028D483891546AB4200D91D460180306B82812046F5F77CFC00280ED1FDF78CFC5E210A5B6179F6F7B5FB316B1030CB8981B22A462046FCF733FE6420015BA078FF -:40194000FBF71CFAE07E10210843E0761420C0342073D2E7232070BDF801000838B50546002000900C46A978684605F041FC002807D0142C03D1E87EEF210840E8760720B9 -:4019800038BD0098092204702C468034216B89784170216B4988090A8170216B897BC170216BC989090A0171216B09784171216B0988090A8171216B097BC171216B898951 -:4019C000090A01722946F8F799FE38BD70B504460088F7F7C1FB014680310B46096B2289CD89AA4203D1E5884E88B54206D0CA811A6BE1885180044A01211170A28861883A -:401A0000FFF764FF70BD0000F801000830B50024002835D0014680310A6BD3881588AB4200D32B4615899D4201D0138101240A6B538A9589AB4200D32B46958A9D4201D0DC -:401A4000938201240A6B958853889D4200D22B4655899D4201D053810124096B0A8ACB899A4200D31A46CB8A934201D0CA820124B421095C012200F007F802490020087010 -:401A8000204630BDF80100088030006B0129838A09D099080F39038989B28B4200D21946002A03D005E0D9080E39F4E7028B8A4200D901837047000070B504461B3CE12CD4 -:401AC0001CD2104C246BA588854217D30E4DA94214D8FF204930814210D3E6888E420DD3FB2A0BD81B2A09D32189914206D3AB4204D8834202D36089984201D2122070BDCA -:401B0000002070BD5C21000848080000F0B5314A0446314B002110465D5C491CC9B2A542FAD1A3009E462D4B491EDB7DCDB29C462A4C00216B003434E45A284B4E003433EC -:401B40009E5B254B5B5C9F00244BDF59BF897F00F619B6B2B44202D90020614625E0B24200D932460E46491CC9B2AE42E5D11CE01A4B4D0034335B5B1E1B052E09D2164D90 -:401B8000164E6D5CAF00F559AD896D005B199BB206E0124F75467F59FF89FF1CBE4217D39A4200D91A46491CC9B28C45E0D8094988420CD1101B04280AD9084A71465158CD -:401BC000C01E897C80B2002901D1401E80B2F0BD0020F0BDFFFF000000020008B4220008F7B50546002082B0164604460090F9F73BF90346002015E081006A581278002AED -:401C00000ED0062A0CD0464A670010556958098ACA1A012109045118424A641CD153E4B2401CC0B2697D8142E6D8012021E0014611E03C4B94467246DA53019B6246DA8352 -:401C4000374A575C5318BC46203BDF7F57546746491EDF77C9B2002909D0324B4F00DA5BFB18203B0193DB8B9E467245E1D3401CC0B2A042DBD300200399641EA446294CC5 -:401C8000086015E026494200095CA35A8F00EF591219FF895288DB19DB1C93420AD9039A136801228A4013430399401CC0B20B606045E7DB0399096800290BD0184A125C35 -:401CC0000120904001430398016001200090009805B0F0BD124801788A00A858807C3070B170002801D00128F1D1AA5821889289638852008A1892B2934204D9511A05E01F -:401D0000491EB180E3E7591A042905D9C91E89B2B1800028F4D0DAE70020B080D7E7000000020008E822000870B50A46034641780024007800F010FA264DFF2847D09E78C5 -:401D400025493300F8F7D0FD09060A0F13171B1F242943008000085800781CE0800008584068106034E08000085800890EE080000858807A0FE080000858808906E080001B -:401D80000858C08902E080000858008A10801FE080000858807C10701AE080000B581B7813700B585B6853600B581B8913810B589B7A93720B589B8993810B58DB89D381A9 -:401DC0000B581B8A13820858807C907400E02C46204670BD01001600B4220008F8B50446002020606060254EA060F07D002809D001280CD0224669463046FFF7F1FE012834 -:401E00001AD031E005202070FF20A070F8BD307E2070317DA170002801D00128F6D1317D8900715889894900C91E89B2A1800028ECD1491EA180F8BD0127104867701C30C5 -:401E4000009905F0B1FB054680003058807C2070B17D2846A94207D9FFF758FEA080A5700098AF40B843A06020783076A0783075A178A088890071580881F8BDB422000835 -:401E8000F8B5154F05460026387D344600901EE0E80716D0009880003858018AA0003858008AF8F79BFF0121C903884201D3002807D1094821461C3005F0EAFB0120A0402D -:401EC0000643641C787D6D08E4B2A04201D3002DDED13046F8BD0000B4220008F8B505460020287068602872F8F7BEFF0746F8F7C1FFFF213931884201D2022600E003266C -:401F0000002420E0A00010580178002919D0062917D0008A0121C01B0904401880B24910884201D8B0420CD801202870917DA14203D96968A040014369602146054805F0F7 -:401F4000A7FB641CE4B2034A1C3A507DA042D9D8F8BD0000D022000870B51C4DFF222A7505222A7600266975EE75A975334606E014225A4312189C005B1C2A51DBB28B4219 -:401F8000F6D30C4603E0A200641CAE50E4B2052CF9D314224A4310180A4601460B481C3005F09BFA00280FD100240AE0A000285821460670012000F00BF8002804D1641C21 -:401FC000E4B2A97DA142F1D870BD0000B4220008F3B583B0002668461A4C0671607D0D4600282BD069464D70039808702946039800F0B2F80746FF281ED0024601A968466A -:4020000000F060F9B8002258711E51602258090C118122589672225891812258D18121582A460E8220580521817420461C30039905F07EFA05B0F0BD0348FBE70248401CEE -:40204000F8E70000B422000801001600F8B50F4606460024F8F708FF0546F8F70BFFFF213931884201D2BF1C00E0FF1C0B48B2008258F9B2107800280ED006280CD0108A27 -:402080000122401B1204801882B20120C003824201D88A4200D801242046F8BDB4220008F8B52B4D0024E87D022801D20020F8BDF8F7DAFE264F264B002134370126360463 -:4020C0005D7D11E08B00D2581378002B0AD0062B08D0204B1955128A6300121A9219641CFA52E4B2491CC9B2194A8D42EAD8012117E008460AE07B53164BF2831A18203A61 -:402100001D5CD67F1E54401ED577C0B2002806D04500EE19203E7A5BF38B9A42EBD3491CC9B2A142E5D30B49388809787B888A0007498A58D2898218D21C9A4206D80A7DBB -:4021400092008958C989C91C8842AFD80120F8BDB422000800020008022804D20348807D401E884200DAFF2108467047B422000810B50146014805F0FBF910BDD022000854 -:402180000A4610B50146024805F066FA10BD0000D02200080A4610B50146024805F04CFA10BD0000D0220008F3B500980C46417800250078FFF7D0FF06463F48FF2E78D0C0 -:4021C00000993E4F89783E4A0B00F8F78DFB09060F161D242D34393E72002178062968D232462146009800F06DF863E0216891425FD8B000385841605CE02188914258D882 -:40220000B0003858018155E02178022951D2B000385881724EE021881922D201914248D8B0003858818145E02188914241D8B0003858C1813EE0B10079582088088239E04C -:402240002178052935D2B0002FE02178062930D2616891422DD8218991422AD8A17A022927D2A3891921C9018B4222D8E18991421FD8A17C05291CD232462146009800F0DD -:4022800021F8B0003A58616851603A58218911813A58A17A91723A58A18991813A58E189D1813A58218A1182A17C3858817401E0FFE705462846FCBD01001600B42200080F -:4022C000FF18000010B51A4B92009A58097814781170002C0BD0002917D1D87D401EC0B2D875012811D1194600204B7D1DE0012901D0022909D1D97D491CC9B2D975012904 -:4023000003D1417819750078187610BD82008A581278002A07D0062A05D082008A58927C0A76087510BD401CC0B28342EED810BDB4220008A03001777047000002490148E8 -:402340000860704798480010080200087047704770477047704770470249014808607047704800100802000870B5224DA030447E6E7D002334404476067E2D7D2E400676EB -:40238000857E2C400C70047EC57E2C4014700D780224032D00D30C701578032D00D31470447E0025012C02D0022C04D00CE0047E012C03D008E0047E022C05D10C78167869 -:4023C000B44201D00D701570047D0E78344200D00D70447D1678344200D015700978002901D0012381751178002901D00123C175184670BD7C2100081CB50400684681701A -:4024000008D020896A4610802046A030417D1171007DD0702146C031487B820701D57D2202E0C20702D07E221040487303496846096888472046F6F704F91CBD54020008A6 -:4024400010B541780078491EC9B2FAF73DF9024904200876002010BD5C21000810B5C1780278491ECBB281784078FAF743F9024903200876002010BD5C210008F0B587B08A -:402480000026694600960E740E75054605AA04A9FFF76AFF2C46A0340746012814D1A07D022602282AD000200290E07D022827D0002001902846FCF79CF80090A878009B7B -:4024C000019A0299FAF75EF91F48807A800604D5A17D00222846FFF7D7FA03966846007C009E00906846007D019000200290A97802A804F07DFE002818D103E00120D3E7C1 -:402500000120D6E702981823019A0099037041708270C670310A017105222946F8F7EEF880212846F5F7C8FB03982077002F08D1607F002805D10320607700212846FFF7FC -:402540005BFF07B0F0BD0000AC1E0008014A12689269104708020008F8B50F460546F4F757FE214EF17AC907C90F12D02C467978A0342176B97801276176677700280DD0D0 -:402580002846FFF77BFFC035687B822108436873F8BD39462846FBF73AFDF8BDB07A800604D5002201212846FFF76EFA00200090A978684604F01CFE0028E4D10098172248 -:4025C00002700A4A2946537D4370127D82700322F8F794F8728A80212846F5F74DFB042020776777CFE70000AC1E00087C21000870B506460E480C46C07AC007C00F30469E -:402600000DD0F4F705FE00280CD035466078A0352876A07868763046FFF730FF70BDFBF7F6FC70BD172224213046FBF722FF70BDAC1E0008014A1268D269104708020008C7 -:40264000014A1268126A10470802000870B517490978814201D8002504E01549D022096A50430D18002D1FD02C46A034207F02281AD1E07D60750E48A17D21752030027D69 -:40268000E276407DA07609482038807A800603D501222846FFF7F8F9002020770320607700212846FFF7A8FE70BD0000CC1E00085C210008FEB50C460746F4F7A9FD0128EA -:4026C0001DD080213846F5F7F7FA2E48A578017D407D667805400E402079E1780002014330463C462843A0340191002804D0B878F8F75AFD012808D0002E0FD00FE0182208 -:4027000024213846FBF7B5FEFEBD28215A20C155002020773846F6F7AFFBFEBD667D002D00D1257D207D28420ED0607D30420BD000200090607F00281BD1032060770021C6 -:402740003846FFF759FE14E0022D17D00021022E16D0002202200090B878019BFAF712F80948807A800604D5002229463846FFF78BF9E675A57500982077FEBD0121E6E731 -:402780000122E7E77C210008AC1E000870B50C46F6F7E2FC0546002060702070002D0BD02846F7F752FB002806D0A035687D6070287D2070002070BD022070BD10B501785C -:4027C0004478CA078378084903D14A7D224009D08A750078800703D4087D184002D0C875002010BD112010BD7C210008F8B50746FF2168460170FE783D793888F6F7ACFC1F -:4028000004000FD0F7F721FB00280BD0B9782148CA0709D0B422175D89070AD4067D2E4005D008E01E20F8BD477D3740F4D11120F8BDB520065D2546A035687D304209D07D -:40284000287D384206D00320687700212046FFF7D3FD14E002236A4618212046F7F75BFB01280ED002236A46FF212046F7F70CFB012806D0AF76EE76204600F07FF800209C -:40288000F8BD68460078002801D02320F8BD2A20F8BD00007C21000870B50E4605468021FAF790FF2C460020A03420770C48017DE176407DA0760B48807A800604D5217D80 -:4028C00001222846FFF7E0F82846F4F7A1FC002805D10320607731462846FFF78DFD70BD7C210008AC1E000870B505468021FAF769FF2C460021A03421770C49087DE076E9 -:40290000487DA0760A48807A800604D5217D01222846FFF7B9F8607F002803D100212846FFF76AFD0320607770BD00007C210008AC1E000810B50F490978814201D800207C -:4029400004E00D49D022096A5043081800280FD00949A03020318A7D037D9A4203D1CB7D447DA34204D08276C97DC1760121017710BD0000CC1E00085C210008F8B5054647 -:402980002C460020A0346077207F012801D1022060772846F4F73CFC134F00281AD0032600200090A978684604F022FC002810D1009816220270A27E4270E27E82702946AA -:4029C0000322F7F79BFE7A8A80212846F5F754F92677F8BDB87A04268006E1D5A17E00222846FFF751F8DBE7AC1E0008F7B54804040C82B0384801900178029816468142F6 -:402A000005D919200002844201D8082E01D9334C52E0029F0620474331483D182879012801D0022802D1029800F0C8FB2C48C4536E71C45B408B84421ED22146F0F768F861 -:402A4000002919D10094019800240078019011E006202146414322480E183079012801D0022804D170880099F0F752F87180641C0198E4B2A042EBD8029800F033F8174999 -:402A8000044688421DD0164E6C80F15B708B814206D2F0F73DF8002902D1029800F000FC718BF05BF0F734F8002908D0022028710B48017F491C0177204605B0F0BD012096 -:402AC000F5E72879002803D06888801C80B200E00A2068800320EAE7CC1E0008FFFF0000F2220008F0B50646AFB00020039001200690E0480090E048089030460622DF49B6 -:402B00005043002501904018029050E028460621DA4A4843811804910979012901D0022943D1B54241D0039F14214F430BACE5550199105A515A00F0A3F93F1904467860ED -:402B400001282AD0049802994079497905914118A14204D90020B860F860069015E00499201A49880919081A04912146EFF7D0FFB96004990598081A2146EFF7C9FFF96036 -:402B80000098844201D2A0B20090F868A04201D9012000E00020387403E00020B860F86006900398401CC0B203906D1CEDB208980078A842AAD8069800280ED00398002801 -:402BC0000ED000200490AD490198085A01900020044605900546039045E00020C04343E1A64806760199415A418300203CE1284606214843A14907904018069000790128A7 -:402C000001D002282DD1B5422BD01420214641430BA80F18B8680099EFF77AFFB960F8680099EFF775FFF9600698069940884979A70042181FA9CA510099EFF769FF27A872 -:402C4000C1518E490798095A019800F019F901901FA8C0590099EFF75BFF1FA8641CC151E4B26D1CEDB208980078A842BFD8601E054681B20A901FA800F0FAFAA9B227A869 -:402C800000F0F6FA002729E00898002500780790B80006901DE0062029464143774808180179012901D0022911D1B5420FD04188407908180099EFF72BFF0A4606981FA994 -:402CC0000858824203D106982BA90D5004E06D1CEDB20798A842DED87F1CFFB2A742D3D3002559E0AE002BA806968059062148436249401840880099EFF70AFF1FA88059EE -:402D00000F4686B209902146681CEFF701FF880008902BA907900858062148435749401840880099EFF7F4FE07981FAA105A012C82B223D9B94201D3B1420ED9BA4201D326 -:402D4000B2420AD9914214D3B24201D2B94201D8012000E00020002810D08F420ED196420CD10A98854209D0069923AA0998505010E0B942EED8B242ECD3E9E7089827A906 -:402D800009580198401E08180199EFF7C1FE069823AA11506D1CEDB2A542A3D300205BE000991FAA8900555823AA535800202E461F469D424DD0002122E0142251430BAA09 -:402DC00089188A680020B24205D3BA4203D8AA4200D915460120C968B14206D3B94204D8994200D20B46012007E0002805D18A4214D99642F7D88F42F5D36146491CC9B2E4 -:402E00008C46A142D9D3002823D0AB4210D30399581B884207D8002905D01AE0964218D98F42E0D315E003905819400804900EE0019803991818401B88420AD903900198ED -:402E40005919081840080199EFF762FE0491012005900098401CC0B20090A042A0D30598002800D1B9E6049802994880029840882FB0F0BDFFFF0000CC1E0008F2220008D4 -:402E800010B50C46002807D0002C05D0EFF740FE20460C00FAD110BD002010BD014606225143064A04488A181179012901D0022900D1508870470000FFFF0000F222000875 -:402EC000FEB5284B1B780293834209D91923DB01994205D89A4203D8062901D3062A01D22148FEBD914201D10846FEBD49040E0C51041E4A0F0C117F002905D0012906D1B0 -:402F00001146097E814202D1F0198008FEBD3D4624E001200024019016E0204606214843124942181279012A0CD1085A29460090EFF7EEFD002905D028460099EFF7E8FD1C -:402F4000002909D1641CE4B20298A042E5D80198002801D06808FEBD6D1EADB2B542D8D2D2E70000CC1E0008FFFF0000F2220008FEB5062107466A4E4F43BC1921790129E8 -:402F800006D0022904D0F7F76FFF6188401860E0337E0121062283426ED1624B00241D780BE0062363439B191B79012B01D0022B01D1844203D1641CE4B2A542F1D8A542B5 -:402FC00003D1F7F751FF0A3043E06846447101718271694601A8FEF7A7FE06204443A019418868460088411A68460180F7F73CFF0546684601882846F7F7FAFE04466846C2 -:40300000018803222846F8F7EDF8002823D06846018801222846F8F7E5F8002812D0778B20463946EFF774FD7819401A01E0708B001984B2032221462846F8F7D3F80028B7 -:40304000F5D16BE0768B20463146EFF761FD4819801984B262E0718B2046EFF759FD481901E0708B001984B2032221462846F8F7B9F80028F5D151E0684643710171827101 -:40308000694601A8FEF750FE684661880088091868460180F7F7E8FE0546684601882846F7F7A6FE02902079022817D0768B6846018803222846F8F795F800281FD0684668 -:4030C000018801222846F8F78DF800280298314610D0EFF71DFDA819401A02E0F65BE6E7A01984B2032221462846F8F77BF80028F6D113E0EFF70CFDA8190818A9E731460A -:403100000298EFF705FD481900E0A01984B2032221462846F8F766F80028F6D12046FEBDF2220008CC1E000810B50B460621104C484302191179012906D0022904D0205A36 -:403140004008F3F777FE10BD0A498B4206D15188022903D3C8031904401807E0215A50880818C01A801EEFF7D3FCC803000C10BDF2220008FFFF0000F0B500200E4A84469E -:40318000014606460A4B0B4CFF20157809E006270A467A43A352121953801671491C5071C9B28D42F3D82076638326776046F0BDFFFF0000F2220008CC1E0008F8B50146E0 -:4031C0000020009026480078844688421AD9084606225043234F8646C0190279002A11D000220271204B7246BB52FF2643804671387F1C46401E3877387E354688422CD18A -:40320000002019E01948009027E0062201465143CA191279012A02D0022A06D00AE0795AA14207D20C46064604E0795A994201D20B460546401CC0B28445E6D8FF2E01D0A2 -:40324000304602E0FF2D03D0284600F029F804E0FF2038760020C04378830098F8BD0000CC1E0008F2220008FFFF000001001600F0B58C4600230FE00022C91A491E08E05C -:403280009600371884597D68AC4201DD85517C60521C9142F4DC5B1C61466345ECDBF0BDFEB5064615480621374606764F43C15B41830146002479181148009100780190C1 -:4032C00016E006200D49604345182879012801D002280AD1B44208D06888C95B421800984088101AEFF7FEFC6980641C0198E4B2A042E6D8009800214180FEBDF22200088D -:40330000CC1E00080348C078002801D000207047012070478025000810B5012200F046F810BD000010B5054802780121002A017002D10120F2F734FB002010BD0C02000888 -:4033400070B5144D297803200129287002D10120F2F726FBEDF7CFF8EFF7E0FA00246C60FF22813221460C48F1F7CCF8F02200210A48F1F7C7F80948F030C47004704470B4 -:40338000C47304734473EDF7B2F8EFF7B1FA002070BD00000C020008102300089024000810B5002200F002F810BD0000F8B515460C460646EDF79FF8EFF7B0FA264A1078E8 -:4033C000012808D01078022805D0EDF790F8EFF78FFA1120F8BD0C20464320483018C1788378994205D3EDF782F8EFF781FA1220F8BD46780C277E43416867687118266851 -:40340000A4684F600E608C60C178431C491CC1704178491CC9B219708078814201D1002018705068401C50601078012805D0EDF75EF8EFF75DFA0020F8BD02201070EDF7D6 -:4034400056F8EFF755FA002D03D00020F2F7A8FAF1E70120FAE700000C0200088025000810B51248002101704160FF2281321048F1F748F8F02200210E48F1F743F80D48DA -:4034800018220021F030F1F73DF80A482021F03081701421817306494160064901610649816006494161F2F761FA10BD0C020008102300089024000843EB0010456C0110C7 -:4034C000F8B50025164C01262F462078002815D0012813D0022802D003281CD11AE000F021F8EDF708F8EFF719FA6068002800D12670ECF7FCFFEFF7FBF90CE0ECF7FBFF7F -:40350000EFF70CFA2078002802D020780128F0D10125EEE72770002DD7D00020F8BD00000C020008FEB5214D214E0027FF24ECF7E2FFEFF7F3F900200C2141438919C97816 -:40354000002901D0044602E0401C0228F4D3FF2C2AD00C204443A41921780C2260685143081801460EC9029301920091076047608760E078401EE0702078401CC0B2207038 -:40358000A178884200D127706868002802D06868401E6860ECF7ABFFEFF7AAF9A1680029C4D068468847C1E7FEBD00000C0200088025000810B5830A082B04D03F2B05D0E9 -:4035C00004F078F810BD00F025F910BD01F0A8FB10BD10B50C460146207800F02BFE0028204603D003F0DFFA002010BD00F082FD1F2010BD38B504460020009069460520FF -:4036000000F071FD00280AD101200099052C07D010220A708C704870FF20FFF7DAFF38BD1A220A708870F6E710B5820A082A04D03F2A05D004F0F0F810BD00F015FA10BD8F -:4036400001F072FB10BD0000F8B5044640782578000205430020694608702846FFF7E4FF01282BD16946A0780978884226D022498D420CD0891D8D4209D0C91C8D4206D0E0 -:40368000C91C8D4203D01C4925318D4204D11221284600F0A1F80CE00022022805D32079E178000201430A05120D12212846FFF781FF204603F0C8FD1220F8BDA80A0F4E59 -:4036C00008280ED03F282A46314610D0E01C04F0EDF8204603F0B8FD3146284600F010F8F8BD2A463146E01C00F0CEF9F1E7E01C01F070FBEDE700000D2000009825000889 -:40370000F8B50D4604460020694608702E48871D844212D0BC4210D0F81C84420DD0C01C84420AD028481830844206D0401C844203D025482530844201D101200870A00A3F -:4037400008280ED03F280A46294620460FD004F0FFF806466846007800280BD001281FD116E00A462946204600F0C2F9F1E701F051FCEEE70022002D05D0687829780002FF -:4037800001430A05120D31462046FFF713FF07E0BC4201D13A2E05D03146204600F01CF83046F8BD68782978000201430805000DF5F7D2FC05460021204600F00DF83A21F5 -:4037C0002846FAF774F8EBE70D2000000148007B70470000A0210008F8B5054600200E4600906946082000F07EFC002801D00720F8BD009C0F202070A670FFF7E7FFE0700C -:403800002571280A6071042060702146FF20FFF7E0FEF8BDF7B584B00546002002900420694608718649874B681A0C22EE1806278D423BD010DC8449681A8D4230D006DC79 -:40384000002E28D0012E28D0052E13D128E006282AD009280ED120E0172829D006DC012824D0022819D0162804D11FE019281FD01A281DD07549284609688847694609794C -:40388000401869460871724928460968884769460979401805E0781C03E06846027107E005206946087103E00B20FAE7684607716846007902A9001D00F015FC002802D0E6 -:4038C000072007B0F0BD029C29462046059A00F001F90420694608715949491C681A8D420AD005DC5B48281806D005280BD103E0072801D0152806D10699A171069968462B -:40390000090AE17107710598002821D14C49491F681A8D425AD009DC4F4F002E20D0012E2FD0052E44D00D2E06D148E003285CD0072866D01B286FD0484B01AA1B682146C5 -:4039400028469847464B01AA1B682146284698476846007960702146FF20FFF73AFEB0E769460979387D6118887069460979000A6118C87069460879801CC0B20871797D55 -:403980005BE06946087908222018801C0021F0F7B9FDB87AF52108406946097961188870F87A6946C0070979C00F6118C87023E0F3F708FC05E069460879401C1FE0F3F779 -:4039C00021FC6946097961188870F4E7684600792118891C0698F3F700FC002801D06071B6E769460879401D09E06946087908212018801C03F05DF9694608790830087170 -:403A0000A6E76946087914492018801C08221831F0F76FFDF0E7FFE7124A694612680698904760716946087809796118887069460879401CC0B20871497820188170BAE726 -:403A40001A200000FEDFFFFF0F2000004C0200083C020008EBDFFFFFAC1E0008480200083802000858020008064AC0B21378834206D3401E1269C0B2105C087001207047E4 -:403A8000002070471402000830B4074BD2B21C78944206D39B689200D218403AD26B30BC104730BC704700001402000807484E21017007494160FF3139318160FF313931A5 -:403AC000C160FF313931016170470000140200084449001070B504460E2016460D462070FFF774FEA070E570280A2071667170BDF8B50D4D16460F46C1B22A780120914206 -:403B000010D88C00E868314620184038C26B38469047002806D16868314620184038C26B38469047F8BD000014020008F8B5054600260D4F69460620009600F0D4FA002802 -:403B400001D00720F8BD009C324639462046FFF7C1FFA571280AE071062060702146FF20FFF737FDF8BD00001F20000070B50446054640220021F0F7C5FC40222349284695 -:403B8000F0F7B7FC2249F522887A20341040C0060028207802DA3022104301E0CF2210402070887AC2070720002A2A7F01D0024301E0D208D2002A778A7A93060122002B96 -:403BC0000ADA6378C0252B436370A37808251343A370E3782B43E3708B7A5B060AD5A378F8252B43A370E3780343E370E07904231843E071C87AC00706D0E078F021084362 -:403C0000E07020791043207170BD0000654E0010AC1E000810B50022F3F776FB10BD10B5F3F7D0FB10BD002070470120704710B5F3F74AFC10BD0020704710B5F3F746FC66 -:403C400010BD0000044A0178D180407800020143D180002070470000A021000810B5F3F7E3FC10BD10B5F3F7FBFC10BD10B5F3F703FD10BD10B5F3F70DFD10BD38B5044669 -:403C80000020009069460E2000F02DFA002801D0072038BD00993E200870032088702078C870A07808716088000A487120798871A088000AC871A0790872E088000A4872F9 -:403CC000207A88722089000AC8720A2048700320FFF77FFC38BDF8B50546002000906946232000F000FA002801D00720F8BD009C3E2020700A2100F09DFA014601200029B2 -:403D000046D001260A20A07007462878E070A978217169880622090A61716878A0712879E0712046294608300C31F0F7E2FB0C20002E0ED0204629460E3006221231F0F790 -:403D4000D8FB20462946143006221831F0F7D1FB1820AA7921188A70EA88801C120ACA702A7A21188A702A89801C120ACA70AA7A21188A706A89801C120ACA70221869796D -:403D80009170401C607021463846FFF722FCF8BD0026A0700127B8E7F8B5044600200E46009015466946082000F09DF9002801D00020F8BD0099082008708E70CC70200A0D -:403DC00008714D7104204870FF20FFF702FCF8BD38B50C460021054600916946072000F082F9002801D0002038BD0099302008708D70CC70200A087103204870FF20FFF730 -:403E0000E8FB38BD38B50546002000906946112000F069F9002801D0002038BD009C3E2020700520A0702878E07028880822000A2071601D6968F0F75CFBA9680D200A7812 -:403E400062734978A173607021460520FFF7C1FB38BD38B5054600200C4600906946092000F041F9002801D0002038BD00991320087001208870CD70280A08714C71200A1F -:403E8000887105204870FF20FFF7A3FB38BD38B50546002000906946102000F024F9002801D0072038BD009C3E2020700420A0702878E070A87820716888000A60712878D1 -:403EC00000280BD0A01D08220021F0F71BFB0C20607021460420FFF77CFB38BDA01D0822A968F0F706FBF2E738B504460020009069460C2000F0F7F8002801D0002038BD69 -:403F000000990C20087020788870A078C8706088000A08716078487120798871A088000AC871A0790872E088000A487208204870FF20FFF74EFB38BD38B504460020009092 -:403F40006946062000F0CFF8002801D0072038BD0099572008708C70200AC87002204870FF20FFF736FB38BDF8B5064600200C46009015466946082000F0B5F8002801D0E2 -:403F80000020F8BD0099052008708E70CC70200A08714D7104204870FF20FFF71AFBF8BDFEB507460020009010480E46019015466946082000F097F8002801D00720FEBD27 -:403FC000009C324620460199FFF784FDA771380AE0710620002E03D1290A25726172082060702146FF20FFF7F4FAFEBD7B0C0000F8B5054600200E4600900C4F69460620F6 -:4040000000F071F8002801D00720F8BD009C324639462046FFF75EFDA571280AE071062060702146FF20FFF7D4FAF8BD7C0C000010B5F5F7E3F910BD10B5F5F73BFA10BDE5 -:4040400010B5F5F759FA10BD10B5F5F7BBFB10BD10B5F5F7D2FB10BD10B5F5F761FC10BD10B5F3F7C7FA10BD10B501220A70F5F743FD10BDF8B505460020074600900D4E2D -:404080006946142000F02FF8002801D00720F8BD009C3A4631462046FFF71CFD1022A01DA918F0F726FA142060702146FF20FFF790FAF8BD1720000010B5F3F799F910BD6E -:4040C00010B50029014601D00B2000E00220FFF780FA002010BD10B5FAF70CFC10BD10B5FAF730FC10BD0A4610B5C1B2104603F02BF810BD10B503F0C3F810BDF8B50546FD -:40410000C078AE78154C00020643A07C27468000C03FC019403004222946F0F7EAF9A07C238A8100C81940302A1D102B15D07D50A17C00234900C91980310E80A17C0B55CF -:40414000A17C491CC9B2A174102900D3A374218A491C2182114602F017FDF8BD9C2600083EB5134C0025E07C21460555E07CC0398000085803F09AF8E07C401CC0B2E074AF -:40418000102800D3E574208A401E20820948807A00280CD00095019511206A4602951081558129460A460020029B03F088F93EBD9C260008A021000870B5184C0025207AD2 -:4041C000002825D1F1F764F915488574C574058225726572A572A5821DE0A07A00280DD0401EA0720D4A0006410DC03A8818515C4068022907D0042907D101E01920F0E77C -:4042000003F03EF801E0FFF7ABFFE07A401EE072E07A0128E1D80348057070BD702700089C2600082802000810B5FFF7C5FF002010BD00001C4B13285A7A31D00EDC0E2803 -:404240002ED006DC052820D0082827D00C2829D11DE00F2824D0102824D11FE03E280AD004DC1A2817D030281CD112E0572814D0FF2817D114E0500614D5491E0120884023 -:40428000D98880B201420BD10CE0012006E0802004E0202002E0022000E00420024201D00120704700207047A021000838B505460020009069460920FFF715FF002801D03D -:4042C000072038BD009CFF2020700320A0702878E07028880422000A2071601DA91CF0F708F9072060702146FF20FFF772F9002038BD03B583B0002069460090888001AAA9 -:4043000004A91220F1F7F6F969460320FFF7EBFE00280ED10099FF2008700620887068468088C870000A087103204870FF20FFF750F905B000BD03B583B00020694600905B -:40434000888001AA04A91120F1F7D4F969460320FFF7C9FE00280ED10099FF2008700720887068468088C870000A087103204870FF20FFF72EF905B000BD000038B50446E1 -:4043800000200C4900900878401E087069460520FFF7A9FE00280CD10099FF20087002208870200ECC70087103204870FF20FFF710F938BD2802000810B50B4C617E0029BB -:4043C0000BD00A49884209D1F2F7D8FB607E022801D1F0F76FFF0020607610BD02F0F4FB607E00F031FF10BD5C210008C0FD0000FEB5044600200290607F0F46401CC6B298 -:4044000002A9301DFFF76FFE002801D00720FEBD029D21463931E81D019100902246637F1E3229392046F2F727FA0C49884204D12846FFF75FFE1220FEBD002208492846C0 -:40444000FFF748FB607FA871361D6E70022038702946FF20FFF7BDF80020FEBD01001600A9FD0000FEB5044600200290607F0F46401DC6B202A9301DFFF735FE002801D06D -:404480000720FEBD029D2246A91D481D019100902146637F1E3210312046F2F715FA0C49884204D12846FFF725FE1220FEBD002208492846FFF70EFB607FA872361D6E701C -:4044C000022038702946FF20FFF783F80020FEBD01001600A8FD0000F8B5044600200E46009069462420FFF7FEFD002801D00720F8BD009D002225492846FFF7EBFA2146CB -:404500002046AA1D20311030F2F700FA002804D02846FFF7EFFD1220F8BD2178A97521882846090AE97521681C30090C29762168090E69762179A976A188090AE976616843 -:40454000090C29776168090E6977217AA9772189090AE977A168090C0171A168090E4171217B001D8170A189090AC170E168090C0171E168090E41712420687002203070B4 -:404580002946FF20FFF725F80020F8BDADFD00000120704738B500200D46009069461020FFF7A1FD002801D0072038BD009C00220B492046FFF78EFAA11D0020F6F760FC6E -:4045C00021460C310120F6F75BFC10206070022028702146FF20FEF7FCFF002038BD0000A1FD00007CB500200D46009069460620FFF779FD002801D007207CBD009C002243 -:404600000B492046FFF766FA01A8F1F7D7F868460079A07168464079E07106206070022028702146FF20FEF7D4FF00207CBD0000A2FD000010B5012008700024034803F064 -:40464000BFFA002800D00C24204610BDF342011010B5012008700024034803F097FA002800D00C24204610BD37430110F3B5044683B000200190207D002601461131CAB20B -:40468000332802D9122005B0F0BD01A9101DFFF72AFD002801D00720F5E7019D002232492846FFF717FA2068FAF7A2FE277DAF710520009009E080194019801C394602F016 -:4046C000F8FA0836083FF6B2FFB20098082FF2D880194019801C394602F0EBFA217D009822790818C1B268188270A288091D120AC2706268C9B2120C02716268120E427186 -:40470000227A681882702289091D120AC270A268C9B2120C0271A268120E4271227B68188270A289091D120AC270E268C9B2120C0271E268120E4271227C68188270228A7C -:40474000091D120AC2702269120C02712269120E427169700498022101702946FF20FEF738FF00208FE70000ACFD0000FEB50F460546FF2069460871002000902888F4F764 -:40478000EBFC060027D0F5F760FB002823D069460720FFF7A8FC002801D00720FEBD009C00220E492046FFF795F92878A07128880223000AE07101AAFF213046F5F7ABFBB5 -:4047C000207207206070022038702146FF20FEF700FF0020FEBD0220FEBD0000AAFD000010B500240C708179002904D0012905D01224204610BDF8F7C9FAFAE7F8F7FEFA4F -:40480000F7E70000F8B505460F460088F4F7A4FC04006FD0F5F719FB00286BD00020009069460620FFF75FFC002801D00720F8BD009EF6F7A1FA2046F2F7EAFC00283FD156 -:40484000FAF7FAFC5E210A5B6179F3F723FC2246A0320146537D2848012B837A05D09B060DD5B0231B595B890AE09B0603D5B0231B595B8900E01B23DB00703302E01B23D3 -:404880009B003C33127D807A9BB2012A05D080060DD5B0200059008B0AE0800603D5B0200059008B00E01B20C000703002E01B2080003C3082B2103189B22046F9F770FE08 -:4048C00068886034E080F6F773FA00220B493046FFF700F92978B17129880620090AF1717070022038703146FF20FEF772FE0020F8BDFFE70220FBE7AC1E0008B0FD0000AD -:4049000010B500240C70F0F787FF0349884200D11224204610BD000001001600F8B504460E460088F4F718FC05002AD0F5F78DFA002826D0A178A878FDF72CFC002801D08E -:404940001220F8BD0020009069460620FFF7CBFB002801D00720F8BD009D00220A492846FFF7B8F82078A87120882946000AE8710620687002203070FF20FEF72AFE0020CD -:40498000F8BD0220F8BD0000B2FD0000F8B504460F460088F4F7E0FB050043D0F5F755FA00283FD00020009069460620FFF79BFB002801D00720F8BD2879009E09280CD066 -:4049C0002389E288A1886088FDF776F8002806D03046FFF78FFB1220F8BD0C220FE0E87E810604D5A97D890601D41A2207E0C00604D42046FCF7EAFF024600E023220A4923 -:404A00003046FFF767F82178B17121880620090AF1717070022038703146FF20FEF7D9FD0020F8BD0220F8BDB1FD0000024600200870024912784A7370470000A021000855 -:404A4000F8B504460F460088F4F786FB060026D0F5F7FBF9002822D00020009069460620FFF741FB002801D00720F8BDA178B078009DF8F7C1FB00220A492846FFF72AF8F0 -:404A80002078A87120882946000AE8710620687002203870FF20FEF79CFD0020F8BD0220F8BD0000ABFD0000F3B5044683B000200090054621786A46517101202056032617 -:404AC0001071002809D0042807D0821D05D0921D03D0121D01D0143007D101290FD001A8F0F7C0FE2949884200D112256946301DFFF7F9FA002830D0072005B0F0BD608806 -:404B0000FF2811D0F4F728FB070000D10225F5F79CF9002806D0002DE8D1EDF7FFFE6078387317E00225E1E7EDF7F8FE0020184B184A08E0D027196A4743C91901D0677874 -:404B40000F73401CC0B211788142F3D8104861784030C170EDF7CCFEC8E7009E2A460E493046FEF7B7FF2078B071A078F07160880221000A307207207070049801703146A5 -:404B8000FF20FEF726FD2846B7E70000010016005C210008CC1E0008A5FD000010B5044602200870F7F7D8FE207800F04DFB10BD7CB505460020184C009020780E461228C2 -:404BC00007D22979154B01A82A68F0F727FF002801D00C207CBD20786946401C20700620FFF781FA002801D007207CBD009C00220B492046FEF76EFF2879A071684600795E -:404C0000E07106206070022030702146FF20FEF7E0FC00207CBD0000280200087D430110C1FD0000F8B505460020154C009020780E4600280FD06878F0F776FF002802D1C7 -:404C40002078401E207069460520FFF74CFA002803D00720F8BD0C20F8BD009C002209492046FEF737FF2878A07105206070022030702146FF20FEF7ACFC0020F8BD0000E5 -:404C800028020008C2FD000038B500200D46009069461020FFF727FA002801D0072038BD009C00221C492046FEF714FF1B48016B0978A171016B0988090AE171016B897846 -:404CC0002172016B4988090A6172016B0979A172016B8988090AE172016B89792173016BC988090A6173016B097AA173016B0989090AE173016B897A2174006B214640896D -:404D0000000A60741020607002202870FF20FEF760FC002038BD0000A7FD00005C21000810B502F0C7FC10BD10B5264B0022C41A98423CD01FDC244BC41A98423CD011DCAF -:404D4000224C031BA0422AD007DC214BC01822D0012822D0C92832D12EE0012B2CD0022B2DD129E02300F5F7BFFD092A271618272A2A181E2A002300F5F7B6FD18211B1ED7 -:404D80001E0D1D151E13212121212121212121212113170F132104220EE002220CE007220AE0012208E0032206E0052204E0152202E0302200E00A220A70012010BD002036 -:404DC00010BD0000ACFD0000A3FD0000A0FD00009A03FFFF10B53D4BD41A9A425AD01CDC3B4BD41A9A4240D00FDC3A4C131BA2422FD005DC384BD31825D0012B20D125E0E4 -:404E0000012B29D0022B1BD12CE0641F2300F5F76BFD062F3217383B3E17092C52D007DC2300F5F761FD080D40430D0D461C490D152C23D0162C30D0172C31D0182C3ED0CB -:404E400000F0B2FF10BD00F022FD10BD00F040FC10BD00F053FC10BD00F026FD10BD00F02AFB10BD00F0B0FC10BD00F0FEFA10BD00F04CFB10BD00F010FB10BD00F051FBFB -:404E800010BD00F039FA10BD00F016FA10BD00F0E5FA10BD00F031FB10BD00F045FB10BD00F053FB10BD00F08FFA10BD00F03CFA10BD00F0E5FA10BD00F0F4FA10BD00F06B -:404EC00019FB10BD00F046FB10BD0000ABFD0000A0FD000049FD00009A03FFFF3EB50020009001900290012008700D4602A90C20FFF7F9F8002801D007203EBD029C002262 -:404F000010492046FEF7E6FD01A96846F2F7D6FB0098A071010AE171010C2172000E60720198A072010AE172010C2173000E60730C206070022028702146FF20FEF749FB42 -:404F400000203EBDB3FD0000F7B582B006460027012000971070154669460620FFF7C3F8002802D0072005B0F0BD009CF00701D01220F8E73A4620460399FEF7ABFD084895 -:404F800030180068A071000AE07106206070022028702146FF20FEF71CFB0020E3E7000000103C4010B50A4600880249FFF7CCFF10BD000067FC0000FEB5064600270120FD -:404FC000009708700D4669460820FFF78CF8002801D00720FEBD009C3A460D492046FEF779FD01AA31460520F0F784FB0198A071010AE171010C2172000E607208206070B4 -:40500000022028702146FF20FEF7E3FA0020FEBD49FD000070B5674B0E460024C11A664D984270D020DC654BC11A984257D013DC634BC11A984238D007DC6249411825D088 -:40504000012928D0E3296ED12AE0012932D056293BD0572967D13DE00B00F5F745FC08A6454A4F555F656AA60C240B00F5F73CFC1A9D6B70752B2B7A267F93989D9D9D9DC7 -:405080009D9D9D9D9D9D9D5184898E9D1146304600F09AF816E011463046FFF783FF70BD11463046FFF788FF70BD1146304600F0BFF870BD3046F7F769FE04E011463046D1 -:4050C0006A682EE00446204670BD11463046FFF787FBF7E711463046FFF75CFAF2E711463046FFF77FFAEDE711463046FFF7B0FAE8E711463046FFF79DFAE3E711463046A1 -:40510000FFF7D2FCDEE719E011463046FFF7F8FBD8E711463046FFF741FDD3E71146AA6830469047CEE740E011463046FFF79AF9C8E711463046FFF75BF9C3E7114630469F -:40514000FFF714FBBEE711463046FFF779FCB9E711463046FFF78AFAB4E711463046FFF7BBF9AFE711463046FFF74CFBAAE711463046FFF7D3FBA5E711463046FFF718FD2E -:40518000A0E711463046FFF74DFD9BE711463046FFF74CFC96E711463046FFF79FFE91E71146304600F01EF88CE7314600F01EFE88E70000AAFD000028020008A2FD0000C9 -:4051C0004AFD00009A03FFFF0188CA0701D012207047034A40888918086000207047000000103C40F8B5064600200090012008700D4669460C20FEF776FF002801D007203E -:40520000F8BD009C002209492046FEF763FC3078F2F75CFAA07105206070022028702146FF20FEF7D6F90020F8BD0000B4FD00000EB5017800914068019002AA69460420F3 -:40524000F0F758FA00200EBD38B505460020009069460520FEF747FF002801D0072038BD009C002207492046FEF734FC064821464576A57105206070FF20FEF7AAF9002013 -:4052800038BD0000C0FD00005C21000803480249416081607047000091450110280200080348024941600349816070478D49011028020008894C011070B50D4604460146AC -:4052C00010222846EFF715F92146284610310D221030EFF70EF9214628461D3104223930EFF707F92120225C214628466A7722311E30EFF7FEF870BD70B50D4604460146E8 -:4053000010222846EFF7F5F82146284610310D221030EFF7EEF8627F214628466A771E311E30EFF7E6F870BD70B50C46054601461022A018EFF7DDF829462046103110228E -:405340002030EFF7D6F82022A818C1780902216083781943090221604078014308022060A95C0843242120606818C2781202626083781A4312026260407802431002606057 -:40538000695C0843282160606818C2781202A26083781A431202A260407802431002A060695C08432C21A0606818C2781202E26083781A431202E260407802431002E0601D -:4053C000695C0843E06070BD10B5C27812020A6083781A4312020A6043781A4312020A6003781A430A6002790A75037A1B024B60C47923431B024B60827913431A024A6044 -:4054000043791A434A60037B1B028B60C47A23431B028B60827A13431A028A60437A1A438A60037C1B02CB60C47B23431B02CB60827B13431A02CA60437B1A43CA60037D09 -:405440001B020B61C47C23431B020B61827C13431A020A61407C02430A6110BD427812020A80007802430A80704770B50C460546014606222046EFF73CF8A879A07170BDFA -:40548000427812020A8003781A430A80C27812024A80807802434A80704702780A70407848707047427812020A8003781A430A80807888707047427812020A8003781A43B0 -:4054C0000A80C27812024A8083781A434A80427912028A8003791A438A80C2791202CA8083791A43CA80427A12020A81007A02430A817047007808707047427812020A8095 -:4055000003781A430A8080788870704702780A7042784A70C27812024A80807802434A807047007808707047C27812020A6083781A4312020A6043781A4312020A600378DE -:405540001A430A6000790871704702780A7040784870704700780870704710B50B460178401C197001460622581CEEF7C2FF10BD034610B5084608221946EEF7BAFF10BDDF -:40558000427812020A8003781A430A80C27812024A8083781A434A80427912028A8003791A438A80C2791202CA8083791A43CA80427A12020A81037A1A430A81C27A1202EF -:4055C0004A81837A1A434A81427B12028A81007B02438A81704770B5054640780C46000208802978062208432080E87800026080A978084360802879207168796071A91D6D -:40560000A01DEEF776FF287B2076A87B0002A081697B0843A081287C0002E081E97B0843E081A87C00022082697C08432082287D00026082E97C08436082A87D0002A0826F -:40564000697D0843A082287E0002E082E97D0843E08270BD7047427812020A8003781A430A8080788870704770B50D460446014610222846EEF73DFF214610221031A81811 -:40568000EEF737FF70BD034610B5084640221946EEF72FFF10BD427812020A80007802430A80704710B50B4641780A021A800178801C0A431A8001461022981CEEF719FFB4 -:4056C00010BD427812020A80007802430A807047427812020A80007802430A807047427812020A80007802430A8070477047427812020A80007802430A80704700780870DE -:405700007047427812020A80007802430A807047427812020A8003781A430A80807888707047007808707047427812020A80007802430A80704710B50B460178401C19708A -:4057400001460622581CEEF7D4FE10BD10B502780B460A701F2A03D8411C581CEEF7C9FE10BD00780870704770B5054640780C46000208802978062208432080E878000289 -:405780006080A978084360802879207168796071A879A071E91DE01DEEF7ABFE687B6073A87BA07370BD0022835C0B70521C491CD2B2082AF8D37047034610B508460522F3 -:4057C0001946EEF796FE10BD034610B5084606221946EEF78EFE10BD034610B5084606221946EEF786FE10BD02780A7040784870704702780A71827812020A8043781A430A -:405800000A80027912024A80C3781A434A8042794A7180798871704710B502780B460A701F2A03D8411C581CEEF763FE10BD70B5054640780C4600020880297808220843D8 -:405840002080A91C201DEEF754FEE87A102200026080A97A08436080294620460C310C30EEF747FE70BD02780A7042784A70807888707047427812020A8003781A430A801D -:40588000C27812024A80807802434A807047427812020A8003781A430A80C27812024A80807802434A80704702780A70027912024A60C3781A4312024A6083781A43120293 -:4058C0004A60407802434A60704710B504460088F2F774FB00280AD0A07815280FD008DC05280CD013280AD0142806D107E0022010BD1A2803D03B2801D0122010BD002028 -:4059000010BD012070470078012801D912207047002070470020704710B50446012008702088F2F74BFB002822D06188A08881421CD8114A891F914218D2511D884215D86A -:4059400021890D4B0A460A3A1B1F9A420ED2E288FF23F4339A4209D8521C4243C9005000814203D9A0896189884203D2122010BD022010BD002010BD7B0C00000020704795 -:4059800010B501220A700179037E0A46194303292FD8002A02D1417903292AD8018842888A4226D8154B091F994222D2042A20D38289C1898A421CD8114B921F9A4218D249 -:4059C0005A1D914215D8428A0D4C13460A3B241FA3420ED2038AFF24F434A34209D85B1C4B43D20059008A4203D9C18A808A814201D2122010BD002010BD0000FD3F00001C -:405A00007B0C0000002070470020704710B50088F2F7D4FA002801D0002010BD022010BD10B50088F2F7CAFA002801D0002010BD022010BD10B50088F2F7C0FA002801D0A0 -:405A4000002010BD022010BD10B501220A700088F2F7B4FA002801D0002010BD022010BD002070470078272801D912207047002070470078012801D9122070470020704781 -:405A800010B501790388428804291BD801290AD0934217D80124A403A24213D8202B11D3827B032A0ED8012901D0042902D18179032907D84179032904D8407B410701D0FA -:405AC000C00800D0122010BD00781F2801D9122070470020704741780A09817812011143C2780A430179114342790A438179C0791143084300D01220704701794A090AD1FA -:405B0000027843781A438378C07803431A430A4301D0002070471220704700207047017840780143012901D91220704700207047017901290FD8018842888A420BD8084B2F -:405B4000091F994207D2042A05D34179032902D88079032801D912207047002070470000FD3F000010B501220A700088F2F726FA002801D0002010BD022010BD00207047EA -:405B80000178272902D88078072801D9122070470020704710B50088F2F710FA002801D0002010BD022010BD0120704710B50088F2F704FA002801D0002010BD022010BD8B -:405BC00010B504460088F2F7F9F9002804D0A078012803D9122010BD022010BD002010BD0020704710B504460088F2F7E7F9002804D06088002803D0002010BD022010BD4D -:405C0000122010BDF8B50E460021054600910120307069460820FEF766FA002801D00720F8BD2868009C056800220A492046FDF751FFA571280AE071280C2072280E607286 -:405C400008206070022030702146FF20FDF7C1FC0020F8BD26FD000010B50020F1F7C2FC002010BDC27812020A6083781A4312020A6043781A4312020A6003781A430A605D -:405C800002790A71407948717047C27812020A6083781A4312020A6043781A4312020A6003781A430A60007908717047C27812020A6083781A4312020A6043781A431202FC -:405CC0000A60007802430A60704710B5C27812020A6083781A4312020A6043781A4312020A6003781A430A6002790A71182A01D918220A71002205E083188C185B79521CE2 -:405D00002372D2B20B799342F6D810BDC27812020A6083781A4312020A6043781A4312020A6003781A430A60C27912024A6083791A4312024A6043791A4312024A60007990 -:405D400002434A60704700003EB500200290012008700D4602A90820FEF7C5F9002801D007203EBD6846029CEFF7EAFA00220D492046FDF7AFFE68460078A0716846407819 -:405D8000E07168468088207268468078607208206070022028702146FF20FDF71AFC00203EBD00002FFD00000F4B00B5D2181300F4F79AFD0B070A0D090916101309070A2D -:405DC0000900FFF762FF00BDFFF77FFF00BDFFF749FF00BDFFF76AFF00BDFFF797FF00BD0078087000BD0000E002FFFF10B50C4601460F4B0020C9180B00F4F775FD0D0C2E -:405E00000D0C080C1717171717170C12170011462046FFF7F7FE10BD11462046FFF71CFF10BD11462046FFF78FFF10BD012010BDDD02FFFF70B5054600780C468872691CD4 -:405E40000622201DEEF755FB2046E91D10221B30EEF74FFB29462046173110220B30EEF748FB70BD704710B50B460178401C197001460622581CEEF73CFB10BD10B50B4684 -:405E80000178401C197001460622581CEEF731FB10BD704710B50B460178401C197001460622581CEEF725FB10BD007808707047427812020A80007802430A80704770B5C1 -:405EC000054600780C460870691C0622601CEEF710FBE879E07170BD7047002070470000F8B50D46114914781646411808D0104807460E37007D012908D002290BD10CE0C0 -:405F0000FAF7FEFA29198870641C03E02A19921C012305E0E4B23470F8BD2A19921C00233946FAF7C7FA6871A41DF3E7D6DFFFFFA02100080649401805D0012805D0022819 -:405F400003D00020704701207047062070470000D6DFFFFF10B50022F9F744FCC0B210BD10B5FAF7D3F810BD10B5FAF795FA10BD10B5FAF791FA10BD0020704710B5FAF7BE -:405F8000C5FA10BD10B5FAF7C1FC10BD10B5FAF7D5FC10BD10B5FAF7EFFC10BD10B500F025F810BD014A12681269104734020008014A1268D269104734020008014A126885 -:405FC000926A104734020008014A1268D26C104734020008014A1268926D104734020008014AD2685268104734020008807A012801D912207047002070470078012801D913 -:40600000122070470020704700207047002801D000207047122070470078012801D91220704700207047000000880449401E884201D312207047002070470000B8A10000EB -:406040000178012902D8C079012801D91220704700207047014A12681268104734020008014A12689269104734020008014A1268D26B104734020008014A1268126B10474E -:4060800034020008014A1268526A104734020008014A1268D268104734020008014A1268926C104734020008014A1268526D104734020008014AD2681268104734020008F3 -:4060C00004480349016004494160044981607047084F001034020008D95E0110DB5E011006480549016006494160064981600249C031C16070470000A84E00103402000828 -:40610000E15E0110355F0110014A12689268104734020008014A1268126A104734020008014A1268526C104734020008014A1268926B104734020008014A1268D26A104779 -:4061400034020008014A12685269104734020008014A1268126D104734020008014A1268D26D104734020008014AD268926810473402000870477047427812020A80037805 -:406180001A430A80C27812024A8083781A434A80427912028A80007902438A807047427812020A8003781A430A80C27812024A80807802434A8070470749401805D0012830 -:4061C00005D00D2805D0002070470220704704207047082070470000DEDFFFFF0020704770470000FEB50D4627491646147840180022002802D00C2844D115E06B461A71C1 -:4062000001A96846FBF75EFA6B461988281981701988A41C090AC170E0B25A8829188A705A88120ACA702BE069460A7202A96846FBF732FA6946898828198170694689884D -:40624000A41C090AC170E0B269462A18C98891706946C988801C090AD170C0B269462A180988917069460988801C090AD170C0B2694649882A18917069464988090AD17027 -:40628000801CC4B23470FEBDDDDFFFFF38B504460020009069460F20FDF725FF002801D0072038BD00993E200870072088702078C8702088000A0871A07848716088000A75 -:4062C00088712079C871A088000A0872A0794872E088000A8872207AC8722089000A08730B2048700720FDF774F938BD10B5FBF7D3F910BD10B5FBF7E5F910BD10B5FBF71D -:40630000F1F910BD10B5FBF713FA10BD014A1268926A104744020008014A12681269104744020008014A12685268104744020008014A1268D269104744020008002801D008 -:406340000020704712207047002801D0002070471220704710B504460088F1F72FFE002816D0618808461B38E1280FD2A0880A4A90420BD8FF224932904207D3074A126B2F -:406380009388994202D8D188884203D9122010BD022010BD002010BD480800005C21000810B50021002815D0028813461B3BE12B0FD24088084B98420BD8FF2349339842F5 -:4063C00007D3064B1B6B9C88A24202D8DA88904200D91221084610BD480800005C210008014A1268526A104744020008014A1268D268104744020008014A1268126810477A -:4064000044020008014A1268926910474402000804480349016004494160044981607047804F001044020008E1610110DD6101100448034901600449416004498160704742 -:40644000B04F001044020008E5610110B9610110014A1268D26A104744020008014A12685269104744020008014A12689268104744020008014A1268126A10474402000828 -:4064800002780A7042784A7080788870704702780A7042784A7082788A70C078C8707047427812020A80007802430A80704702780A7042784A708078887070474278120217 -:4064C0000A8003781A430A8082788A70C278CA7002790A7182791202CA8040790243CA8070470000014A1268926A104750020008014A1268526B104750020008014A126890 -:406500005268104750020008014A12681269104750020008014A1268D2691047500200080178272907D84178012901D0022902D18078012801D912207047002070470178C0 -:40654000272907D8C178012901D0022902D18078072801D9122070470020704710B50088F1F72CFD002801D0002010BD022010BD017803290FD84278032A0CD8807803284C -:4065800009D8CB0701D1002A05D0890701D4002801D0002070471220704710B504460088F1F70CFD00280BD0A078032812D8E17803290FD82279032A0CD8C30702D003E0EA -:4065C000022010BD002905D0800701D4002A01D0002010BD122010BD014A1268526A104750020008014A1268126B104750020008014A12681268104750020008014A126891 -:40660000D268104750020008014A1268926910475002000804480349016004494160044981607047E04F00105002000835660110D166011000207047044803490160044988 -:4066400041600449816070471C50001050020008596601108D27011038B504460020009069460A20FDF73FFD002801D0072038BD00993E2008700C208870A078C8702078A9 -:4066800008712088000A4871E07888712079C871062048700C20FCF79CFF38BD014A1268D26A104750020008014A1268926B10475002000800207047014A12685269104773 -:4066C00050020008014A1268126A1047500200080020704710B50B48017A01290ED0C17A00290CD001210172407A064BC000C03BC1184A884968185CEEF7CEFE10BD0021D2 -:40670000017210BD7027000870B503461448C47A192C0BD3022B05D0042B02D10846FDF7E9FC70BD0846FDF71BFD70BD847AE5000B4CC03C6355837ADB001B195960817AC2 -:40674000C90009194A80C17A491CC172817A491CC9B281721929E8D30021817270BD00007027000810B50F4CE17A002918D0617A2246C900C03A515C022904D0042904D1A6 -:40678000FDF7B8FC01E0FDF7EBFCE07A401EE072607A401CC0B26072192801D30020607210BD000070270008F7B5A14C84B02046E030039009380090401E0E46C0340190A0 -:4067C000E07B354601281CD0A07B012836D0A18A4A19082A02D90822511A8DB2002D0CD0002833D0A18A206A4018401E2A460499EDF77FFEA08A4019A082207C012829D085 -:406800002FE0A08A618A42198A4204D280B28019A08207B0F0BD081A0021A18280B26182E173002807D004992A1A091815460498EDF75FFEAEB2002EC2D1EAE7618AA28AD5 -:40684000891A8DB2B542C9D93546C7E7A18A01980818CBE700F068F90028DAD000202074E073608A002802D0A18A8142D1D3A08A0028CED000200290A07D01280CD0022850 -:4068800065D00220FCF7B6FE012020740021E173A1736182A1821DE0A08A03281CD9A07B002824D100270098F0F704F9002801D10420A0823A460120039900F00EF90128D7 -:4068C0000BD00420FCF796FE012020740021A173A1826182FCF78EFE9EE00120A073A28A012A04D9521E206A0099EDF702FE216A8F78381D6082502F10D9487802020878D1 -:40690000012110430022FCF755FEA07B012802D1216A00F0F8F80020A07331E0A28A82427AD3121A1206120EA28206D00918491E0198EDF7DEFD01200290FA1C216A0120C4 -:40694000069B00F079F80020A073608260E0A08A052861D33648D130C1798279080210430205A07B120D002815D10220039900F0B4F8012807D00520FCF73CFE009820620F -:406980000120E07348E00120A073A28A206A521E0099EDF7AEFD216A264AC8788F7800020743781D80B26082127DBA4213D20820FCF720FE012020740027A7826782E77391 -:4069C000FCF718FEA07B012803D10220216A00F09AF8A77320E0A28A82421DD3121A1206120EA28206D00918491E0198EDF781FD01200290E07B002806D13F1DBAB2216A0C -:406A00000220069B00F018F80020A0736082E0730298012800D12DE7B54200D3F9E60498721B16464119EDF764FDB6B2C8E60000B0260008AC1E00083EB5044600200D4640 -:406A4000009001900290012C14D0022C11D108206946088100954A81002B69460EC90BD0002000F0E7FC002803D02946204600F04AF83EBD1220EBE7002000F020FDF2E7FC -:406A800070B5047800250E2C03D10179C57809020D43FFF767FE0E2C02D12846FDF78CFC024800210172FFF715FE70BD7027000810B5FFF729FEFFF70DFE10BDF8B5154633 -:406AC00007465C1B2046069EEDF713FDA81982B221463846FFF7ECFFF8BD10B50B46012802D002280BD103E0084600F013FB03E01146184600F066FB0006000E01D0002030 -:406B000010BD012010BD10B5012805D0022802D1084600F0E1FB10BD084600F095FB10BD10B5FCF767FD10BDFCB514A00068009013A0144E0068019031460020C0316C46CA -:406B4000012711E03318C0339A7D255CAA4209D001AD2D5CAA4205D000228A829A7D012A00D18F82401C80B28A8A8242EAD890B2042801D00020FCBD0120FCBD01030C00ED -:406B800001091000B026000808B50B46C17882780902891889B20091014604220220FFF78DFF002008BD3EB54178002217236C46029223810090891C61810120029B0099CE -:406BC00000F07DFC00203EBD06480021017241728172C17201748182016241828173C1737047000070270008002210B511461046FCF7E0FC10BD0EB50021019102911921C7 -:406C00006B461981009001205881002A69460EC902D000F00FFC0EBD012000F050FC0EBD10B5FFF7D1FF034B034A04490448EEF721FC10BDF76B0110A9670110396A011039 -:406C4000E96B011010B50189032913D0172907D018290BD0192902D10068FFF711FF10BD428901680420FFF723FF10BD0068FDF745FA10BD03C800F015F810BD3EB500227F -:406C800003236C460292238101910090628169460EC9012000F0CEFB002801D000203EBD01203EBD10B5052802D10020EFF78AFD10BDF8B50E460546F8F7C6FB0023009061 -:406CC0006C46AB20E15C002900D1E0545B1CDBB2042BF7D32A463146204600F001F8F8BDF7B58AB03A480890001D054606900898019038480F460168069800910291039002 -:406D0000012600241835042233A10898EDF7F1FB0099069880310A7902704979417006980422801C0A99EDF7E4FB8E206946087530460899303048702819049001A800F0C4 -:406D40004FF8002021186A5C002A01D130226A54401CC0B21428F5D31434761CF6B2E4B2032EE5D9281D029000200390019568460475174E0024082F1DD9082730190490BF -:406D800001A800F02DF8002030222118735C002B00D17254401CC0B21428F6D36946097D3120685469461434087DE4B2401CC0B2087500212954BC42E0D3002004E00C996F -:406DC000325C0A54401CC0B2B842F8D30DB0F0BD942700085C0200083030303000000000F0B5BD4E07463446C56885B04034BB482060BB486060B948C043A060B848C04327 -:406E0000E060B8482061387C362801D8402104E0762801D8802100E0C021019104280AD23968042208180021EDF76CFB3A7C3968802088541CE088280DD279680422081816 -:406E4000001F0021EDF75EFB3A7C796880208918203908770CE0B9680422081888380021EDF750FB3A7CB96880208918A039087600200090387C694640098870387CC0004B -:406E8000C8700198800903900020D2E00020844602988001864660467146800009183A7CC9B28A421AD3042901D23A6806E0882902D2091F7A6801E0BA68883951180A7894 -:406EC000120232504B781A43120232508B781A4312023250C9780A43325016E0019A083A8A4201DB00210FE06A4611780902315052781143090231506A469278114309022D -:406F000031506A46D278114331506046401CC0B284461028BFD32068286060686860A068A860E068E86020692861002084460007000F86466046102817D37046C01E000778 -:406F4000800E3158704608300007800E305841407046801C0007800E32587046800033585A4051401F22D14131506046142809D26968AA6808461040EA688A431043E0614C -:406F800059481EE0282807D2A96868684840E9684840E061554814E03C280BD2A868EA680346696810430840194611400843E0614F4806E0A96868684840E9684840E06161 -:406FC0004C48A061E0692969A269411828681B23D8411018091870468000305808186061E8682861A868E86068680221C841A86028686860606928606046401CC0B28446D2 -:40700000502894D320682968401820606068696840186060A068A9684018A060E068E9684018E06020692969401820610298401CC0B203990290884200D227E7F968207800 -:40704000C8702088F968000A88702068F968000C48702068F968000E0870F9682079C871A088F968000A88716068F968000C48716068F968000E0871F968207AC872208976 -:40708000F968000A8872A068F968000C4872A068F968000E0872F968207BC873A089F968000A8873E068F968000C4873E068F968000E0873F968207CC874208AF968000A95 -:4070C00088742069F968000C48742069F968000E087405B0F0BD0000F02700080123456789ABCDEFF0E1D2C39979825AA1EBD96EDCBC1B8FD6C162CA30B500224B1E4C083D -:4071000005E0815CC55C8554C1545B1E521C9442F7DC30BD10B5044608484068EFF75CF92060002807D00649087B002801D0401E0873002010BD034810BD0000600200082D -:40714000A0210008FFFF000070B50A4D0446302905D8E868EFF740F92060002805D1A868EFF73AF92060002801D0002070BD024870BD000060020008FFFF000010B5044682 -:4071800005480068EFF728F92060002801D0002010BD024810BD000060020008FFFF000010B50446880005490858EFF715F92060002801D0002010BD014810BD70280008D9 -:4071C000FFFF000010B504460846F0F71FFF064980000858EFF700F92060002801D0002010BD024810BD000050280008FFFF000010B50446880005490858EFF7EDF8206096 -:40720000002801D0002010BD014810BD60280008FFFF000010B50446880005490858EFF7DBF82060002801D0002010BD014810BD80280008FFFF000010B5FCF711F9FCF7E7 -:4072400071F8002010BD0000014610B509484068EFF752F9002801D0074810BD0749087B401CC0B20873042801D904200873002010BD000060020008FFFF0000A02100088E -:4072800070B5084C05460146E068EFF735F9002806D02946A068EFF72FF9002800D0024870BD000060020008FFFF0000014610B502480068EFF720F910BD00006002000819 -:4072C0000246880010B5034908581146EFF714F910BD00007028000810B504464078217800020843F0F792FE0349800008582146EFF702F910BD00005028000802468800E1 -:4073000010B5034908581146EFF7F6F810BD0000602800080246880010B5034908581146EFF7EAF810BD000080280008F8B5040076D03C4E20783075A078F07520797075BE -:407340006079B0753546A07B20352870EBF740FBC0B2022801D0032805D1707D042802D12079401E707500242EE081070DD08107890F401A0C3082B22B48A700717D381860 -:40738000EFF750F800284BD101E00830F3E726482022103038180221EFF744F800283FD121482022203038180221EFF73BF8002836D11D484022303038180221EFF732F84B -:4073C00000282DD1641CE4B22878A042307DCCD881070BD08107890F401A0C3082B2B17D1248EFF71FF800281AD101E00830F5E70E4850220421001DEFF714F800280FD1A0 -:407400000A48482201210830EFF70CF8002807D10648302208210C30EFF704F8002800D00348F8BDAC1E00085028000860020008FFFF00001FB50446EBF770FA01A9204639 -:40744000FBF76AFF0446EBF753FA204604B010BDF8B5154CA068EFF7FDF8E068EFF7FAF86068EFF7F7F82068EFF7F4F800240F4F0F4E14E0A5007859EFF7ECF80B481030A3 -:407480004059EFF7E7F8094820304059EFF7E2F8064830304059EFF7DDF8641CE4B23078A042E7D80020F8BD6002000850280008CC1E000810B5FBF743FF002010BD1FB5A8 -:4074C0000446EBF72BFA01A92046FBF769FF0446EBF70EFA204604B010BDF8B5054600202870F02316466B800246034607E00C245C439F0064187F195B1CDBB27C60B342DD -:40750000F5D3344604E0A1004919641CE4B24A60052CF8D3002408E022460121284600F007F8002803D1641CE4B2B442F4D3F8BD70B50B460546002411461846FAF70CFE5A -:40754000FF2810D0800040194268FF2111704268002151704268917042681181426851814068416000E0014C204670BD0100160010B50C4B89001C7800220818002C01D059 -:4075800041680A8144686189002901D0491E618140688178002902D0491E817000E042701A7010BD70020008F0B500230746FF209C461C461E4D1A4621E0CE071CD09E00C4 -:4075C000F6197668B6467678A64201D934461846002C11D176463678AE420DD8AE4208D105460120A840104301229A400243D2B200E00022184635465B1CDBB2490800293E -:40760000DBD1002C10D1002A0ED0D30708D08B00DB195B681B89634502D3D8B284460846491CC9B25208F0D1024A01211170F0BDFFFF00007002000803460020052906D254 -:40764000002B04D08900C91849680A70704701487047000001001600034610B5002005290ED2002B0CD08900C9184B685C78944208D25A70802A02D1496806228A7010BDDD -:40768000024810BD0148FE3010BD0000010016000246890089184A68002053891B1D53814A6813895B1C138149684A68521C4A6070470000F7B5054682B000205249534A20 -:4076C00000900427681AAE188D421BD00ADC002E1AD04E2E1AD04F2E18D0F5208000301A15D10DE001280BD0032807D0072803D0474940180BD107E00A2708E00B2706E06E -:407700000C2704E0442702E0072700E006276946381DFCF7E8FC002802D0072005B0F0BD009C294667702046039AFCF7D3F90398002864D1344B2A465B1CE81A049F049D04 -:4077400034493F0AEDB29A4238D008DC002E23D0F5208000301A3CD0012850D14CE002280BD0062804D02A49491C401847D11BE0A11D0020F3F784FB41E0087DA071000A08 -:40778000E071087D2072487D6072000AA072487D21460931E0722CE0214608310498EFF76DFD06E060712AE0214608310498EFF751FDA571E771002821D0F3E7251DA01DCD -:4077C00008220021ECF79EFEA87960210843A87115E00879A0710889E071000A2072487960720888A072000AE072C88821460A312073000AC87002E0A01DFCF7B7F92146B3 -:40780000FF20FBF7E6FE89E702100000D3F3FFFFFDFBFFFFAC1E000830B51E4B0224C21A984235D015DC1C4B0325C21A984225D008DC1A4A801826D0172826D0184A8018E6 -:407840001AD11DE02A2A1ED0602A19D0782A13D11BE0144BD01A9A4210D007DC124810180CD001280AD0022806D107E0042805D001229202801A08D0002030BD002000E082 -:407880000820087002E00D7000E00C70012030BD0420F6E77C0C0000030C0000FAFBFFFF05F8FFFF890300007BFCFFFF10B5224C131BA2423CD016DC204C131BA24228D01F -:4078C00008DC1F4BD2182DD0172A2ED01D4BD21808D121E02A2B22D0602B1DD0782B01D1FDF7EFFE10BD184C1A1BA34211D007DC164A9A180DD0012A0BD0022AF2D108E0F8 -:40790000042A06D001239B02D21AEBD1FDF7F9FE10BDFDF79FFE10BDFDF72AFE10BDFDF7F7FE10BDFDF797FE10BDFDF7FDFE10BDFDF7A0FF10BD00007C0C0000030C00001C -:40794000FAFBFFFF05F8FFFF890300007BFCFFFF70B50C460146304E01208B1B0546B1424ED01DDC2D4E8B1BB14238D00CDC2C4BC91839D017293DD02A4BC91803D111468D -:40798000204600F055F870BD2A2B23D0602B3DD0782BF8D115701146204600F091F870BD214D591BAB4213D007DC204959180FD001290DD00229F2D10AE0042908D001236D -:4079C0009B02C91AEBD11146204600F088F870BD002070BD1146204600F085F870BD1146204600F088F870BD15701146204600F05BF870BD15701146204600F078F870BD72 -:407A000015701146204600F082F870BD1146204600F036F870BD00007C0C0000030C0000FAFBFFFF05F8FFFF890300007BFCFFFF10B5104B0422597A3024114059720E4AFE -:407A40000168114001600D4A416811404160026850080843810A2140C00D422420400143587A120989242240104301435972002010BD0000A021000890880002008000205B -:407A8000084AFB23517A1940517201230168DB0519400160507A490D042319400843507200207047A021000870B50C460546FDF70CFF002803D121462846F1F7E1FD70BD76 -:407AC00070B50C460021217005462146FEF762F8002803D121462846F1F700FF70BD10B5FEF764F810BD10B5FEF76AF810BD10B5F1F740FF10BD70B50C460546FEF770F8D3 -:407B0000002803D121462846EFF76CFD70BD70B50C460021217005462146FEF763F8002803D121462846F2F7A3F870BD10B5F0F74FF910BD10B5F0F7B7F910BD10B5F0F7B5 -:407B400051F910BD10B5F0F7F9F910BD7047000010B50C460088044948430449EAF7D8FFBD21081A208010BD4B2800001027000010B50C460088AE214843034940180A2171 -:407B8000EBF7B0F8208010BD91FCFFFF70B5094C054621780648002909D1074A0321074800F0C2F9002802D102212170656070BD02001600740200086D7D011004080000E7 -:407BC00070B50A4C05462178074800290AD10F21074A0902074800F041FA002802D101212170656070BD00000200160074020008A17C01103B08000001484078704700006E -:407C000074020008F8B506461920694608702020487001248C700220C8706846EAF704FB002805D01449884202D013481230F8BD022000F0FFF8114F2F253D630A20EAF7BC -:407C400053FE304600F08EFC0D4E304600F018F9802188430146304600F026F900F076FC00F040FA3D6307488460012000F0D8F900F07EF9F8BD00000300160040F03D4096 -:407C80000E1E000040003C4010B5EAF76DFA10BD10B5400701D500F08BF910BD7047000010B5034A0321034800F03EF910BD0000B97C01100408000010B5034A08210348DB -:407CC00000F01CF910BD0000D17C01100608000010B5034A0821034800F026F910BD0000E97C01100608000010B5034A0721034800F01AF910BD0000017D01103C08000038 -:407D000010B5034A0221034800F0A8F910BD0000197D01103A08000010B50249024800F063F910BD2D7D01101B0A000010B5C80704D00549054800F057F910BD00210846AA -:407D4000FFF7EAFF10BD0000517D01101A0A000010B5054CC9B26268002A01D00020904700206060207010BD7402000810B5034A0821034800F0C2F810BD0000857D01103C -:407D80000608000010B5034A0821034800F0CCF810BD00009D7D011006080000032110B58902034B0A46034800F090F810BD0000B97D01103D08000010B5034A01210348C8 -:407DC00000F04CF910BD0000D17D01103A08000010B50249024800F007F910BDE57D01101B0A000010B5880704D50549054800F0FBF810BD00210846FFF7DEFF10BD0000AA -:407E0000097E01101A0A000010B5054C090A6268002A01D00120904700206060207010BD7402000802480168490049080160704700003C4070B50446002500F091F80128CE -:407E400002D1002000F0ECF80B4A11680B48012301433F20400381431B039943012C08D960033F24640300194003400B0843184301461160284670BD00003C40040A00806D -:407E80000121C9030843074A0004D061054840300168C907FCD00168012319430160D06A80B2704700003C404004400808430649C861054840300168C907FCD001680122BB -:407EC000114301607047000000003C4070B5094C054626780648002E08D1032020706360218162810449284600F07EF870BD00000200160090280008A980011030B5084B4F -:407F000004461D780548002D07D1022018705A6059810449204600F067F830BD0200160090280008A980011010B5074B1C78002C01D0064810BD01241C705A60598104497C -:407F400000F052F810BD00009028000802001600A980011001490120087070477C02000802480068C007C00F7047000000013C4000B50023FFF7F4FF012801D0084B0CE052 -:407F800008490C20086188610748012101700021064A4160116051609160184600BD00000200160000013C407C020008902800080A48C16901610A480A0701D5416802E053 -:407FC0004A0700D50168074A0123137088B25268090C002A00D010477047000000013C4040013C407C02000810B50A4A034614780020012C01D0084810BD022414705160A5 -:4080000006494B60054A403A116808231943116010BD00007C0200080200160040013C400D490A68D207D20F824205D001220028086802D0104308607047022318430860E2 -:408040000868C007FCD10869104308610248C038016811430160704700013C4010B50A4B090401431C780020012C01D0074810BD02241C705A60064A1160054940390A689C -:4080800004231A430A6010BD7C0200080200160040013C4003480078012801D001207047002070477C020008F0B50D4C012622465389277800259E405268012F0AD0022FB8 -:4080C0000BD0032F05D12689B1431943FFF7C6FF2570F0BD0E43B1B2F8E7B143F6E700009028000810B517493820886116484860144A1648C03210611648154A4260174B31 -:40810000154A9A61164A0260144B164A803B9A63154A13680124640223431360134A022313630269082492B222430424CC601A4319030A4381158A4341210A43026100F0B7 -:4081400017F810BDC0103C4037D70000308A000058480000001E3C40FF0F000040123C400524000020FF000040503D40C0F03D4070B51849002548681C2210434860154886 -:408180004038416A826AC9B2D2B2C06A51180002000E4018001DC10700D0401C01264408B6020A2C12D90A212046EAF7B1FCC0B2072800D907200A214143A14204D2611AB6 -:4081C000CDB21F2D00D31F2544012C4302483443846370BDC0F03D4080103C4010B5FFF7BFFE012802D10020FFF71AFF044C2046FFF746FE8104890C2046FFF755FE10BDB2 -:40820000021E00000248416B022291434163704740F03D400248416B022211434163704740F03D40014909680180704780F03D4010B50C4C2F202063FFF754FF9A20E0629E -:40824000FFF78EFE002809D107480068002802DB0220FFF7EFFD0120FFF7E2FEFFF788FE10BD000040F03D4000003C40F0B58C4600881749884202D11648006880B28104D8 -:408280000C0D0004800F10D0012810D0862600202F230246262C10D30F4FD018400841007D5AA54205D140B207E05726EFE77026EDE7991A012905DC50B22030801B614643 -:4082C0000870F0BDA54201D20246E6E70346E4E7FFFF000080F03D40E05000100449002802D0012008567047002008567047000084020008F1B51B4FFD6A1A484030406B17 -:40830000C0072DD0386BC0072AD0FFF7C3FE012826D0102128468843F86200211248FFF763FE124C20690007FCD5104840304068060C08206061FFF70DFE0320400386434F -:40834000009800224003304381B20748FFF786FE20694007FCD504206061FFF7FBFDFD62F8BD000040F03D400F1E000000013C40F8B52449496BC90743D022494039096BA9 -:40838000C9073ED04178002912D01F4D1F492C1D002282560527FF43931D0026BA4214D00CDC0E331ED0042B17D0082B0AD10FE0154D1649083D2C1D491EE9E7002A01D035 -:4083C000042A14D00E70042714E00F70032711E00B22D2430A7002270CE00F22D2430A70012707E01322D2430A70002702E004220A70052700214156084600F01BF82F6063 -:408400002660F8BD80F03D40B8113C408502000810B5FFF7A5FD012802D10020FFF700FE03492F2008630220FFF704FD10BD000040F03D40F8B5314C0646E56AFFF72AFE57 -:40844000012859D01021284688432146C8622B484030006A2A4C2B4F00072BD52A48A178042E02D0042913D043E0042941D0A188802291430722120211430022FFF7EEFD38 -:4084800038694007FCD504207861FFF763FD1CE0A1880F22D20191430322520289180022FFF7DCFD38694007FCD504207861FFF751FD0FE0A078042E02D0042807D018E0A8 -:4084C000042816D00720EAF78DFAB02103E00320EAF788FA98210C4800220930FFF7BEFD38694007FCD50420786104498862FFF731FD0248A670C562F8BD000040F03D408E -:408500008402000800013C40071E000070B5084980200860074C0025E562FFF779FFFFF75DFE262020636563FFF77CFC70BD000000103C4040F03D4010B503490020C8624F -:40854000E9F766FE10BD000040F03D4010B50348FFF796FC0249888010BD0000071E00008402000810B5044600F0D4FC204600F035F900F015F80849012000F0E5FB074CED -:40858000FF214131204601F025F865218901204601F020F810BD000088090000021E0000F8B5002469462046009400F0F9FF00980321C008C000084381B20090002001F0F3 -:4085C00009F80126760269463046009400F0E8FF009902200143009189B2304600F0FAFF4C494D4800F0F6FF4B4D6946ED1E2846009400F0D5FF3F210098C9018843FF214D -:408600008131084381B20090284600F0E3FF424F6946843F3846009400F0C2FF00980125284381B20090384600F0D4FF3A486946801F009400F0B4FF03210098890288432E -:4086400081B200903448801F00F0C4FF6946B81C009400F0A5FF0098A84381B20090B81C00F0B8FF6946B81C009400F099FF0098284381B20090B81C00F0ACFF2648012199 -:40868000001F00F0A7FF00946946244800F088FF0098C007F8D0FF200021013000F09AFF1D480021813800F095FF69463046009400F076FF00980221884381B2009030461E -:4086C00000F088FF69460020009400F069FF00980721C008C000084381B20090002000F079FF0F4E45218901304600F073FF65218901304600F06EFF69463846009400F0B1 -:408700004FFF009938462943009189B200F062FFF8BD0000665E000088080000110A0000021E000038B50B21002000F053FF012464020721204600F04DFF1421224800F0A8 -:4087400049FF214D2049AD1C0939284600F042FFE91F284600F03EFF1B481C49483000F039FF19480121343000F034FF164801213D3000F02FFF21200121800100F02AFF13 -:40878000114813494A3000F025FF0021114D00916946284600F004FF00994907F8D50021204600F017FF0F21002000F013FF0A4C45218901204600F00DFF652189012046A3 -:4087C00000F008FF38BD00000408000042020000BD6E0000110A0000021E0000F1B58AB00A98012842D110216846E9F737FF00283CD168460088A249884237D16A46518873 -:4088000048409188D288514048406A46118948405189484091894840D189814226D1FFF781FF68464188974800F0D4FE684681889448401E00F0CEFE6846C1889148801E91 -:4088400000F0C8FE684601898E48C01E00F0C2FE684641898B48001F00F0BCFE684681898320400100F0B6FE0BB0F0BD8648069086480990EAF734F8012810D04120C001E7 -:408880000790834869465A380882012065244002E4014882401088827D4D662015E0EAF721F8002803D07A4D7A4C2D1D02E0F925794CED0079480790794869460882FF2062 -:4088C000C3304882C82088827020C8827548066A00273007002811DA08A97348089700F05FFE0F210898C901884307210902084381B208906C4800F06DFE02E00720EAF752 -:4089000071F8694808A90930089700F049FE0898782188433821084381B208906248093000F058FEC820E9F7DFFF2946204600F0EBFC544D6C466D1EA11C284600F030FE48 -:4089400068464088810602D1401C69464880E9F7C9FF002808D16846408880090A2803D98320800069464880300712D54E4E08A93046089700F014FE0F210898C90188431D -:4089800003214902084381B20890304600F022FE02E00320EAF726F8434E08A909363046089700F0FDFD0898782188431821084381B20890304600F00DFEC820E9F794FF09 -:4089C0000699079800F0A0FC211D284600F0E8FD68468288900602D1521C6846828004A8099900F063F8A11D264C204600F0D8FD02A9284600F0D4FD02A9A61E0231304607 -:408A000000F0CEFDE71E03A9384600F0C9FD68464188204600F0DEFD68468188284600F0D9FD6846C188304600F0D4FD68460189384600F0CFFD68464189201F00F0CAFDF5 -:408A400068468189601F00F0C5FD0A98012800D00AE70B486A461080518848409188D288514048406A46118948405189484091894840D08110216846E9F720FFF4E6000022 -:408A800082030000651000008202000082040000C6070000D4300000952E0000841C0000DC05000080F03D40071E0000F3B581B00024054669462046009400F071FD0098A4 -:408AC0000321C008C000084381B20090002000F081FD012069464002009400F061FD00980721C008C000084381B200900120400200F070FD834F69463846009400F050FD54 -:408B000000980126304381B20090384600F062FD69463846009400F043FD00980221084381B20090384600F055FD69463846009400F036FD00980421084381B200903846CC -:408B400000F048FD69463846009400F029FD00981021084381B20090384600F03BFD6946B81C009400F01CFD00980627B84381B200906448801C00F02DFD62486946801C72 -:408B8000009400F00DFD0098B843384381B200905C48801C00F01EFD5A4F694648373846009400F0FDFC00980221084381B20090384600F00FFD69463846009400F0F0FC59 -:408BC00000984021084381B20090384600F002FD69463846009400F0E3FC00987102084381B20090384600F0F5FC464F694634373846009400F0D4FC0098304381B20090AA -:408C0000384600F0E7FC3F4F69463D373846009400F0C6FC0098304381B20090384600F0D9FC7F1E69463846009400F0B9FC0098304381B20090384600F0CCFC3148FF21BD -:408C4000CA31623000F0C6FC2E480299643000F0C1FC2C4829885D3000F0BCFC294869885E3000F0B7FC2748A9885F3000F0B2FC2448E988603000F0ADFC224822494A3054 -:408C800000F0A8FC214D00946946284600F088FC00994907F8D51B480221633000F09AFC00946946284600F07BFC00998907F8D501256D0269462846009400F071FC0098EF -:408CC000C108C900009189B2284600F083FC69460020009400F064FC00980721C008C000084381B20090002000F074FC084C45218901204600F06EFC65218901204600F046 -:408D000069FCFEBD04080000BD6E0000110A0000021E000010B50A4A02280AD0012807D1084808188001C01C81B2104600F052FC10BD7D200001081A80013D30F4E7000099 -:408D40004E0800002FF8FFFFF3B5002583B000287DD0FF240026163401A92046019600F01FFC0198022180088000084381B20190204600F02FFC614F01A93846019600F00B -:408D80000FFC032101980903884381B20190384600F020FC01A92046019600F001FC0198302188431021084381B20190204600F011FC534E002402200499FFF7ABFF002096 -:408DC000019001A9304600F0EBFB01984006F8D54B486946083000F0E3FB68460088641C2D180A2CE7D3E9F77BFD07006AD00A212846E9F78DFE6946088068460188FF20E3 -:408E0000143000F0E7FB0020FF241634019001A9204600F0C5FB019830218843084381B20190204600F0D6FB00252C4602200499FFF770FF0020019001A9304600F0B0FB2C -:408E400001984006F8D52E486946083000E037E000F0A6FB68460088641C2D180A2CE5D3002F3DD00A212846E9F752FE6946088068460188FF20153000F0ACFBFF240025C2 -:408E8000163401A92046019500F08AFB019902208143019189B2204600F09CFB01A92046019500F07DFB019930208143019189B2204600F08FFB65218901124800F08AFBCB -:408EC00005B0F0BD2846EBF757F90F4A0F4BEAF74FFB00220E4BEAF735F8E9F755FF8AE72846EBF749F9084A084BEAF741FB0022074BEAF727F8E9F747FFB7E703020000D3 -:408F00001D0A0000021E00009A9999999999244000005940F8B5E9F7E3FCE94D0746002469462846009400F03BFB03210098890388430121C903084381B20090284600F0FF -:408F400049FB6E1C69463046009400F029FB032500986D03A843284381B20090304600F039FB69463046009400F01AFB00981C2188430421084381B20090304600F02AFB57 -:408F800069463046009400F00BFB0098022180088000084381B20090304600F01BFBC84E694609363046009400F0FAFA0098A84381B20090304600F00DFBB021701C00F0C2 -:408FC00009FBBF4865218901001F00F003FBFF25173569462846009400F0E2FA00981021084381B20090284600F0F4FAB54DFF202946313000F0EEFAFF202946323000F090 -:40900000E9FAFF208021333000F0E4FAB1218900012000F0DFFAAC49052000F0DBFA8125ED00AA4E002F7DD0C1218900022000F0D1FA3146032000F0CDFA3C210B2000F020 -:40904000C9FA2946072000F0C5FAA0490820FF3900F0C0FA39210C2000F0BCFA00210A2000F0B8FA40210D2000F0B4FAFF207021133000F0AFFAFF262D211636C901304625 -:4090800000F0A8FAFF27FF2134370902384600F0A1FA8F498F4800F09DFA8E488E49401C00F098FA8B488D49801C00F093FA272181200901800000F08DFA41208849C000FA -:4090C00000F088FA83488749001D00F083FAFF25804801352946401D00F07CFA03203A21400200F077FA78497F480E3100F072FA7D487E49401C00F06DFA7B480621801C7C -:4091000000F068FA78480321401D00F063FA61207749000100F05EFA7348FF21103000F059FA00E0B5E07048C821083000F052FA6D480121093000F04DFA6B483C21113045 -:4091400000F048FA684801210C3000F043FA664868490D3000F03EFA634867490E3000F039FA41206946C000009400F019FA0721009889028843E900084381B2009041202D -:40918000C00000F027FA5D49384600F023FA69463046009400F004FA0F21009809028843084381B20090304600F014FA0421880200F010FA1021524800F00CFA50480E21B5 -:4091C000401C00F007FA4E4840210F3000F002FA4B488021103000F0FDF949488621113000F0F8F93B486946401C009400F0D8F90098382188432021084381B200903548E1 -:40920000401C00F0E7F9812069468000009400F0C7F903210098090388436901084381B200908120800000F0D5F9812069468000009400F0B5F903210098890288430843A5 -:4092400081B200908120800000F0C4F921486946001D009400F0A4F90721009809028843284381B200901B48001D00F0B3F919486946001D009400F093F900980121000927 -:409280000001084381B200901248001D00F0A2F9F8BD2946022000F09DF93146032000F099F93B210B2000F095F90E4907200A3900F090F91349082000F08CF93321CAE679 -:4092C000061E0000808000000DB00000013E000030480000010200009426000043430000D4D20000190800000106000036790000FF0D00008CC800004698000034CA0000DA -:4093000001100000023A0000F3B581B0002469462046009400F044F900980321C008C000084381B20090002000F054F901277F0269463846009400F033F900980625C0084D -:40934000C000284381B20090384600F043F969468E48009400F024F900980126304381B200908A4800F036F969468848009400F017F900980221084381B20090834800F0B2 -:4093800029F969468148009400F00AF900980421084381B200907D4800F01CF969467B48009400F0FDF800981021084381B20090764800F00FF975486946801C009400F0F3 -:4093C000EFF80098A84381B200907048801C00F001F96E486946801C009400F0E1F80098A843284381B200906848801C00F0F2F8664D694648352846009400F0D1F800989B -:409400000221084381B20090284600F0E3F869462846009400F0C4F800984021084381B20090284600F0D6F869462846009400F0B7F80098384381B20090284600F0CAF8EC -:40944000BD1D69462846009400F0AAF80098304381B20090284600F0BDF84C48632149017E3000F0B7F849480521343000F0B2F8474E69463046009400F092F80098032106 -:4094800080088000084381B20090304600F0A2F83E484049623000F09DF83C480299643000F098F8394801995E3000F093F8374800215D3000F08EF8344800215F3000F05A -:4094C00089F832480021603000F084F82F4832494A3000F07FF800946946304800F060F800984006F8D529480221633000F072F800942A4869460C3800F052F80098800700 -:40950000F7D569463846009400F04AF80098C008C00081B20090384600F05CF869460020009400F03DF800980721C008C000084381B20090002000F04DF8154F45217F1F2C -:409540008901384600F046F865218901384600F041F869463046009400F022F80098022180088000084381B20090304600F032F869462846009400F013F800984108490004 -:40958000009189B2284600F025F8FEBD04080000071E0000C9050000BD6E00001D0A000010B50C4601210903FF22411A0232914208D201460548FEF777FC0121C802FEF7D9 -:4095C00073FC0348FEF75CFC208010BD01080000080A000010B5FEF767FC10BDE897FE7F010000000000001000000008C000000004960110C0000008B804000028190008A5 -:40960000740F000000127A0000127A0000093D0000093D0000093D0004000000A00F00000000D0070700000002000000030000000F00000000000000000000000300000015 -:409640000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000019000050A0000000E4450010A5 -:40968000DC450010404600100000614002FF0000891F00100100000006000000841E00080000000000000000000000000000000000000000000000000000000020000000B8 -:4096C00000FFF40100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076 -:40970000000000000000000000000000000000000001000000000000000000000000000000000000FF0000000000000000000000A84700100000000000000000000000002A -:4097400050480010000000000000000098480010000000000000000021000000C04800103C4D0010C04D0010444E0010000000009145011091450110084F0010D95E011043 -:40978000DB5E0110744F0010804F0010E1610110DD610110E04F001035660110D1660110585000100000000000000000000000000000000000000000000000000000000020 -:4097C00000000000000000000000000000000000E9000010C100001000000000F7B50D00019000F04BF9060003281FD12D4B1B69002B19DB002000F051F92B4FB84213D034 -:4098000000232A4A1900012000F020F9041E0BD1002000F043F9264BB84203D09C4203D00134F5E79C4201D1224D39E000F02EF9214A04000121214800F010F900282DD19C -:40984000019B002B16D1ADB2ED0001D11C4D18E03E221C4B06211A601B4A1C4B1A60A3221B4BD20099501B4A9D50995899580029FCDAEBE7114A1369002BFCDB00F016F94A -:409880000500032E03D0200000F0D8F808E00121002000F0EBF80028F9D1F4E7054DF0E72800FEBDC00023400101880048010008F049020005005200401E00080000234090 -:4098C00001005000040126401E1F000008012640000026401C05000010B54378FF2B0DD100F0D4F8064BDB685A68012311681943116011681942FCD100F0A0F810BDC04679 -:409900008000234070B52B490A682A4B002AFBDA0221DA680A43DA60DA68D2071BD5264D264CD9682A69266889B2360A36060E43FF21120209040A4032439026DA602969FD -:409940001F4A360111403143296121680A40324322602A692268002204241A495A605A680A6922430A61012801D030BF00E020BF1A68104D002AFBDAEA68D20712D5FF24EA -:409980000D4E0F4A3069E9682402090A1040214001430A4831610668E9683240090C0C40224302600221DA688A43DA6000225A6070BDC046E000234000002140900021408E -:4099C000FF00FFFF00ED00E00421134A13690B431361012801D030BF00E020BF0F4A1368002BFCDA0E4B19691A00002910D10D490D4B196006210D4B19600D4B3831196008 -:409A00000C4B0631196019680029FCDA0A4B13610022024B5A60704700ED00E0E0002340FC0025401E1F00000801264018052640040126401C052640AAAAAAAA01B40248BD -:409A4000844601BC604700BF531F001001B40248844601BC604700BF1911001001B40248844601BC604700BF890E001001B40248844601BC604700BFA90F001001B402480B -:409A8000844601BC604700BF0504001001B40248844601BC604700BF4B1F001001B40248844601BC604700BF2110001001B40248844601BC604700BF611700100000000099 -:409AC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066 -:409B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025 -:409B400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E5 -:409B800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A5 -:409BC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065 -:0200000490303A -:02000000C887AF -:0200000490501A -:0C0000000005E20721002101E296E987DB -:00000001FF \ No newline at end of file diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.02.hex b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.02.hex deleted file mode 100644 index 6bc67c2194..0000000000 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.02.hex +++ /dev/null @@ -1,146 +0,0 @@ -:020000041000EA -:4000000000000108310100100D00000095010010000000000000000000000000000000000000000000000000000000009101001000000000000000009101001091010010DC -:4000400091010010F10700109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010FA -:400080009101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001020 -:4000C00010B5064C2378002B07D1054B002B02D0044800E000BF0123237010BD7804000800000000E01F0010084B10B5002B03D00749084800E000BF07480368002B00D1F1 -:4001000010BD064B002BFBD09847F9E7000000007C040008E01F001044010008000000007047EFF3108072B6704780F310887047FFF7F6FF72B6104C104DAC4209DA216818 -:400140006268A368043B02DBC858D050FAE70C34F3E70B490B4A0020521A02DD043A8850FCDC094809490860BFF34F8F00F0ECF800F01EF8FEE70000E41F0010FC1F0010B9 -:4001800078040008480700080000000808ED00E0FEE7FEE700B504207146084202D0EFF3098001E0EFF30880043001F08FFAFEE710B500F0A5F962B6064B5B689B0301D5D5 -:4001C00001F046FA044800F02FF9002001F0DCF9FBE7C0460000264000000810F8B5E023504C9B00E2580F231340D022990092000919885807224C4D0240032A05D0042A25 -:4002000005D0002A0FD0494811E028680FE0C022920089581F220A40112A01D0132A04D18020000203E0424801E0FA20C001002B27D1B223B1210322DB00C900E65863588A -:4002400067581B0F3F0F1340174205D0354F7958090F0A40012A01D1F20701D4032B3AD1B023344ADB00E658A158E758C904C90C01F05EFDB603F901B60BC90F704301314A -:4002800027E0012B27D1C823C0210322DB00C900E658635867583F0F174205D0214F7958090F0A40012A01D1F20703D49B009B0F032B10D1C0227F23D200A758A1583B40BD -:4002C0001F27A658090A3940584301F031FD310C394001F02DFDE0239B00E3589B069B0FD840154B68601C691969240A090E013101F01EFDE1B2A860013101F019FD0F4B87 -:40030000E860286104000E49C01801F011FDFA210C4B28758900E01801F00AFDA861C003E861F8BD00002640C000000800366E0100127A0084050000000021403F420F008F -:4003400040420F00E7030000B021E02010B530241F4BC9005A588000520052085A501A58A2431A50802252045A501A491A4A80209950A021043289019950FF21174AC005FA -:40038000995081315A5892009208024380205A505A580006024301205A505A5882435A5000F054FAFFF71AFF00F02AFA00F032FA00F0B8FEB0235B055A78002A02D05B7855 -:4003C000212B03D10022064BDA605A6010BDC0460000264001000200840500008C050000E0002340024BD86F032318407047C0460400214010B5FFF794FE074A074BD16F79 -:400400000B4007490B43D367102306490A681A42FCD0FFF78AFE10BD04002140FCFF00000100FA058800214070B50F4C0600FFF778FEE36F0500DB439B0701D1FFF7DAFF3F -:40044000B0230A4A9B00D650E26F094B09491340094A1343E36710230A681A42FCD02800FFF763FE70BDC0460400214000002140FCFF0000880021400300FA0510B5040063 -:40048000007B00F0F3F8606010BD10B50400007B216900F0B5F8606010BD10B5037B0169180000F0CDF810BD10B50400C06800F009F9606010BD10B5C06800F017F910BDF0 -:4004C00010B50400C06800F023F9606010BD10B5C06800F037F910BD10B504000C23C05E00F056F8606010BD10B50C23C05E00F06FF810BD10B5C06800F036F910BD0000A8 -:4005000010B500221849042000F0A4FC01221749042000F09FFC02221549042000F09AFC03221449042000F095FC04221249100000F090FC05221149042000F08BFC0622E9 -:400540000F49042000F086FC07220E49042000F081FC08220C49042000F07CFC09220B49042000F077FC10BD7D0400108B0400109B040010A9040010B7040010C104001062 -:40058000CF040010D9040010E9040010F504001070B507260512EDB206400D2D11D801F0FCF80A4901224B5D1C003441144003D1B24013434B5501E00124644201F0F1F8CA -:4005C00001E001246442200070BDC0469404000870B50412E4B20D2C0FD80725054001F0DCF8064901220B5D1E002E41164202D0AA4093430B5501F0D4F870BD94040008FA -:40060000F8B50C00050001F0C8F80C2301225D431300A3401A00094E71198F683A4008D13B43AD598B60631C4B60AB4202D94A6000E0FF2401F0B5F82000F8BDE0000008B5 -:4006400070B50C00050001F0A8F801210C23A1406B43054AD3189A680A4201D08A439A6001F09FF870BDC046E0000008F0B50C2485B0019001F091F8019B114D5C432B191E -:400680005B68029003932E1971680198FFF7B8FF0700FF280DD173682A59934201D9002373602A1953680399994202D001335360E9E7029801F075F8380005B0F0BDC04644 -:4006C000E000000810B5040007280AD801F065F8054B0E331A5D002A01D101321A5501F060F80120404210BD9404000810B5040007280AD801F051F8044B0E331A5D012AA5 -:4007000001D100221A5501F04CF810BD9404000870B505001F280ED801F03FF8084B30335C5D002C02D101225A5501E00124644201F037F801E001246442200070BDC0462A -:40074000E000000810B504001F280AD801F025F8044B30331A5D012A01D100221A5501F020F810BDE000000870B5B024C025144B144A15496405ED00E35CA25C615C665D10 -:400780003F251F242A400C4024039201224311002B407F2219430B003240520413430B4A1C0A110050310B701B0C8B7000234C7011005031595CC1540133062BF8D170BDDB -:4007C000040600000506000003060000E000000810B50248583000F051FB10BD2C05000810B50248B03000F049FB10BD2C05000810B5024800F042FB10BDC0462C050008A9 -:4008000010B5034A80216032042000F001FA10BD2C06000870B500F0C0FF0500094800F08BFA094C200000F0B9FA2000343000F0B5FA2000683000F0B1FA280000F0B1FF68 -:4008400070BDC0462C050008A81E0010F0B5962191B0002000F052FF00F028FF002801D100F016FF012000F0EFFDE821724C734B626C89011A400A436264626C0193120A5D -:40088000D2B23A2A04D1636C6D4A13400B4363643422002103A801F0E0FA03AA0021694800F06EFC3422002103A801F0D6FA03AA0121644800F064FC082204262368624D8B -:4008C000134323602369334207D1002D04D0012000F0D4FE013DF5E701E0002D00D1FEE7A02603220127594CF600A35903AD93433B43A351D2195649280001F0A5FA280078 -:4009000000F0F2FF534901980B68534A03400B608021136949041B021B0A0B4313611369019902200B401361E0230F219B00E2588A433A43E250E25821318A438021E250CE -:40094000E25809060A43E250002100F0D3FA0021032000F0CFFA0021042000F0CBFA0321002000F0C7FA0321380000F0C3FA384B0522191D280001F067FA2900380000F031 -:40098000DBFA002800D0FEE73449380000F026FB002800D0FEE7324B324AE1580A403A43E250E158304A0A408021E250E25809060A43E250A2592D4B1340A351A2592C4BF3 -:4009C00013408022920113438022A351A35912021343A351184B1A68264B1340164A136000F0E2FEC0235B00E3583B4204D1224AA3585B005B08A3506421002000F07EFEE9 -:400A000024220021280001F028FA29000D4800F031FC2A000E4B0C3313CB13C213CB13C213CB13C22900154800F024FC144A154B1A6011B0F0BDC04600002740FF00FFFFF8 -:400A4000FFC5FFDF0000324020A1070000002640441F001090002140000021401027000004050000FEFCFFFFFFFF00FFFFF0FFFFFF8FFFFFFFFCFFFF0C0500000003324042 -:400A800001001180000E1F41030010B5FF24800882009B1ADB009C409940E243214007282DD8174B01F03AF904090E13181D2227186A02401143196221E0586A0240114324 -:400AC00059621CE0986A02401143996217E0D86A02401143D96212E0186B0240114319630DE0586B02401143596308E0986B02401143996303E0D86B02401143D96310BDD7 -:400B000000002140064B10309A68064B9A4203D183009858995002E0034B8000C058704700ED00E00000000800000010F7B5051E01913DD00023C05E002802DBA978FFF735 -:400B4000A3FF6A680023E85E9201002812DB1A4B81088900C918FF2303271C00C0250740FF00BC401A40BA40AD004E59A64332434A5113E003250F2381B20B402940A9404B -:400B8000FC352F002A408F408A40083B9B080B4C9B001B19DE69BE433243DA61074B00259A68074B9A4204D10199FFF7ABFF00E0044D2800FEBDC04600E100E000ED00E070 -:400BC00000000008010056000369002B03DA89B24160002000E001487047C04601008A000368002B01DB034803E089B2C26081600020704701008A000369002B03DAC368D6 -:400C000000200B6000E001487047C04601008A0070B5040010000F2C2BD8002A07D1002927D1154B6401E418144B1C6022E000291FD01F260E401CD1104D0F4B6401E418D0 -:400C40006960AA60CA0831002C6001F006F931002000FFF7B9FF31002A1D2868FFF7C0FF011E04D12868FFF7AFFF011E02D0044900E00449080070BD000023401C07000810 -:400C800001018A0003018A00194BF7B51A680193D76804003B680E00834223D90025A94202D100F07AFD0500019B18680368002B01DB104C10E063095A01A41A0122A2408C -:400CC00079689B00CB18196811420DD00024914319600021FFF778FF002E07D1280000F060FD03E0044C01E0044CF2E72000FEBD1C0700080301880004018A000201880081 -:400D00000A4B1B68DA68136883420DD9430999005B01C31A0120984052688B581840431E9841034BC01800E0024870471C0700080001880004018A00024B1A68002A00D119 -:400D40001860704728070008F0B52C246043104C1E0024681F0A2018FF2426403C400D4F06607601F61906610B4E1B0C44606401A4191E04836033434461A3600023059D2C -:400D8000C261016283619D4201D02B888381F0BD280700080000234000102340F0B5038985B002AD2B800368066A1933AB704368476A0095826AC16A040003930369C06870 -:400DC000FFF7C2FF00213B000A0000913000FFF7BBFF216B2800FFF7A9FE0023EA5E002A05DB1F231A401E3B9340024A136005B0F0BDC04600E100E0F7B52C25124C6843E9 -:400E0000276801933C182669002E08D04D4379198869002805D13568002D02DA03E00B4811E00B480FE06768012425004B689D4013882D041D431560F2608C61BC40019B65 -:400E4000A4B24B62B460FEBD2807000804028A0007028A002C235843064B1B681818C369934204D9036A9200D150002000E002487047C046280700080A028A0073B5002638 -:400E800042690400D56801962B0CB3421CD01B040069136013680369B34215DA01A9FFF7ABFEB0420CD10198E26903681E0C0378934205D2226A9B009B58002B00D0984725 -:400EC00031002069FFF780FEADB2002D0ED063691D6000251B68636AAB4202D09847656203E0A36A002B00D09847A56163691B6873BD0000042819D804290FD94B1EFF3B13 -:400F0000132B13D81F231940094B8000C018C02304229B00C1504033C25005E00723D0301940034B8000C150002000E0014870470000264001004A00F0B5012819D1C02275 -:400F4000224BD2009A58002A0CDB8A78901E0E280FD84C78601E11280BD8C8780D7800282FD101E01A4830E07026152D01D9AE4201D2184829E00E79022E14D0F82124020C -:400F80004901F8270C4021007F2412047F033A4011432C4021438024C022C006240520400143D2009950C020C0248005360706403200E4001D590849002029400A431A51C4 -:400FC00003E03826122DD4D9D1E7F0BD0000264003004A0001004A00FFFFFFCFF8B50D00012819D1C02180240D4BC9005A582406C826224307001C005A50F600A3593B42B7 -:4010000006D1002D0AD0012000F038FB013DF5E70020002D03D101E0024800E00248F8BD0000264001004A0002004A001E4A0300904238D010D840282ED005D8002831D0B3 -:4010400010282DD119482EE0802827D08021100049008B4227D023E0154A904214D008D8A022120690421DD0124AA020934211D016E0114A904209D0104A904208D0104AB1 -:4010800090420DD10F480EE0A42003E00E480AE00E4808E0C00306E00D4804E00D4802E00D4800E0002070470600520001005000010000F0090000A0040000F0050000F0C5 -:4010C000030000F00100520002005200030052000200500005005200FF0052000B4B10B51B69002B10DB0A4B0A4C1868FFF79EFF0121094B094A995099580029FCD10649AC -:4011000009590029F8D100E0054810BD000023402C0700088C040000000025400C0400000200500010B5022202490020FFF792FE10BDC046990100080F4B30B5C0180F4BAC -:40114000C009C01800011F23032909D81D00C9008D4013408B400468AC432343036009E01D000439C9008D4013408B404468AC432343436030BDC0460000CEBF0010030457 -:40118000F7B504000E00150000286ED0002A6CD0012312688B40002A01D1436000E08360B30001930F231900B0008140A26A8A4369680B4083401343A3622A7A31002000BA -:4011C000FFF7BAFF0320710088400322636A83431800EB6813408B400343636201231F00B7400097FF43BC462F6962461F40B740A0691031104038436F69A0611F40B740A9 -:40120000E06A10403843E062A86903221840B0400600E869276B10408A408840009930430A4397436A6A384356000222206304201640AA6A616B92000240286A3243034017 -:401240001A43EB6AD80018230340FF2013432A6B019D520102401343FE2292002A40934081430B436363002000E00148FEBDC04601005A0000281BD0002919D00D4B0E4AD2 -:40128000C318DB099B180A681B010260CA6882620A69C2624A6902638A6842624A6882618A694263CA6900201A600A6A5A6000E0024870470000CEBF0010030401005A0069 -:4012C0000120024B1B68DB0D984370470000264010B50F2402200649064BCA58A2430243CA50F02212028B58A34303438B5010BD0000214004F0000010B50F240320064961 -:40130000064BCA58A2430243CA50F02212028B58A34303438B5010BD0000214004F000000449054A054B88580340C020C00103438B5070470000214004F00000FF8FFFFF5B -:401340000449054A054B885803408020C00103438B5070470000214004F00000FF8FFFFF70B50400002000F037FA00280BD1802324065B041C4023000E490F4A8D692A401B -:4013800013438B6115E0002C01D10C4A00E00C4A01210C48FFF724FC002809D1094A1369002BFCDB074B0020DB681B0EA02B00D0054870BD00F02540FFFFFFFE0100003099 -:4013C00001010030000023400400420010B5002000F002FAB0235B055A78002A03D05A780123222A01D843424341180010BD0000031E03D1084B5869C00F0CE00020012B26 -:4014000009D1054918008A69920F1A4201D18869C00F01231840704700002640072370B5084CA2691A4090420BD0A5699D4303402B43A361002904D0904202D9C82000F077 -:401440001DF970BD00002640F8B50500FFF7BEFF002844D000F0A1F9B02306005B05002D15D1E8220120D2009C5CFFF779FFE4B2071E30D1FFF72CFF1F201A491A4A8B5823 -:401480008343143803438B50FFF74AFF0FE01F20164A14499C5C144AE4B28B588343143803438B50023800F0E9F8FFF749FF1F230C480D491C40425800279A4314434450B3 -:4014C000012D08D1092000F0D9F8FFF715FF0020FFF746FF0700300000F063F900E0044F3800F8BD000026401CFF00004107000003004200F0B5060085B00D00204F04295C -:4015000001D001291AD100207C68002C35D01D4B984232D02379B3420ED1A368002B01D02B4209D1E36801A85A689B6842608360057023689847BC606469E6E7BC6802296C -:4015400002D1002C00D024690020002C15D00D4B984212D02379B3420DD1A368002B01D02B4208D1E36801A85A689B68426083600570236898472469E7E705B0F0BDC0462E -:401580003C070008FF004200F0B52B4C85B023680700002B0AD100F000F923680190002B10D004210120FFF7A5FF0BE001210800FFF7A0FF0028EED002210120FFF79AFF63 -:4015C0001E4C35E0B0256D056B78002B02D06B78212B03D1380000F057FC1EE0184E194BF3580293E823DB00EB5CDBB20393FFF767FE3100144A00280AD01F2302981840AF -:4016000003000398834203D0104BEB58B35001E000238B50380000F03FFC019800F0C1F823680024A34203D008210120FFF762FF200005B0F0BDC0463C070008FF00420033 -:40164000000026401CFF0000307F00001018000010B5E82400F0A1F8064B07495A68A4010A4022435A605A68114059605B6800F098F810BD00002640FF00FC0F10B5034BE8 -:401680001B78584300F080F810BDC046D400000880220020034B12069A649B6C834200DA0148704700002740030046008022054B120198585B68DBB2002B02D08023DB02A7 -:4016C0001843704700002640FEE7000002680A4B10B51A6042685A6082689A60C268DA6002691A6142695A6182699A61C269DA61FFF7EAFF10BDC04658040008F0B5192255 -:40170000002800D14B32E82403258A429241194E640033595242AB43134333513359164F3B403351154B5C68AC4322435A605A6817405F60002808D00023102913D9213317 -:401740008B429B415B4201330DE003001D290AD901233A2907D9DB18572904D976338B4240410422131A0F21054A1068884303431360F0BD00002140FFFCFFFFFC002140F6 -:4017800000002540000000000230800803D001300238FCD1C046C0467047EFF3108072B6704780F310887047094B042803D11A68104318600BE0C02200069204104090221D -:4017C00004499200885004211A688A431A60704710E000E000002140034B8002C0180F23006818407047C04600402440F8B58023FA250C0001271B0218430D4E0004F06196 -:40180000AD00326C0A4B01203A4205D1002D0CD0013DFFF733FFF4E7002D06D01A6C10431864DB6A0020238000E00248F8BDC04600003C400400160070B5FA2401260D4BAE -:40184000000418400C4D0143E961A4002B6C0A4A0120334205D1002C0AD0013CFFF70EFFF4E7002C04D0136C18431064002000E0024870BD0000FF7F00003C400400160030 -:40188000F0B5154B9DB001A90A00180070C870C270C870C270C870C20AAC1A0020002432E0CAE0C0E0CAE0C0E0CAE0C013AD2A004833C1CBC1C2C1CBC1C2C1CBC1C20748C7 -:4018C000FFF7D8FC21000648FFF7D4FC29000548FFF7D0FC1DB0F0BD741F0010000132408001324000023240F0B585B00090002800D159E1C54F7B689B0301D5FFF7A8FE16 -:40190000C34CC44DC44BEA58002A06D0013C002C03D00120FFF7B2FEF3E70122BF4C2959114205D0BE49BB484158114200D03DE1EB58B84E002B00D038E1FFF7A1FFB94AA7 -:40194000B94BF2508022009BD2021B781343B74AB350B74AB74BF250B74B5A6801231A4200D025E1B54A116F08220A4008D1B44BB44918681300884202D900F0D9F9431EA1 -:401980002A68002B03D0B0485B03034300E0AF4B13432B607B699F499C4E01275B000DD539000320FFF73AFD73699B0F3B420AD08022B369D2051343B36104E00320A44ACB -:4019C0008B5803438B502B5940200193019AA14BA14E13432B51FFF751FE0123AA598D4F1A4208D1BB514020FFF748FE03234020BB51FFF743FEFA27019A984B984E1A4056 -:401A000016430192FF002E51964A974BD3581022134207D1002F00D1CCE00120013FFFF72DFEF1E7002F00D1C4E008218F4A0120AB580B43AB50FFF7DBFC002802D18C4E35 -:401A4000019B1E438B4B1E4001231E432E511E00894C734BEB58334207D1002C00D1A9E00120013CFFF70AFEF3E7002C00D1A1E00B27C02181484901FFF7DEFE041E05D1C6 -:401A800002AB991D7D48FFF7B1FE0400013F002F00D136E1002C26D1C02202AB9E1D338852019342E5D131007548FFF79FFE041E19D180233288DB001A4200D081E00B2774 -:401AC000019380216E48C900FFF7B6FE041E04D131006B48FFF78AFE0400013F002F00D10FE1002C68D0B0256D056B78002B44D06B78212B41D0634FEB5B002B3DD0002C92 -:401B000000D000E102AB9E1D31005F48FFF76EFE041E00D0F7E0C021E85B3488084060398C434008594920430140F020EA5BC000EB5BD201024011439B05554A9B0F11406D -:401B4000DB02194350483180FFF776FE041E00D0D9E031004F48FFF749FE041E00D0D2E0C022EB5B31889B069B0F9B019143194348483180FFF760FE0400002C00D0C2E0F6 -:401B8000009B454859781D78444B49001943FFF753FE041E04D142494248FFF74DFE04006801FFF76BFDAEE03F4CACE03F4CAAE03F4CA8E03F4CA6E03388019A934200D02B -:401BC0007FE731003C48FFF711FE041E00D08AE732883F2310009843009B38499F78DB78012F0ED10222012B04D89FB2D21B92B2019201E017000194702210433080304AE9 -:401C000069E0002B5ED0019401275EE000002640F17E0E0000003C406CF00100A0F00100B4F0010006000001A4F00100A8F0010001000100ACF00100FC003C4000F03D405C -:401C4000C800000800093D00041A0080040A0080C4F0010030000300B0F00100EFFFFEFF20000200000032401040000068F0010028000200FFFFFBFFF07E0E00021E0000B3 -:401C8000031E000016180000071E00007FF5FFFFFFE7FFFF061E0000081E000001100000376800000F1E000001001600030016000200160004001600091E0000C0000008E2 -:401CC0000048E80101201F0001907F2082436F38024332800D4ADA400A6031880C4839433180FFF7A9FD009B0400DB78DF1B03231F40019B9B001F43064BBFB23780EF506D -:401D0000F1E6054CEFE6200005B0F0BD0024F400091E000064F001000400160002B4714649084900095C49008E4402BC7047C046002243088B4274D303098B425FD3030ADB -:401D40008B4244D3030B8B4228D3030C8B420DD3FF22090212BA030C8B4202D31212090265D0030B8B4219D300E0090AC30B8B4201D3CB03C01A5241830B8B4201D38B03BF -:401D8000C01A5241430B8B4201D34B03C01A5241030B8B4201D30B03C01A5241C30A8B4201D3CB02C01A5241830A8B4201D38B02C01A5241430A8B4201D34B02C01A52416A -:401DC000030A8B4201D30B02C01A5241CDD2C3098B4201D3CB01C01A524183098B4201D38B01C01A524143098B4201D34B01C01A524103098B4201D30B01C01A5241C308B9 -:401E00008B4201D3CB00C01A524183088B4201D38B00C01A524143088B4201D34B00C01A5241411A00D20146524110467047FFE701B5002000F006F802BDC0460029F7D08E -:401E400076E770477047C046002310B59A4203D0CC5CC4540133F9E710BD03008218934202D019700133FAE770470000F8B5C046F8BC08BC9E467047F8B5C046F8BC08BC4F -:401E80009E4670470000000001B40248844601BC604700BF9D02000801B40248844601BC604700BF610300080300000001000000010000000000000005036000040000002B -:401EC00001000000000000000100000006046000080000009C060008F10700100800000001000000020000000200000008080003090000000100000000000000030000008F -:401F00000909000308000000BC060008D10700100A0000000100000004000000040000000A0A000C0B0000000100000000000000050000000B0B000C10000000DC06000872 -:401F4000E1070010192001021901020000000000000000000000000000000000000000BA0000000000000000000000000000000000001D1D0000000000000000000000001D -:401F800066666666000000000000FFFF000000001C1C1C1C1C1C1C1C00000000000000000000000066E6EE66000000000000FFFF000000001C1A1A1A1A1A0000000000006F -:401FC000000000000000000066E66666000000000000FFFF000000001A1A001C00000000000000000000001000000008C000000004200010C0000008980300007804000888 -:40200000D002000000127A0000127A0000093D0000093D0000093D0004000000A00F00000000D0070700000002000000030000000F0000000000000000000000030000003C -:402040000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000019000050A000000002FF000053 -:40208000E9000010C10000100000000080B2C00017D00C4A1368002BFCDA3E220A4B06211A600A4A0A4B1A60A3220A4BD2009950094A985000209958024948609958002904 -:4020C000FCDA7047E0002340040126401E1F000008012640000026401C05000010B54378FF2B0DD100F022F9064BDB685A68012311681943116011681942FCD100F00EF987 -:4021000010BDC04680002340F7B50F00019000F03DF9050003281FD1274B1B69002B19DB002000F02BF9254EB04213D00023244A1900012000F01AF9041E0BD1002000F0EA -:402140001DF9204BB04203D09C4203D00134F5E79C4201D11C4E2CE000F0E8F81B4B1C4A0400D358002B06DA1A4A01211A4800F0F5F8002801D0144E0EE03800FFF786FF9A -:40218000019B002B07D0144A1369002BFCDB00F0DDF8060000E0114E032D03D0200000F0BDF806E00121002000F0C8F80028F9D1F4E73000FEBDC046C00023400101880090 -:4021C00038010008F0490200050052001C050000000026402C070008000023400100500070B52B490A682A4B002AFBDA0221DA680A43DA60DA68D2071BD5264D264CD968FA -:402200002A69266889B2360A36060E43FF21120209040A4032439026DA6029691F4A360111403143296121680A40324322602A692268002204241A495A605A680A6922431C -:402240000A61012801D030BF00E020BF1A68104D002AFBDAEA68D20712D5FF240D4E0F4A3069E9682402090A1040214001430A4831610668E9683240090C0C40224302602F -:402280000221DA688A43DA6000225A6070BDC046E00023400000214090002140FF00FFFF00ED00E00421134A13690B431361012801D030BF00E020BF0F4A1368002BFCDA07 -:4022C0000E4B19691A00002910D10D490D4B196006210D4B19600D4B383119600C4B0631196019680029FCDA0A4B13610022024B5A60704700ED00E0E0002340FC002540E5 -:402300001E1F00000801264018052640040126401C052640AAAAAAAA0000000001B40248844601BC604700BFA317001001B40248844601BC604700BF9B17001001B4024871 -:40234000844601BC604700BF890C001001B40248844601BC604700BFDD10001001B40248844601BC604700BFE10B001001B40248844601BC604700BFF90D001001B40248F9 -:40238000844601BC604700BF010D001001B40248844601BC604700BFE50300100000000000000000000000000000000000000000000000000000000000000000000000002E -:4023C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD -:00000001FF \ No newline at end of file diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.03.hex b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.03.hex new file mode 100644 index 0000000000..026caf8e8f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_CY8C63XX/TARGET_MCU_PSOC6_M4/hex/psoc63_m0_default_1.03.hex @@ -0,0 +1,146 @@ +:020000041000EA +:4000000000000108310100100D00000095010010000000000000000000000000000000000000000000000000000000009101001000000000000000009101001091010010DC +:4000400091010010B5070010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001036 +:400080009101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001091010010910100109101001020 +:4000C00010B5064C2378002B07D1054B002B02D0044800E000BF0123237010BD7804000800000000B01F0010084B10B5002B03D00749084800E000BF07480368002B00D121 +:4001000010BD064B002BFBD09847F9E7000000007C040008B01F001044010008000000007047EFF3108072B6704780F310887047FFF7F6FF72B6104C104DAC4209DA216848 +:400140006268A368043B02DBC858D050FAE70C34F3E70B490B4A0020521A02DD043A8850FCDC094809490860BFF34F8F00F0ECF800F01EF8FEE70000B41F0010CC1F001019 +:4001800078040008380700080000000808ED00E0FEE7FEE700B504207146084202D0EFF3098001E0EFF30880043001F071FAFEE710B500F0A5F962B6064B5B689B0301D503 +:4001C00001F028FA044800F02FF9002001F0BEF9FBE7C0460000264000000810F8B5E023504C9B00E2580F231340D022990092000919885807224C4D0240032A05D0042A61 +:4002000005D0002A0FD0494811E028680FE0C022920089581F220A40112A01D0132A04D18020000203E0424801E0FA20C001002B27D1B223B1210322DB00C900E65863588A +:4002400067581B0F3F0F1340174205D0354F7958090F0A40012A01D1F20701D4032B3AD1B023344ADB00E658A158E758C904C90C01F03EFDB603F901B60BC90F704301316A +:4002800027E0012B27D1C823C0210322DB00C900E658635867583F0F174205D0214F7958090F0A40012A01D1F20703D49B009B0F032B10D1C0227F23D200A758A1583B40BD +:4002C0001F27A658090A3940584301F011FD310C394001F00DFDE0239B00E3589B069B0FD840154B68601C691969240A090E013101F0FEFCE1B2A860013101F0F9FC0F4B09 +:40030000E860286104000E49C01801F0F1FCFA210C4B28758900E01801F0EAFCA861C003E861F8BD00002640C000000800366E0100127A0084050000000021403F420F00D1 +:4003400040420F00E7030000B021E02010B530241F4BC9005A588000520052085A501A58A2431A50802252045A501A491A4A80209950A021043289019950FF21174AC005FA +:40038000995081315A5892009208024380205A505A580006024301205A505A5882435A5000F036FAFFF71AFF00F00CFA00F014FA00F09AFEB0235B055A78002A02D05B78CD +:4003C000212B03D10022064BDA605A6010BDC0460000264001000200840500008C050000E0002340024BD86F032318407047C0460400214010B5FFF794FE074A074BD16F79 +:400400000B4007490B43D367102306490A681A42FCD0FFF78AFE10BD04002140FCFF00000100FA058800214070B50F4C0600FFF778FEE36F0500DB439B0701D1FFF7DAFF3F +:40044000B0230A4A9B00D650E26F094B09491340094A1343E36710230A681A42FCD02800FFF763FE70BDC0460400214000002140FCFF0000880021400300FA0510B5040063 +:40048000007B00F0D5F8606010BD10B50400007B216900F097F8606010BD10B5037B0169180000F0AFF810BD10B50400C06800F0EBF8606010BD10B5C06800F0F9F810BD88 +:4004C00010B50400C06800F005F9606010BD10B5C06800F019F910BD10B504000C23C05E00F056F8606010BD10B50C23C05E00F067F810BD10B5C06800F018F910BD00000A +:4005000010B500221849042000F086FC01221749042000F081FC02221549042000F07CFC03221449042000F077FC04221249100000F072FC05221149042000F06DFC06229D +:400540000F49042000F068FC07220E49042000F063FC08220C49042000F05EFC09220B49042000F059FC10BD7D0400108B0400109B040010A9040010B7040010C1040010DA +:40058000CF040010D9040010E9040010F504001070B507250412E4B205400D2C09D801F0DCF8064B1C5D2C41E407E41701F0D9F801E001246442200070BDC046681E0010D0 +:4005C00070470000F8B50C00050001F0C6F80C2301225D431300A3401A00094E71198F683A4008D13B43AD598B60631C4B60AB4202D94A6000E0FF2401F0B3F82000F8BD2B +:40060000E000000870B50C00050001F0A6F801210C23A1406B43054AD3189A680A4201D08A439A6001F09DF870BDC046E0000008F0B50C2485B0019001F08FF8019B114D5F +:400640005C432B195B68029003932E1971680198FFF7B8FF0700FF280DD173682A59934201D9002373602A1953680399994202D001335360E9E7029801F073F8380005B056 +:40068000F0BDC046E000000810B50400072809D801F063F8054B1A5D002A01D101321A5501F05FF80120404210BDC0469404000810B50400072809D801F04FF8044B1A5DE0 +:4006C000012A01D100221A5501F04BF810BDC0469404000870B505001F280ED801F03DF8084B30335C5D002C02D101225A5501E00124644201F035F801E001246442200072 +:4007000070BDC046E000000810B504001F280AD801F023F8044B30331A5D012A01D100221A5501F01EF810BDE000000870B5B024C025144B144A15496405ED00E35CA25CA1 +:40074000615C665D3F251F242A400C4024039201224311002B407F2219430B003240520413430B4A1C0A110050310B701B0C8B7000234C7011005031595CC1540133062B91 +:40078000F8D170BD040600000506000003060000E000000810B50248583000F051FB10BD1C05000810B50248B03000F049FB10BD1C05000810B5024800F042FB10BDC0464C +:4007C0001C05000810B5034A80216032042000F001FA10BD1C06000870B500F0BEFF0500094800F08BFA094C200000F0B9FA2000343000F0B5FA2000683000F0B1FA280032 +:4008000000F0AFFF70BDC0461C050008781E0010F0B5962191B0002000F052FF00F028FF002801D100F016FF012000F0EFFDE821724C734B626C89011A400A436264626CEF +:400840000193120AD2B23A2A04D1636C6D4A13400B4363643422002103A801F0DEFA03AA0021694800F06EFC3422002103A801F0D4FA03AA0121644800F064FC0822042659 +:400880002368624D134323602369334207D1002D04D0012000F0D4FE013DF5E701E0002D00D1FEE7A02603220127594CF600A35903AD93433B43A351D2195649280001F045 +:4008C000A3FA280000F0F0FF534901980B68534A03400B608021136949041B021B0A0B4313611369019902200B401361E0230F219B00E2588A433A43E250E25821318A431F +:400900008021E250E25809060A43E250002100F0D3FA0021032000F0CFFA0021042000F0CBFA0321002000F0C7FA0321380000F0C3FA384B0522191D280001F065FA2900C8 +:40094000380000F0DBFA002800D0FEE73449380000F026FB002800D0FEE7324B324AE1580A403A43E250E158304A0A408021E250E25809060A43E250A2592D4B1340A3517D +:40098000A2592C4B13408022920113438022A351A35912021343A351184B1A68264B1340164A136000F0E0FEC0235B00E3583B4204D1224AA3585B005B08A3506421002025 +:4009C00000F07EFE24220021280001F026FA29000D4800F031FC2A000E4B0C3313CB13C213CB13C213CB13C22900154800F024FC144A154B1A6011B0F0BDC04600002740CC +:400A0000FF00FFFFFFC5FFDF0000324020A1070000002640141F001090002140000021401027000004050000FEFCFFFFFFFF00FFFFF0FFFFFF8FFFFFFFFCFFFF0C0500002A +:400A40000003324001001180000E1F41030010B5FF24800882009B1ADB009C409940E243214007282DD8174B01F038F904090E13181D2227186A02401143196221E0586A87 +:400A80000240114359621CE0986A02401143996217E0D86A02401143D96212E0186B0240114319630DE0586B02401143596308E0986B02401143996303E0D86B024011438A +:400AC000D96310BD00002140064B10309A68064B9A4203D183009858995002E0034B8000C058704700ED00E00000000800000010F7B5051E01913DD00023C05E002802DB84 +:400B0000A978FFF7A3FF6A680023E85E9201002812DB1A4B81088900C918FF2303271C00C0250740FF00BC401A40BA40AD004E59A64332434A5113E003250F2381B20B40C6 +:400B40002940A940FC352F002A408F408A40083B9B080B4C9B001B19DE69BE433243DA61074B00259A68074B9A4204D10199FFF7ABFF00E0044D2800FEBDC04600E100E02B +:400B800000ED00E000000008010056000369002B03DA89B24160002000E001487047C04601008A000368002B01DB034803E089B2C26081600020704701008A000369002B51 +:400BC00003DAC36800200B6000E001487047C04601008A0070B5040010000F2C2BD8002A07D1002927D1154B6401E418144B1C6022E000291FD01F260E401CD1104D0F4B6A +:400C00006401E4186960AA60CA0831002C6001F004F931002000FFF7B9FF31002A1D2868FFF7C0FF011E04D12868FFF7AFFF011E02D0044900E00449080070BD000023401C +:400C40000C07000801018A0003018A00194BF7B51A680193D76804003B680E00834223D90025A94202D100F078FD0500019B18680368002B01DB104C10E063095A01A41AB8 +:400C80000122A24079689B00CB18196811420DD00024914319600021FFF778FF002E07D1280000F05EFD03E0044C01E0044CF2E72000FEBD0C0700080301880004018A0059 +:400CC000020188000A4B1B68DA68136883420DD9430999005B01C31A0120984052688B581840431E9841034BC01800E0024870470C0700080001880004018A00024B1A68DA +:400D0000002A00D11860704718070008F0B52C246043104C1E0024681F0A2018FF2426403C400D4F06607601F61906610B4E1B0C44606401A4191E04836033434461A36046 +:400D40000023059DC261016283619D4201D02B888381F0BD180700080000234000102340F0B5038985B002AD2B800368066A1933AB704368476A0095826AC16A040003938F +:400D80000369C068FFF7C2FF00213B000A0000913000FFF7BBFF216B2800FFF7A9FE0023EA5E002A05DB1F231A401E3B9340024A136005B0F0BDC04600E100E0F7B52C259E +:400DC000124C6843276801933C182669002E08D04D4379198869002805D13568002D02DA03E00B4811E00B480FE06768012425004B689D4013882D041D431560F2608C6135 +:400E0000BC40019BA4B24B62B460FEBD1807000804028A0007028A002C235843064B1B681818C369934204D9036A9200D150002000E002487047C046180700080A028A004E +:400E400073B5002642690400D56801962B0CB3421CD01B040069136013680369B34215DA01A9FFF7ABFEB0420CD10198E26903681E0C0378934205D2226A9B009B58002BC6 +:400E800000D0984731002069FFF780FEADB2002D0ED063691D6000251B68636AAB4202D09847656203E0A36A002B00D09847A56163691B6873BD0000042819D804290FD947 +:400EC0004B1EFF3B132B13D81F231940094B8000C018C02304229B00C1504033C25005E00723D0301940034B8000C150002000E0014870470000264001004A00F0B50128DF +:400F000019D1C022224BD2009A58002A0CDB8A78901E0E280FD84C78601E11280BD8C8780D7800282FD101E01A4830E07026152D01D9AE4201D2184829E00E79022E14D0BF +:400F4000F82124024901F8270C4021007F2412047F033A4011432C4021438024C022C006240520400143D2009950C020C0248005360706403200E4001D590849002029407D +:400F80000A431A5103E03826122DD4D9D1E7F0BD0000264003004A0001004A00FFFFFFCFF8B50D00012819D1C02180240D4BC9005A582406C826224307001C005A50F600B8 +:400FC000A3593B4206D1002D0AD0012000F038FB013DF5E70020002D03D101E0024800E00248F8BD0000264001004A0002004A001E4A0300904238D010D840282ED005D8A4 +:40100000002831D010282DD119482EE0802827D08021100049008B4227D023E0154A904214D008D8A022120690421DD0124AA020934211D016E0114A904209D0104A9042FA +:4010400008D0104A90420DD10F480EE0A42003E00E480AE00E4808E0C00306E00D4804E00D4802E00D4800E0002070470600520001005000010000F0090000A0040000F0C8 +:40108000050000F0030000F00100520002005200030052000200500005005200FF0052000B4B10B51B69002B10DB0A4B0A4C1868FFF79EFF0121094B094A99509958002913 +:4010C000FCD1064909590029F8D100E0054810BD000023401C0700088C040000000025400C0400000200500010B5022202490020FFF792FE10BDC046990100080F4B30B513 +:40110000C0180F4BC009C01800011F23032909D81D00C9008D4013408B400468AC432343036009E01D000439C9008D4013408B404468AC432343436030BDC0460000CEBF7C +:4011400000100304F7B504000E00150000286ED0002A6CD0012312688B40002A01D1436000E08360B30001930F231900B0008140A26A8A4369680B4083401343A3622A7A34 +:4011800031002000FFF7BAFF0320710088400322636A83431800EB6813408B400343636201231F00B7400097FF43BC462F6962461F40B740A0691031104038436F69A061EE +:4011C0001F40B740E06A10403843E062A86903221840B0400600E869276B10408A408840009930430A4397436A6A384356000222206304201640AA6A616B92000240286ABA +:40120000324303401A43EB6AD80018230340FF2013432A6B019D520102401343FE2292002A40934081430B436363002000E00148FEBDC04601005A0000281BD0002919D00A +:401240000D4B0E4AC318DB099B180A681B010260CA6882620A69C2624A6902638A6842624A6882618A694263CA6900201A600A6A5A6000E0024870470000CEBF0010030454 +:4012800001005A000120024B1B68DB0D984370470000264010B50F2402200649064BCA58A2430243CA50F02212028B58A34303438B5010BD0000214004F0000010B50F24B8 +:4012C00003200649064BCA58A2430243CA50F02212028B58A34303438B5010BD0000214004F000000449054A054B88580340C020C00103438B5070470000214004F00000B6 +:40130000FF8FFFFF0449054A054B885803408020C00103438B5070470000214004F00000FF8FFFFF70B50400002000F035FA00280BD1802324065B041C4023000E490F4A31 +:401340008D692A4013438B6115E0002C01D10C4A00E00C4A01210C48FFF724FC002809D1094A1369002BFCDB074B0020DB681B0EA02B00D0054870BD00F02540FFFFFFFEAA +:401380000100003001010030000023400400420010B5002000F000FAB0235B055A78002A03D05A780123222A01D843424341180010BD0000031E03D1084B5869C00F0CE083 +:4013C0000020012B09D1054918008A69920F1A4201D18869C00F01231840704700002640072370B5084CA2691A4090420BD0A5699D4303402B43A361002904D0904202D944 +:40140000C82000F01DF970BD00002640F8B50500FFF7BEFF002844D000F09FF9B02306005B05002D15D1E8220120D2009C5CFFF779FFE4B2071E30D1FFF72CFF1F201A49D4 +:401440001A4A8B588343143803438B50FFF74AFF0FE01F20164A14499C5C144AE4B28B588343143803438B50023800F0E9F8FFF749FF1F230C480D491C40425800279A4397 +:4014800014434450012D08D1092000F0D9F8FFF715FF0020FFF746FF0700300000F061F900E0044F3800F8BD000026401CFF00004107000003004200F0B5060085B00D004F +:4014C000204F042901D001291AD100207C68002C35D01D4B984232D02379B3420ED1A368002B01D02B4209D1E36801A85A689B6842608360057023689847BC606469E6E760 +:40150000BC68022902D1002C00D024690020002C15D00D4B984212D02379B3420DD1A368002B01D02B4208D1E36801A85A689B68426083600570236898472469E7E705B0D2 +:40154000F0BDC0462C070008FF004200F0B52B4C85B023680700002B0AD100F0FEF823680190002B10D004210120FFF7A5FF0BE001210800FFF7A0FF0028EED00221012092 +:40158000FFF79AFF1E4C35E0B0256D056B78002B02D06B78212B03D1380000F05DFC1EE0184E194BF3580293E823DB00EB5CDBB20393FFF767FE3100144A00280AD01F234C +:4015C0000298184003000398834203D0104BEB58B35001E000238B50380000F035FC019800F0BFF823680024A34203D008210120FFF762FF200005B0F0BDC0462C070008DF +:40160000FF004200000026401CFF0000307F00001018000010B5E82400F09FF8064B07495A68A4010A4022435A605A68114059605B6800F096F810BD00002640FF00FC0FFE +:4016400010B5034B1B78584300F07EF810BDC046D400000880220020034B12069A649B6C834200DA0148704700002740030046008022054B120198585B68DBB2002B02D056 +:401680008023DB021843704700002640FEE7000002680A4B10B51A6042685A6082689A60C268DA6002691A6142695A6182699A61C269DA61FFF7EAFF10BDC04658040008F5 +:4016C000F0B51922002800D14B32E82403258A429241194E640033595242AB43134333513359164F3B403351154B5C68AC4322435A605A6817405F60002808D000231029B8 +:4017000013D921338B429B415B4201330DE003001D290AD901233A2907D9DB18572904D976338B4240410422131A0F21054A1068884303431360F0BD00002140FFFCFFFF53 +:40174000FC002140000025400230800803D001300238FCD1C046C0467047EFF3108072B6704780F310887047094B042803D11A68104318600BE0C022000692041040902200 +:4017800004499200885004211A688A431A60704710E000E000002140034B8002C0180F23006818407047C04600402440F8B58023FA250C0001271B0218430D4E0004F061D6 +:4017C000AD00326C0A4B01203A4205D1002D0CD0013DFFF735FFF4E7002D06D01A6C10431864DB6A0020238000E00248F8BDC04600003C400400160070B5FA2401260D4BED +:40180000000418400C4D0143E961A4002B6C0A4A0120334205D1002C0AD0013CFFF710FFF4E7002C04D0136C18431064002000E0024870BD0000FF7F00003C40040016006E +:40184000F0B5154B9DB001A90A00180070C870C270C870C270C870C20AAC1A0020002432E0CAE0C0E0CAE0C0E0CAE0C013AD2A004833C1CBC1C2C1CBC1C2C1CBC1C2074807 +:40188000FFF7DAFC21000648FFF7D6FC29000548FFF7D2FC1DB0F0BD441F0010000132408001324000023240F0B585B00090002800D159E1C54F7B689B0301D5FFF7AAFE7E +:4018C000C34CC44DC44BEA58002A06D0013C002C03D00120FFF7B4FEF3E70122BF4C2959114205D0BE49BB484158114200D03DE1EB58B84E002B00D038E1FFF7A1FFB94AE6 +:40190000B94BF2508022009BD2021B781343B74AB350B74AB74BF250B74B5A6801231A4200D025E1B54A116F08220A4008D1B44BB44918681300884202D900F0D9F9431EE1 +:401940002A68002B03D0B0485B03034300E0AF4B13432B607B699F499C4E01275B000DD539000320FFF73CFD73699B0F3B420AD08022B369D2051343B36104E00320A44A09 +:401980008B5803438B502B5940200193019AA14BA14E13432B51FFF753FE0123AA598D4F1A4208D1BB514020FFF74AFE03234020BB51FFF745FEFA27019A984B984E1A4090 +:4019C00016430192FF002E51964A974BD3581022134207D1002F00D1CCE00120013FFFF72FFEF1E7002F00D1C4E008218F4A0120AB580B43AB50FFF7DDFC002802D18C4E72 +:401A0000019B1E438B4B1E4001231E432E511E00894C734BEB58334207D1002C00D1A9E00120013CFFF70CFEF3E7002C00D1A1E00B27C02181484901FFF7DEFE041E05D104 +:401A400002AB991D7D48FFF7B1FE0400013F002F00D136E1002C26D1C02202AB9E1D338852019342E5D131007548FFF79FFE041E19D180233288DB001A4200D081E00B27B4 +:401A8000019380216E48C900FFF7B6FE041E04D131006B48FFF78AFE0400013F002F00D10FE1002C68D0B0256D056B78002B44D06B78212B41D0634FEB5B002B3DD0002CD2 +:401AC00000D000E102AB9E1D31005F48FFF76EFE041E00D0F7E0C021E85B3488084060398C434008594920430140F020EA5BC000EB5BD201024011439B05554A9B0F1140AE +:401B0000DB02194350483180FFF776FE041E00D0D9E031004F48FFF749FE041E00D0D2E0C022EB5B31889B069B0F9B019143194348483180FFF760FE0400002C00D0C2E036 +:401B4000009B454859781D78444B49001943FFF753FE041E04D142494248FFF74DFE04006801FFF76DFDAEE03F4CACE03F4CAAE03F4CA8E03F4CA6E03388019A934200D069 +:401B80007FE731003C48FFF711FE041E00D08AE732883F2310009843009B38499F78DB78012F0ED10222012B04D89FB2D21B92B2019201E017000194702210433080304A29 +:401BC00069E0002B5ED0019401275EE000002640F17E0E0000003C406CF00100A0F00100B4F0010006000001A4F00100A8F0010001000100ACF00100FC003C4000F03D409D +:401C0000C800000800093D00041A0080040A0080C4F0010030000300B0F00100EFFFFEFF20000200000032401040000068F0010028000200FFFFFBFFF07E0E00021E0000F3 +:401C4000031E000016180000071E00007FF5FFFFFFE7FFFF061E0000081E000001100000376800000F1E000001001600030016000200160004001600091E0000C000000822 +:401C80000048E80101201F0001907F2082436F38024332800D4ADA400A6031880C4839433180FFF7A9FD009B0400DB78DF1B03231F40019B9B001F43064BBFB23780EF50AD +:401CC000F1E6054CEFE6200005B0F0BD0024F400091E000064F001000400160002B4714649084900095C49008E4402BC7047C046002243088B4274D303098B425FD3030A1C +:401D00008B4244D3030B8B4228D3030C8B420DD3FF22090212BA030C8B4202D31212090265D0030B8B4219D300E0090AC30B8B4201D3CB03C01A5241830B8B4201D38B03FF +:401D4000C01A5241430B8B4201D34B03C01A5241030B8B4201D30B03C01A5241C30A8B4201D3CB02C01A5241830A8B4201D38B02C01A5241430A8B4201D34B02C01A5241AA +:401D8000030A8B4201D30B02C01A5241CDD2C3098B4201D3CB01C01A524183098B4201D38B01C01A524143098B4201D34B01C01A524103098B4201D30B01C01A5241C308F9 +:401DC0008B4201D3CB00C01A524183088B4201D38B00C01A524143088B4201D34B00C01A5241411A00D20146524110467047FFE701B5002000F006F802BDC0460029F7D0CF +:401E000076E770477047C046002310B59A4203D0CC5CC4540133F9E710BD03008218934202D019700133FAE770470000F8B5C046F8BC08BC9E467047F8B5C046F8BC08BC8F +:401E40009E4670470000000001B40248844601BC604700BF6103000801B40248844601BC604700BF9D020008000000000000000000000000000000000300000001000000D8 +:401E80000100000000000000050360000400000001000000000000000100000006046000080000008C060008B50700100800000001000000020000000200000008080003BB +:401EC000090000000100000000000000030000000909000308000000AC060008950700100A0000000100000004000000040000000A0A000C0B000000010000000000000013 +:401F0000050000000B0B000C10000000CC060008A5070010192001021901020000000000000000000000000000000000000000BA00000000000000000000000000000000C2 +:401F400000001D1D00000000000000000000000066666666000000000000FFFF000000001C1C1C1C1C1C1C1C00000000000000000000000066E6EE66000000000000FFFF13 +:401F8000000000001C1A1A1A1A1A000000000000000000000000000066E66666000000000000FFFF000000001A1A001C00000000000000000000001000000008C000000045 +:401FC000D41F0010C00000089803000078040008C002000000127A0000127A0000093D0000093D0000093D0004000000A00F00000000D007070000000200000003000000B5 +:402000000F0000000000000000000000030000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000008B +:402040000000000019000050A000000002FF0000E9000010C10000100000000080B2C00017D00C4A1368002BFCDA3E220A4B06211A600A4A0A4B1A60A3220A4BD200995093 +:40208000094A9850002099580249486099580029FCDA7047E0002340040126401E1F000008012640000026401C05000010B54378FF2B0DD100F042F9064BDB685A6801232C +:4020C00011681943116011681942FCD100F01EF910BDC04680002340F7B50F00019000F01DF9050003281FD1274B1B69002B19DB002000F01BF9254EB04213D00023244AB8 +:402100001900012000F022F9041E0BD1002000F00DF9204BB04203D09C4203D00134F5E79C4201D11C4E2CE000F008F91B4B1C4A0400D358002B06DA1A4A01211A4800F05F +:402140000DF9002801D0144E0EE03800FFF786FF019B002B07D0144A1369002BFCDB00F0CDF8060000E0114E032D03D0200000F0CDF806E00121002000F0B8F80028F9D157 +:40218000F4E73000FEBDC046C00023400101880038010008F0490200050052001C050000000026401C070008000023400100500070B52B490A682A4B002AFBDA0221DA6889 +:4021C0000A43DA60DA68D2071BD5264D264CD9682A69266889B2360A36060E43FF21120209040A4032439026DA6029691F4A360111403143296121680A40324322602A6930 +:402200002268002204241A495A605A680A6922430A61012801D030BF00E020BF1A68104D002AFBDAEA68D20712D5FF240D4E0F4A3069E9682402090A1040214001430A48CF +:4022400031610668E9683240090C0C40224302600221DA688A43DA6000225A6070BDC046E00023400000214090002140FF00FFFF00ED00E00421134A13690B4313610128B0 +:4022800001D030BF00E020BF0F4A1368002BFCDA0E4B19691A00002910D10D490D4B196006210D4B19600D4B383119600C4B0631196019680029FCDA0A4B13610022024BB3 +:4022C0005A60704700ED00E0E0002340FC0025401E1F00000801264018052640040126401C052640AAAAAAAA0000000001B40248844601BC604700BF4D0C001001B40248DF +:40230000844601BC604700BFA110001001B40248844601BC604700BF6317001001B40248844601BC604700BFE503001001B40248844601BC604700BFC50C001001B40248C9 +:40234000844601BC604700BF5B17001001B40248844601BC604700BFBD0D001001B40248844601BC604700BFA50B001000000000000000000000000000000000000000007C +:40238000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001D +:4023C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DD +:00000001FF \ No newline at end of file diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/objects.h b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/objects.h index 0ba07af1f7..d7d88e26f8 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/objects.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/objects.h @@ -53,16 +53,8 @@ struct port_s { uint32_t mask; PinDirection direction; PinMode mode; -// __IO uint32_t *reg_in; -// __IO uint32_t *reg_out; }; -// struct analogin_s { -// ADCName adc; -// PinName pin; -// uint32_t channel; -// }; - #if DEVICE_SERIAL #include "cy_scb_uart.h" @@ -107,6 +99,7 @@ struct spi_s { uint32_t div_num; cy_en_divider_types_t div_type; uint32_t clk_frequency; + uint32_t clk_delay; cy_en_scb_spi_mode_t ms_mode; cy_en_scb_spi_sclk_mode_t clk_mode; uint8_t data_bits; diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/pinmap.c b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/pinmap.c index 23fe537aa7..8f637b70cf 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/pinmap.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/pinmap.c @@ -26,20 +26,21 @@ void pin_function(PinName pin, int function) if (pin != NC) { GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(CY_PORT(pin)); uint32_t mode = gpio_get_cy_drive_mode(CY_PIN_DIRECTION(function), CY_PIN_MODE(function)); + uint32_t state = Cy_GPIO_ReadOut(port, CY_PIN(pin)); - Cy_GPIO_Pin_FastInit(port, CY_PIN(pin), mode, 1, CY_PIN_HSIOM(function)); // Force output to enable pulls. switch (mode) { case CY_GPIO_DM_PULLUP: - Cy_GPIO_Write(port, CY_PIN(pin), 1); + state = 1; break; case CY_GPIO_DM_PULLDOWN: - Cy_GPIO_Write(port, CY_PIN(pin), 0); + state = 0; break; default: /* do nothing */ break; } + Cy_GPIO_Pin_FastInit(port, CY_PIN(pin), mode, state, CY_PIN_HSIOM(function)); } } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/spi_api.c b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/spi_api.c index 45f71cc148..9ae3e9ac1f 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/spi_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/spi_api.c @@ -87,10 +87,10 @@ static IRQn_Type spi_irq_allocate_channel(spi_obj_t *obj) #endif // M0 } -static void spi_irq_release_channel(IRQn_Type channel, uint32_t spi_id) +static void spi_irq_release_channel(spi_obj_t *obj) { #if defined (TARGET_MCU_PSOC6_M0) - cy_m0_nvic_release_channel(channel, CY_SERIAL_IRQN_ID + spi_id); + cy_m0_nvic_release_channel(obj->irqn, CY_SERIAL_IRQN_ID + obj->spi_id); #endif //M0 } @@ -130,6 +130,14 @@ static int allocate_divider(spi_obj_t *obj) return (obj->div_num == CY_INVALID_DIVIDER)? -1 : 0; } +static void free_divider(spi_obj_t *obj) +{ + if (obj->div_num != CY_INVALID_DIVIDER) { + cy_clk_free_divider(obj->div_type, obj->div_num); + obj->div_num = CY_INVALID_DIVIDER; + } +} + /* * Initializes spi clock for the required speed @@ -149,6 +157,8 @@ static cy_en_sysclk_status_t spi_init_clock(spi_obj_t *obj, uint32_t frequency) // Set up proper frequency; round up the divider so the frequency is not higher than specified. div_value = (CY_CLK_PERICLK_FREQ_HZ + frequency *(SPI_OVERSAMPLE - 1)) / frequency / SPI_OVERSAMPLE; obj->clk_frequency = CY_CLK_PERICLK_FREQ_HZ / div_value / SPI_OVERSAMPLE; + // Delay (in us) required for serialized read operation == 1.5 clocks, min 1us. + obj->clk_delay = (1500000UL - 1 + obj->clk_frequency) / obj->clk_frequency; Cy_SysClk_PeriphDisableDivider(obj->div_type, obj->div_num); if (Cy_SysClk_PeriphSetDivider(obj->div_type, obj->div_num, div_value) != CY_SYSCLK_SUCCESS) { obj->div_num = CY_INVALID_DIVIDER; @@ -166,40 +176,20 @@ static cy_en_sysclk_status_t spi_init_clock(spi_obj_t *obj, uint32_t frequency) } /* - * Initializes i/o pins for spi. + * Sets up i/o connections for spi. */ -static void spi_init_pins(spi_obj_t *obj) +static void spi_set_pins(spi_obj_t *obj) { - bool conflict = false; - conflict = cy_reserve_io_pin(obj->pin_sclk); - if (!conflict) { - pin_function(obj->pin_sclk, pinmap_function(obj->pin_sclk, PinMap_SPI_SCLK)); - } if (obj->pin_mosi != NC) { - if (!cy_reserve_io_pin(obj->pin_mosi)) { - pin_function(obj->pin_mosi, pinmap_function(obj->pin_mosi, PinMap_SPI_MOSI)); - } else { - conflict = true; - } + pin_function(obj->pin_mosi, pinmap_function(obj->pin_mosi, PinMap_SPI_MOSI)); } if (obj->pin_miso != NC) { - if (!cy_reserve_io_pin(obj->pin_miso)) { - pin_function(obj->pin_miso, pinmap_function(obj->pin_miso, PinMap_SPI_MISO)); - } else { - conflict = true; - } + pin_function(obj->pin_miso, pinmap_function(obj->pin_miso, PinMap_SPI_MISO)); } if (obj->pin_ssel != NC) { - if (!cy_reserve_io_pin(obj->pin_ssel)) { - pin_function(obj->pin_ssel, pinmap_function(obj->pin_ssel, PinMap_SPI_SSEL)); - } else { - conflict = true; - } + pin_function(obj->pin_ssel, pinmap_function(obj->pin_ssel, PinMap_SPI_SSEL)); } - if (conflict) { - error("SPI pin reservation conflict."); - } - + pin_function(obj->pin_sclk, pinmap_function(obj->pin_sclk, PinMap_SPI_SCLK)); // Pin configuration in PinMap defaults to Master mode; revert for Slave. if (obj->ms_mode == CY_SCB_SPI_SLAVE) { pin_mode(obj->pin_sclk, PullNone); @@ -209,6 +199,55 @@ static void spi_init_pins(spi_obj_t *obj) } } +/* + * Sets i/o output pins into safe mode while re-configuring peripheral. + */ +static void spi_default_pins(spi_obj_t *obj) +{ + + if (obj->ms_mode == CY_SCB_SPI_MASTER) { + pin_function(obj->pin_sclk, CY_PIN_FUNCTION(HSIOM_SEL_GPIO, 0, PullDown, PIN_OUTPUT)); + if (obj->pin_mosi != NC) { + pin_function(obj->pin_mosi, CY_PIN_FUNCTION(HSIOM_SEL_GPIO, 0, PullUp, PIN_OUTPUT)); + } + if (obj->pin_ssel != NC) { + pin_function(obj->pin_ssel, CY_PIN_FUNCTION(HSIOM_SEL_GPIO, 0, PullUp, PIN_OUTPUT)); + } + } else { + if (obj->pin_miso != NC) { + pin_function(obj->pin_miso, CY_PIN_FUNCTION(HSIOM_SEL_GPIO, 0, PullUp, PIN_OUTPUT)); + } + } +} + +/* + * Initializes i/o pins for spi. + */ +static void spi_init_pins(spi_obj_t *obj) +{ + bool conflict = false; + conflict = cy_reserve_io_pin(obj->pin_sclk); + if (obj->pin_mosi != NC) { + if (cy_reserve_io_pin(obj->pin_mosi)) { + conflict = true; + } + } + if (obj->pin_miso != NC) { + if (cy_reserve_io_pin(obj->pin_miso)) { + conflict = true; + } + } + if (obj->pin_ssel != NC) { + if (cy_reserve_io_pin(obj->pin_ssel)) { + conflict = true; + } + } + if (conflict) { + error("SPI pin reservation conflict."); + } + spi_set_pins(obj); +} + /* * Initializes and enables SPI/SCB. */ @@ -282,8 +321,8 @@ void spi_init(spi_t *obj_in, PinName mosi, PinName miso, PinName sclk, PinName s obj->rx_buffer_size = 0; #endif // DEVICE_SPI_ASYNCH spi_init_clock(obj, SPI_DEFAULT_SPEED); - spi_init_pins(obj); spi_init_peripheral(obj); + spi_init_pins(obj); #if DEVICE_SLEEP && DEVICE_LOWPOWERTIMER obj->pm_callback_handler.callback = spi_pm_callback; obj->pm_callback_handler.type = CY_SYSPM_DEEPSLEEP; @@ -300,27 +339,73 @@ void spi_init(spi_t *obj_in, PinName mosi, PinName miso, PinName sclk, PinName s } } + +void spi_free(spi_t *obj_in) +{ + spi_obj_t *obj = OBJ_P(obj_in); + + spi_default_pins(obj); + Cy_SCB_SPI_Disable(obj->base, &obj->context); + Cy_SCB_SPI_DeInit (obj->base); + +#if DEVICE_SLEEP && DEVICE_LOWPOWERTIMER + Cy_SysPm_UnregisterCallback(&obj->pm_callback_handler); +#endif // DEVICE_SLEEP && DEVICE_LOWPOWERTIMER + +#if DEVICE_SPI_ASYNCH + if (obj->irqn != unconnected_IRQn) { + NVIC_DisableIRQ(obj->irqn); + spi_irq_release_channel(obj); + + obj->irqn = unconnected_IRQn; + } +#endif // DEVICE_SPI_ASYNCH + + if (obj->pin_sclk != NC) { + cy_free_io_pin(obj->pin_sclk); + obj->pin_sclk = NC; + } + if (obj->pin_mosi != NC) { + cy_free_io_pin(obj->pin_mosi); + obj->pin_mosi = NC; + } + if (obj->pin_miso != NC) { + cy_free_io_pin(obj->pin_miso); + obj->pin_miso = NC; + } + if (obj->pin_ssel != NC) { + cy_free_io_pin(obj->pin_ssel); + obj->pin_ssel = NC; + } + + free_divider(obj); +} + + void spi_format(spi_t *obj_in, int bits, int mode, int slave) { spi_obj_t *obj = OBJ_P(obj_in); cy_en_scb_spi_mode_t new_mode = slave? CY_SCB_SPI_SLAVE : CY_SCB_SPI_MASTER; if ((bits < 4) || (bits > 16)) return; + spi_default_pins(obj); Cy_SCB_SPI_Disable(obj->base, &obj->context); obj->data_bits = bits; obj->clk_mode = (cy_en_scb_spi_sclk_mode_t)(mode & 0x3); if (obj->ms_mode != new_mode) { obj->ms_mode = new_mode; - spi_init_pins(obj); } spi_init_peripheral(obj); + spi_set_pins(obj); } void spi_frequency(spi_t *obj_in, int hz) { spi_obj_t *obj = OBJ_P(obj_in); + spi_default_pins(obj); Cy_SCB_SPI_Disable(obj->base, &obj->context); spi_init_clock(obj, hz); Cy_SCB_SPI_Enable(obj->base); + spi_set_pins(obj); } int spi_master_write(spi_t *obj_in, int value) @@ -335,6 +420,10 @@ int spi_master_write(spi_t *obj_in, int value) while (!Cy_SCB_SPI_IsTxComplete(obj->base)) { // wait for the transmission to complete } + // Wait until RX FIFO is filled from the serial register. + while (Cy_SCB_SPI_GetNumInRxFifo(obj->base) == 0) { + /* busy loop */ + } return Cy_SCB_SPI_Read(obj->base); } else { return (int)CY_SCB_SPI_RX_NO_DATA; @@ -387,6 +476,9 @@ int spi_master_block_write(spi_t *obj_in, const char *tx_buffer, int tx_length, ++rx_count; } } + // Delay at least 1.5 clock cycle, so that FIFO is filled with the last char + // and SCLK returns to idle state. + Cy_SysLib_DelayUs(obj->clk_delay); // Read any remaining bytes from the fifo. while (rx_count < rx_length) { *rx_buffer++ = (char)Cy_SCB_SPI_Read(obj->base); diff --git a/targets/targets.json b/targets/targets.json index 3ac3789b38..a64966fd42 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -7954,7 +7954,7 @@ "device_has_remove": ["TRNG", "CRC"], "macros_add": ["CY8C6347BZI_BLD53"], "detect_code": ["6000"], - "hex_filename": "psoc63_m0_default_1.02.hex", + "hex_filename": "psoc63_m0_default_1.03.hex", "post_binary_hook": { "function": "PSOC6Code.complete" }, From bd056c680a614203232a80c0cf6cb575ba4a944c Mon Sep 17 00:00:00 2001 From: Przemyslaw Stekiel Date: Tue, 5 Feb 2019 09:08:49 +0100 Subject: [PATCH 007/109] K64/ARM: Update to 2-region model for HEAP and Stack Memory --- .../TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct | 4 +- .../device/TOOLCHAIN_ARM_STD/sys.cpp | 86 +++++++++++++++++++ targets/TARGET_Freescale/mbed_rtx.h | 12 +++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/sys.cpp diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct index 72a6efafe2..76653b8e6f 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct @@ -126,11 +126,13 @@ LR_IROM1 m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; lo RW_m_data m_data_start m_data_size { ; RW data .ANY (+RW +ZI) } - RW_m_data_2 m_data_2_start m_data_2_size-Stack_Size-Heap_Size { ; RW data + RW_m_data_2 m_data_2_start m_data_2_size { ; RW data .ANY (+RW +ZI) } RW_IRAM1 ImageLimit(RW_m_data_2) { ; Heap region growing up } + ARM_LIB_HEAP AlignExpr(+0, 16) EMPTY (m_data_2_start + m_data_2_size - Stack_Size - AlignExpr(ImageLimit(RW_IRAM1), 16)) { + } ARM_LIB_STACK m_data_2_start+m_data_2_size EMPTY -Stack_Size { ; Stack region growing down } } diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/sys.cpp b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/sys.cpp new file mode 100644 index 0000000000..604ba18369 --- /dev/null +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/sys.cpp @@ -0,0 +1,86 @@ + /* + * Copyright (c) 2019-2019 ARM Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * 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. + * + * Setup a fixed single stack/heap memory model, + * between the top of the RW/ZI region and the stackpointer + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#include +#endif + +#include +#include + +extern char Image$$ARM_LIB_STACK$$ZI$$Limit[]; +extern char Image$$ARM_LIB_HEAP$$Base[]; +extern char Image$$ARM_LIB_HEAP$$ZI$$Limit[]; +extern __value_in_regs struct __initial_stackheap _mbed_user_setup_stackheap(uint32_t R0, uint32_t R1, uint32_t R2, uint32_t R3) { + + struct __initial_stackheap r; + r.heap_base = (uint32_t)Image$$ARM_LIB_HEAP$$Base; + r.heap_limit = (uint32_t)Image$$ARM_LIB_HEAP$$ZI$$Limit; + return r; +} + +#if !defined(MBED_CONF_RTOS_PRESENT) || !MBED_CONF_RTOS_PRESENT + +/* The single region memory model would check stack collision at run time, verifying that + * the heap pointer is underneath the stack pointer. With two-region memory model/RTOS-less or + * multiple threads(stacks)/RTOS, the check gets meaningless and we must disable it. */ +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +__asm(".global __use_two_region_memory\n\t"); +__asm(".global __use_no_semihosting\n\t"); +#else +#pragma import(__use_two_region_memory) +#endif + +/* Fix __user_setup_stackheap and ARM_LIB_STACK/ARM_LIB_HEAP cannot co-exist in RTOS-less build + * + * According AN241 (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0241b/index.html), + * __rt_entry has the following call sequence: + * 1. _platform_pre_stackheap_init + * 2. __user_setup_stackheap or setup the Stack Pointer (SP) by another method + * 3. _platform_post_stackheap_init + * 4. __rt_lib_init + * 5. _platform_post_lib_init + * 6. main() + * 7. exit() + * + * Per our check, when __user_setup_stackheap and ARM_LIB_STACK/ARM_LIB_HEAP co-exist, neither + * does __user_setup_stackheap get called and nor is ARM_LIB_HEAP used to get heap base/limit, + * which are required to pass to __rt_lib_init later. To fix the issue, by subclass'ing + * __rt_lib_init, heap base/limit are replaced with Image$$ARM_LIB_HEAP$$ZI$$Base/Limit if + * ARM_LIB_HEAP region is defined in scatter file. + * + * The overriding __rt_lib_init is needed only for rtos-less code. For rtos code, __rt_entry is + * overridden and the overriding __rt_lib_init here gets meaningless. + */ +extern __value_in_regs struct __argc_argv $Super$$__rt_lib_init(unsigned heapbase, unsigned heaptop); + +__value_in_regs struct __argc_argv $Sub$$__rt_lib_init (unsigned heapbase, unsigned heaptop) +{ + return $Super$$__rt_lib_init((unsigned) Image$$ARM_LIB_HEAP$$Base, (unsigned) Image$$ARM_LIB_HEAP$$ZI$$Limit); +} + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/targets/TARGET_Freescale/mbed_rtx.h b/targets/TARGET_Freescale/mbed_rtx.h index 507c042e2e..172dce07a6 100644 --- a/targets/TARGET_Freescale/mbed_rtx.h +++ b/targets/TARGET_Freescale/mbed_rtx.h @@ -17,6 +17,8 @@ #ifndef MBED_MBED_RTX_H #define MBED_MBED_RTX_H +#include + #if defined(TARGET_K20D50M) #ifndef INITIAL_SP @@ -87,6 +89,16 @@ #ifndef INITIAL_SP #define INITIAL_SP (0x20030000UL) +#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) +extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Base[]; +extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Length[]; +extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Base[]; +extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Length[]; +#define HEAP_START ((unsigned char*) Image$$ARM_LIB_HEAP$$ZI$$Base) +#define HEAP_SIZE ((uint32_t) Image$$ARM_LIB_HEAP$$ZI$$Length) +#define ISR_STACK_START ((unsigned char*)Image$$ARM_LIB_STACK$$ZI$$Base) +#define ISR_STACK_SIZE ((uint32_t)Image$$ARM_LIB_STACK$$ZI$$Length) +#endif #endif #elif defined(TARGET_SDT64B) From 8482fb7676ce362c336823c36c2cb7e928b39324 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Mon, 11 Feb 2019 09:36:18 +0000 Subject: [PATCH 008/109] Revert "MIMXRT1050_EVK: Add IAR support in the exporter" --- tools/export/iar/iar_definitions.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/export/iar/iar_definitions.json b/tools/export/iar/iar_definitions.json index f5e588be61..5ef5b21a90 100644 --- a/tools/export/iar/iar_definitions.json +++ b/tools/export/iar/iar_definitions.json @@ -96,9 +96,6 @@ "LPC54628J512ET180": { "OGChipSelectEditMenu": "LPC54618J512\tNXP LPC54618J512" }, - "MIMXRT1052": { - "OGChipSelectEditMenu": "MIMXRT1052xxx6B\tNXP MIMXRT1052xxx6B" - }, "STM32F072RB": { "OGChipSelectEditMenu": "STM32F072RB\tST STM32F072RB" }, From a4ed28163e8aae1a3791a87ab1a91399646fbac8 Mon Sep 17 00:00:00 2001 From: Michael Schwarcz Date: Sun, 13 Jan 2019 15:58:27 +0200 Subject: [PATCH 009/109] Force adding mbed-os root to include dirs --- tools/resources/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/resources/__init__.py b/tools/resources/__init__.py index d1b948999d..243b6c0c5d 100644 --- a/tools/resources/__init__.py +++ b/tools/resources/__init__.py @@ -38,7 +38,7 @@ from collections import namedtuple, defaultdict from copy import copy from itertools import chain from os import walk, sep -from os.path import (join, splitext, dirname, relpath, basename, split, normcase, +from os.path import (join, splitext, dirname, relpath, basename, split, normpath, abspath, exists) from .ignore import MbedIgnoreSet, IGNORE_FILENAME @@ -148,6 +148,11 @@ class Resources(object): self._ignoreset = MbedIgnoreSet() + # make sure mbed-os root is added as include directory + script_dir = dirname(abspath(__file__)) + mbed_os_root_dir = normpath(join(script_dir, '..', '..')) + self.add_file_ref(FileType.INC_DIR, mbed_os_root_dir, mbed_os_root_dir) + def ignore_dir(self, directory): if self._collect_ignores: self.ignored_dirs.append(directory) From 2636b7ea119e12268d5b1f4ae5ce010d55277760 Mon Sep 17 00:00:00 2001 From: Oren Cohen Date: Sun, 10 Feb 2019 16:53:47 +0200 Subject: [PATCH 010/109] Check source relative to ROOT on secure targets When building secure targets, we would like compile only files that are in the the mbe-os root folder. This Fixes an issue when sending multiple --source parameters that are all inside the mbed-os tree --- tools/build.py | 19 ++++++------------- tools/make.py | 6 ++++-- tools/paths.py | 10 +++++++++- tools/test.py | 6 ++++-- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/tools/build.py b/tools/build.py index 40b0a52771..c7962c5d2b 100644 --- a/tools/build.py +++ b/tools/build.py @@ -43,6 +43,7 @@ from tools.settings import CPPCHECK_CMD, CPPCHECK_MSG_FORMAT, CLI_COLOR_MAP from tools.notifier.term import TerminalNotifier from tools.utils import argparse_filestring_type, args_error, argparse_many from tools.utils import argparse_filestring_type, argparse_dir_not_parent +from tools.paths import is_relative_to_root if __name__ == '__main__': start = time() @@ -188,19 +189,11 @@ if __name__ == '__main__': mcu = TARGET_MAP[target] profile = extract_profile(parser, options, toolchain) - if mcu.is_PSA_secure_target: - lib_build_res = build_library( - ROOT, options.build_dir, mcu, toolchain, - jobs=options.jobs, - clean=options.clean, - archive=(not options.no_archive), - macros=options.macros, - name=options.artifact_name, - build_profile=profile, - ignore=options.ignore, - notify=notifier, - ) - elif options.source_dir: + if mcu.is_PSA_secure_target and \ + not is_relative_to_root(options.source_dir): + options.source_dir = ROOT + + if options.source_dir: lib_build_res = build_library( options.source_dir, options.build_dir, mcu, toolchain, jobs=options.jobs, diff --git a/tools/make.py b/tools/make.py index 606ed257f0..17802b5bb1 100644 --- a/tools/make.py +++ b/tools/make.py @@ -34,6 +34,7 @@ from tools.paths import MBED_LIBRARIES from tools.paths import RPC_LIBRARY from tools.paths import USB_LIBRARIES from tools.paths import DSP_LIBRARIES +from tools.paths import is_relative_to_root from tools.tests import TESTS, Test, TEST_MAP from tools.tests import TEST_MBED_LIB from tools.tests import test_known, test_name_known @@ -307,8 +308,9 @@ if __name__ == '__main__': args_error(parser, "argument -t/--tool is required") toolchain = options.tool[0] - if Target.get_target(mcu).is_PSA_secure_target: - options.source_dir = ROOT + if Target.get_target(mcu).is_PSA_secure_target and \ + not is_relative_to_root(options.source_dir): + options.source_dir = ROOT if (options.program is None) and (not options.source_dir): args_error(parser, "one of -p, -n, or --source is required") diff --git a/tools/paths.py b/tools/paths.py index c8e745b00b..d29eb15d96 100644 --- a/tools/paths.py +++ b/tools/paths.py @@ -14,7 +14,7 @@ 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. """ -from os.path import join +from os.path import join, commonprefix, realpath from os import getenv # Conventions about the directory structure @@ -85,3 +85,11 @@ CPPUTEST_TESTRUNNER_SCR = join(TEST_DIR, "utest", "testrunner") CPPUTEST_TESTRUNNER_INC = join(TEST_DIR, "utest", "testrunner") CPPUTEST_LIBRARY = join(BUILD_DIR, "cpputest") + + +def is_relative_to_root(dirs): + if not isinstance(dirs, list): + dirs = [dirs] + dirs = [realpath(d) for d in dirs] + out = commonprefix(dirs + [ROOT]) + return out == ROOT diff --git a/tools/test.py b/tools/test.py index 84bfd6bbbe..0c7ee08300 100644 --- a/tools/test.py +++ b/tools/test.py @@ -45,6 +45,8 @@ from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS, TOOLCHAIN_CLASSES from tools.settings import CLI_COLOR_MAP from tools.settings import ROOT from tools.targets import Target +from tools.paths import is_relative_to_root + if __name__ == '__main__': try: # Parse Options @@ -211,8 +213,8 @@ if __name__ == '__main__': if not options.build_dir: args_error(parser, "argument --build is required") - if mcu_secured: - base_source_paths = ROOT + if mcu_secured and not is_relative_to_root(options.source_dir): + options.source_dir = ROOT else: base_source_paths = options.source_dir From 1b8fe3e58e5961fc90e27b84b61105e91f138c96 Mon Sep 17 00:00:00 2001 From: Oren Cohen Date: Mon, 11 Feb 2019 10:38:41 +0200 Subject: [PATCH 011/109] Update test.py --- tools/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/test.py b/tools/test.py index 0c7ee08300..3e0996a2b1 100644 --- a/tools/test.py +++ b/tools/test.py @@ -214,7 +214,7 @@ if __name__ == '__main__': args_error(parser, "argument --build is required") if mcu_secured and not is_relative_to_root(options.source_dir): - options.source_dir = ROOT + base_source_paths = ROOT else: base_source_paths = options.source_dir From 36bf40cd79656c8bcb5df28ff9db6ede063ad042 Mon Sep 17 00:00:00 2001 From: Vincent Coubard Date: Mon, 14 Jan 2019 16:56:07 +0000 Subject: [PATCH 012/109] BLE - Nordic: Release crypto cell when not in use. Previously, the CryptoToolbox was allocated once as part of the security manager. This was inneficient memory wise as it is only use to prepare key at initialization and when we need to compute shared keys. This was also inneficient power consumption wise as the Crypto cell was kept enabled even when it wasn't used. This fix creates a CryptoToolbox whenever it is needed and release it once it has fulfilled its purpose. Note that CryptoToolbox allocation happens on the heap as mbed tls data structure are huge and there's an high risk of crushing the stack. --- .../source/nRF5xPalSecurityManager.cpp | 18 ++++++++++++------ .../source/nRF5xPalSecurityManager.h | 1 - 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.cpp b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.cpp index 01126720b4..78904d3312 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.cpp +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.cpp @@ -107,15 +107,17 @@ nRF5xSecurityManager::~nRF5xSecurityManager() ble_error_t nRF5xSecurityManager::initialize() { #if defined(MBEDTLS_ECDH_C) - if (_crypto.generate_keys( + // Note: we do not use the object on the stack as the CryptoToolbox is quite large + // Please do not change or we risk a stack overflow. + CryptoToolbox* crypto = new CryptoToolbox(); + bool success = crypto->generate_keys( make_ArrayView(X), make_ArrayView(Y), make_ArrayView(secret) - )) { - return BLE_ERROR_NONE; - } + ); + delete crypto; - return BLE_ERROR_INTERNAL_STACK_FAILURE; + return success ? BLE_ERROR_NONE : BLE_ERROR_INTERNAL_STACK_FAILURE; #endif return BLE_ERROR_NONE; } @@ -943,12 +945,16 @@ bool nRF5xSecurityManager::sm_handler(const ble_evt_t *evt) static const size_t key_size = public_key_coord_t::size_; ble_gap_lesc_dhkey_t shared_secret; - _crypto.generate_shared_secret( + // Allocated on the heap to reduce stack pressure. + // Risk stack overflows if allocated on stack. + CryptoToolbox* crypto = new CryptoToolbox(); + crypto->generate_shared_secret( make_const_ArrayView(dhkey_request.p_pk_peer->pk), make_const_ArrayView(dhkey_request.p_pk_peer->pk + key_size), make_const_ArrayView(secret), shared_secret.key ); + delete crypto; sd_ble_gap_lesc_dhkey_reply(connection, &shared_secret); diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.h index 30ac7e20cc..b5a55d9dc0 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.h +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xPalSecurityManager.h @@ -360,7 +360,6 @@ private: pairing_control_block_t* _control_blocks; #if defined(MBEDTLS_ECDH_C) - CryptoToolbox _crypto; ble::public_key_coord_t X; ble::public_key_coord_t Y; ble::public_key_coord_t secret; From 42d9fdd69d9a134628aaa465d0d26abd8b5fbc3f Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Fri, 1 Feb 2019 14:22:05 +0200 Subject: [PATCH 013/109] Greentea UDPSOCKET_RECV_TIMEOUT increase time tolerance --- TESTS/netsocket/udp/udpsocket_recv_timeout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTS/netsocket/udp/udpsocket_recv_timeout.cpp b/TESTS/netsocket/udp/udpsocket_recv_timeout.cpp index 3592d307ce..6db0e22b82 100644 --- a/TESTS/netsocket/udp/udpsocket_recv_timeout.cpp +++ b/TESTS/netsocket/udp/udpsocket_recv_timeout.cpp @@ -62,7 +62,7 @@ void UDPSOCKET_RECV_TIMEOUT() if (recvd == NSAPI_ERROR_WOULD_BLOCK) { osSignalWait(SIGNAL_SIGIO, SIGIO_TIMEOUT); printf("MBED: recvfrom() took: %dms\n", timer.read_ms()); - TEST_ASSERT_INT_WITHIN(50, 150, timer.read_ms()); + TEST_ASSERT_INT_WITHIN(51, 150, timer.read_ms()); continue; } else if (recvd < 0) { printf("[bt#%02d] network error %d\n", i, recvd); From b88d69d1198e0d145be16aba488ceca22f0dadb0 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Fri, 1 Feb 2019 14:23:22 +0200 Subject: [PATCH 014/109] Greentea Socket bind tests made ipv6-aware --- TESTS/netsocket/tcp/main.cpp | 9 +++++++++ TESTS/netsocket/tcp/tcp_tests.h | 1 + .../netsocket/tcp/tcpsocket_bind_address_invalid.cpp | 9 ++++++++- TESTS/netsocket/tcp/tcpsocket_bind_wrong_type.cpp | 9 ++++++++- TESTS/netsocket/udp/main.cpp | 9 +++++++++ TESTS/netsocket/udp/udp_tests.h | 1 + .../netsocket/udp/udpsocket_bind_address_invalid.cpp | 11 ++++++++++- TESTS/netsocket/udp/udpsocket_bind_wrong_type.cpp | 9 ++++++++- 8 files changed, 54 insertions(+), 4 deletions(-) diff --git a/TESTS/netsocket/tcp/main.cpp b/TESTS/netsocket/tcp/main.cpp index 36f453532a..b49e9a9689 100644 --- a/TESTS/netsocket/tcp/main.cpp +++ b/TESTS/netsocket/tcp/main.cpp @@ -57,6 +57,15 @@ void drop_bad_packets(TCPSocket &sock, int orig_timeout) sock.set_timeout(orig_timeout); } +nsapi_version_t get_ip_version() +{ + SocketAddress test; + if (!test.set_ip_address(NetworkInterface::get_default_instance()->get_ip_address())) { + return NSAPI_UNSPEC; + } + return test.get_ip_version(); +} + static void _ifup() { NetworkInterface *net = NetworkInterface::get_default_instance(); diff --git a/TESTS/netsocket/tcp/tcp_tests.h b/TESTS/netsocket/tcp/tcp_tests.h index 8314a30da5..e03f8414ef 100644 --- a/TESTS/netsocket/tcp/tcp_tests.h +++ b/TESTS/netsocket/tcp/tcp_tests.h @@ -20,6 +20,7 @@ NetworkInterface *get_interface(); void drop_bad_packets(TCPSocket &sock, int orig_timeout); +nsapi_version_t get_ip_version(); void fill_tx_buffer_ascii(char *buff, size_t len); nsapi_error_t tcpsocket_connect_to_echo_srv(TCPSocket &sock); nsapi_error_t tcpsocket_connect_to_discard_srv(TCPSocket &sock); diff --git a/TESTS/netsocket/tcp/tcpsocket_bind_address_invalid.cpp b/TESTS/netsocket/tcp/tcpsocket_bind_address_invalid.cpp index 4e0c568ce7..933926ede4 100644 --- a/TESTS/netsocket/tcp/tcpsocket_bind_address_invalid.cpp +++ b/TESTS/netsocket/tcp/tcpsocket_bind_address_invalid.cpp @@ -39,7 +39,14 @@ void TCPSOCKET_BIND_ADDRESS_INVALID() return; } TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->open(NetworkInterface::get_default_instance())); - nsapi_error_t bind_result = sock->bind("190.2.3.4", 1024); + nsapi_error_t bind_result = NSAPI_ERROR_OK; + if (get_ip_version() == NSAPI_IPv4) { + bind_result = sock->bind("190.2.3.4", 1024); + } else if (get_ip_version() == NSAPI_IPv6) { + bind_result = sock->bind("fe80::ff01", 1024); + } else { + TEST_FAIL_MESSAGE("This stack is neither IPv4 nor IPv6"); + } if (bind_result == NSAPI_ERROR_UNSUPPORTED) { TEST_IGNORE_MESSAGE("bind() not supported"); } else { diff --git a/TESTS/netsocket/tcp/tcpsocket_bind_wrong_type.cpp b/TESTS/netsocket/tcp/tcpsocket_bind_wrong_type.cpp index be223b0f2c..6a388b5ca6 100644 --- a/TESTS/netsocket/tcp/tcpsocket_bind_wrong_type.cpp +++ b/TESTS/netsocket/tcp/tcpsocket_bind_wrong_type.cpp @@ -40,7 +40,14 @@ void TCPSOCKET_BIND_WRONG_TYPE() } TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->open(NetworkInterface::get_default_instance())); char addr_bytes[16] = {0xfe, 0x80, 0xff, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - SocketAddress sockAddr = SocketAddress(addr_bytes, NSAPI_IPv4, 80); + SocketAddress sockAddr; + if (get_ip_version() == NSAPI_IPv4) { + sockAddr = SocketAddress(addr_bytes, NSAPI_IPv4, 80); + } else if (get_ip_version() == NSAPI_IPv6) { + sockAddr = SocketAddress(addr_bytes, NSAPI_IPv6, 80); + } else { + TEST_FAIL_MESSAGE("This stack is neither IPv4 nor IPv6"); + } nsapi_error_t bind_result = sock->bind(sockAddr); if (bind_result == NSAPI_ERROR_UNSUPPORTED) { TEST_IGNORE_MESSAGE("bind() not supported"); diff --git a/TESTS/netsocket/udp/main.cpp b/TESTS/netsocket/udp/main.cpp index 9f9b7e950a..f8b87e30b7 100644 --- a/TESTS/netsocket/udp/main.cpp +++ b/TESTS/netsocket/udp/main.cpp @@ -64,6 +64,15 @@ void drop_bad_packets(UDPSocket &sock, int orig_timeout) sock.set_timeout(orig_timeout); } +nsapi_version_t get_ip_version() +{ + SocketAddress test; + if (!test.set_ip_address(NetworkInterface::get_default_instance()->get_ip_address())) { + return NSAPI_UNSPEC; + } + return test.get_ip_version(); +} + void fill_tx_buffer_ascii(char *buff, size_t len) { for (size_t i = 0; i < len; ++i) { diff --git a/TESTS/netsocket/udp/udp_tests.h b/TESTS/netsocket/udp/udp_tests.h index b740ada298..34a06670a3 100644 --- a/TESTS/netsocket/udp/udp_tests.h +++ b/TESTS/netsocket/udp/udp_tests.h @@ -20,6 +20,7 @@ NetworkInterface *get_interface(); void drop_bad_packets(UDPSocket &sock, int orig_timeout); +nsapi_version_t get_ip_version(); void fill_tx_buffer_ascii(char *buff, size_t len); #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLE diff --git a/TESTS/netsocket/udp/udpsocket_bind_address_invalid.cpp b/TESTS/netsocket/udp/udpsocket_bind_address_invalid.cpp index e0cee8a360..44b0717685 100644 --- a/TESTS/netsocket/udp/udpsocket_bind_address_invalid.cpp +++ b/TESTS/netsocket/udp/udpsocket_bind_address_invalid.cpp @@ -38,7 +38,16 @@ void UDPSOCKET_BIND_ADDRESS_INVALID() TEST_FAIL(); } TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->open(NetworkInterface::get_default_instance())); - nsapi_error_t bind_result = sock->bind("190.2.3.4", 1024); + + nsapi_error_t bind_result = NSAPI_ERROR_OK; + if (get_ip_version() == NSAPI_IPv4) { + bind_result = sock->bind("190.2.3.4", 1024); + } else if (get_ip_version() == NSAPI_IPv6) { + bind_result = sock->bind("fe80::ff01", 1024); + } else { + TEST_FAIL_MESSAGE("This stack is neither IPv4 nor IPv6"); + } + if (bind_result == NSAPI_ERROR_UNSUPPORTED) { TEST_IGNORE_MESSAGE("bind() not supported"); } else { diff --git a/TESTS/netsocket/udp/udpsocket_bind_wrong_type.cpp b/TESTS/netsocket/udp/udpsocket_bind_wrong_type.cpp index 5925af6254..f6a6e7928b 100644 --- a/TESTS/netsocket/udp/udpsocket_bind_wrong_type.cpp +++ b/TESTS/netsocket/udp/udpsocket_bind_wrong_type.cpp @@ -39,7 +39,14 @@ void UDPSOCKET_BIND_WRONG_TYPE() } TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->open(NetworkInterface::get_default_instance())); char addr_bytes[16] = {0xfe, 0x80, 0xff, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - SocketAddress sockAddr = SocketAddress(addr_bytes, NSAPI_IPv4, 80); + SocketAddress sockAddr; + if (get_ip_version() == NSAPI_IPv4) { + sockAddr = SocketAddress(addr_bytes, NSAPI_IPv4, 80); + } else if (get_ip_version() == NSAPI_IPv6) { + sockAddr = SocketAddress(addr_bytes, NSAPI_IPv6, 80); + } else { + TEST_FAIL_MESSAGE("This stack is neither IPv4 nor IPv6"); + } nsapi_error_t bind_result = sock->bind(sockAddr); if (bind_result == NSAPI_ERROR_UNSUPPORTED) { TEST_IGNORE_MESSAGE("bind() not supported"); From 4a92a1361c904e27508913206dd62f30519e5ac5 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Fri, 1 Feb 2019 14:48:15 +0200 Subject: [PATCH 015/109] Greentea DNS test: added debug print --- TESTS/netsocket/dns/asynchronous_dns_cancel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/TESTS/netsocket/dns/asynchronous_dns_cancel.cpp b/TESTS/netsocket/dns/asynchronous_dns_cancel.cpp index 2c866cf6f7..e5594e16f4 100644 --- a/TESTS/netsocket/dns/asynchronous_dns_cancel.cpp +++ b/TESTS/netsocket/dns/asynchronous_dns_cancel.cpp @@ -42,6 +42,7 @@ void ASYNCHRONOUS_DNS_CANCEL() count++; } else { // No memory to initiate DNS query, callback will not be called + printf("Error: No memory to initiate DNS query for %s\n", dns_test_hosts[i]); data[i].result = NSAPI_ERROR_NO_MEMORY; data[i].value_set = true; } From 3f11bf5d915117dbea16578d8cc3c8f722e303da Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Fri, 1 Feb 2019 17:11:53 +0200 Subject: [PATCH 016/109] TLSSocket returns WOULD_BLOCK error instead of ALREADY In case mbedtls fails to execute handshake advertising MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, TLSSocketWrapper::continue_handshake returns NSAPI_ERROR_WOULD_BLOCK. --- features/netsocket/TLSSocketWrapper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/netsocket/TLSSocketWrapper.cpp b/features/netsocket/TLSSocketWrapper.cpp index eb75479a84..5e65758784 100644 --- a/features/netsocket/TLSSocketWrapper.cpp +++ b/features/netsocket/TLSSocketWrapper.cpp @@ -287,7 +287,7 @@ nsapi_error_t TLSSocketWrapper::send(const void *data, nsapi_size_t size) ret = continue_handshake(); if (ret != NSAPI_ERROR_IS_CONNECTED) { if (ret == NSAPI_ERROR_ALREADY) { - ret = NSAPI_ERROR_NO_CONNECTION; + ret = NSAPI_ERROR_WOULD_BLOCK; } return ret; } @@ -341,7 +341,7 @@ nsapi_size_or_error_t TLSSocketWrapper::recv(void *data, nsapi_size_t size) ret = continue_handshake(); if (ret != NSAPI_ERROR_IS_CONNECTED) { if (ret == NSAPI_ERROR_ALREADY) { - ret = NSAPI_ERROR_NO_CONNECTION; + ret = NSAPI_ERROR_WOULD_BLOCK; } return ret; } From 035ecc15d633763ab8d3d60ab0869dee210e2472 Mon Sep 17 00:00:00 2001 From: Alexander Zilberkant Date: Mon, 4 Feb 2019 21:52:39 +0200 Subject: [PATCH 017/109] Restore MBEDTLS_PSA_CRYPTO_C for PSA targets Removed by mistake in 763cb4c157f2c99babae932f88315ad67d2bc173 --- targets/targets.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/targets/targets.json b/targets/targets.json index a64966fd42..8d99432812 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -1743,7 +1743,7 @@ "PSA" ], "is_disk_virtual": true, - "macros": ["CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED"], + "macros": ["CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED", "MBEDTLS_PSA_CRYPTO_C"], "inherits": ["Target"], "detect_code": ["0311"], "device_has": [ @@ -2435,7 +2435,7 @@ "macro_name": "CLOCK_SOURCE_USB" } }, - "macros_add": ["USB_STM_HAL", "USBHOST_OTHER"], + "macros_add": ["USB_STM_HAL", "USBHOST_OTHER", "MBEDTLS_PSA_CRYPTO_C"], "device_has_add": [ "SERIAL_ASYNCH", "FLASH", @@ -2684,7 +2684,8 @@ "components_add": ["FLASHIAP"], "macros_add": [ "USB_STM_HAL", - "USBHOST_OTHER" + "USBHOST_OTHER", + "MBEDTLS_PSA_CRYPTO_C" ], "device_has_add": [ "ANALOGOUT", @@ -4231,6 +4232,9 @@ "device_has_remove": [], "extra_labels_add": ["PSA"], "components_add": ["FLASHIAP"], + "macros_add": [ + "MBEDTLS_PSA_CRYPTO_C" + ], "config": { "stdio_uart_tx_help": { "help": "Value: D8(default) or D1" From b2b7afeeb5e70f8278ae82e4d0d5471b2a83fd72 Mon Sep 17 00:00:00 2001 From: offirko Date: Sun, 10 Feb 2019 10:38:46 +0200 Subject: [PATCH 018/109] Fix general block device test to ensure unique block address per test --- .../storage/TESTS/blockdevice/general_block_device/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/storage/TESTS/blockdevice/general_block_device/main.cpp b/features/storage/TESTS/blockdevice/general_block_device/main.cpp index 5e47ad8b0e..fecfe1a0db 100644 --- a/features/storage/TESTS/blockdevice/general_block_device/main.cpp +++ b/features/storage/TESTS/blockdevice/general_block_device/main.cpp @@ -187,6 +187,11 @@ void basic_erase_program_read_test(BlockDevice *block_device, bd_size_t block_si { int err = 0; _mutex->lock(); + + // Make sure block address per each test is unique + static unsigned block_seed = 1; + srand(block_seed++); + // Find a random block bd_addr_t block = (rand() * block_size) % (block_device->size()); From 19b50ef7a83d8c538a1ecd4ec4853f1cf94d9e0e Mon Sep 17 00:00:00 2001 From: offirko Date: Sun, 10 Feb 2019 10:49:19 +0200 Subject: [PATCH 019/109] Ensure unique block address for multi threaded test. The addresses dont have to change each run, just be unique. Because address seeds repeat themselves each run, rand() will produce repeating results that should not collide between different threads. --- .../COMPONENT_SPIF/TESTS/block_device/spif/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/storage/blockdevice/COMPONENT_SPIF/TESTS/block_device/spif/main.cpp b/components/storage/blockdevice/COMPONENT_SPIF/TESTS/block_device/spif/main.cpp index c012c4a6e9..ad2b2636ed 100644 --- a/components/storage/blockdevice/COMPONENT_SPIF/TESTS/block_device/spif/main.cpp +++ b/components/storage/blockdevice/COMPONENT_SPIF/TESTS/block_device/spif/main.cpp @@ -47,6 +47,11 @@ void basic_erase_program_read_test(SPIFBlockDevice &block_device, bd_size_t bloc { int err = 0; _mutex->lock(); + + // Make sure block address per each test is unique + static unsigned block_seed = 1; + srand(block_seed++); + // Find a random block bd_addr_t block = (rand() * block_size) % block_device.size(); From 693245d802225468c85f9d5e8549799dc3d7d857 Mon Sep 17 00:00:00 2001 From: ccli8 Date: Mon, 11 Feb 2019 13:36:15 +0800 Subject: [PATCH 020/109] Fix crypto AC mgmt Port of NUC472/M487 crypto AC mgmt work to M2351: 1. Choose mutex to synchronize access to crypto non-SHA AC 2. Choose atomic flag to synchronize access to crypto SHA AC --- .../crypto/{crypto-misc.c => crypto-misc.cpp} | 103 +++++++++++------- .../TARGET_M2351/crypto/crypto-misc.h | 39 ++++--- 2 files changed, 84 insertions(+), 58 deletions(-) rename targets/TARGET_NUVOTON/TARGET_M2351/crypto/{crypto-misc.c => crypto-misc.cpp} (79%) diff --git a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.c b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp similarity index 79% rename from targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.c rename to targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp index 57c960924b..a2a8426a0a 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.c +++ b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp @@ -19,33 +19,56 @@ #include "mbed_assert.h" #include "mbed_critical.h" #include "mbed_error.h" +#if MBED_CONF_RTOS_PRESENT +#include "cmsis_os2.h" +#endif +#include #include #include "nu_modutil.h" #include "nu_bitutil.h" #include "crypto-misc.h" +#include "platform/SingletonPtr.h" +#include "platform/PlatformMutex.h" #if DEVICE_TRNG || defined(MBEDTLS_CONFIG_HW_SUPPORT) +/* Consideration for choosing proper synchronization mechanism + * + * 1. We choose mutex to synchronize access to crypto non-SHA AC. We can guarantee: + * (1) No deadlock + * We just lock mutex for a short sequence of operations rather than the whole lifetime + * of crypto context. + * (2) No priority inversion + * Mutex supports priority inheritance and it is enabled. + * 2. We choose atomic flag to synchronize access to crypto SHA AC. We can guarantee: + * (1) No deadlock + * With SHA AC not supporting context save & restore, we provide SHA S/W fallback when + * SHA AC is not available. + * (2) No biting CPU + * Same reason as above. + */ + +/* Mutex for crypto AES AC management */ +static SingletonPtr crypto_aes_mutex; + +/* Mutex for crypto DES AC management */ +static SingletonPtr crypto_des_mutex; + +/* Mutex for crypto ECC AC management */ +static SingletonPtr crypto_ecc_mutex; + +/* Atomic flag for crypto SHA AC management */ +static core_util_atomic_flag crypto_sha_atomic_flag = CORE_UTIL_ATOMIC_FLAG_INIT; + /* NOTE: There's inconsistency in cryptography related naming, Crpt or Crypto. For example, cryptography IRQ * handler could be CRPT_IRQHandler or CRYPTO_IRQHandler. To override default cryptography IRQ handler, see * device/startup_{CHIP}.c for its name or call NVIC_SetVector regardless of its name. */ void CRPT_IRQHandler(); -/* Track if AES H/W is available */ -static uint16_t crypto_aes_avail = 1; -/* Track if DES H/W is available */ -static uint16_t crypto_des_avail = 1; -/* Track if SHA H/W is available */ -static uint16_t crypto_sha_avail = 1; -/* Track if ECC H/W is available */ -static uint16_t crypto_ecc_avail = 1; /* Crypto (AES, DES, SHA, etc.) init counter. Crypto's keeps active as it is non-zero. */ static uint16_t crypto_init_counter = 0U; -static bool crypto_submodule_acquire(uint16_t *submodule_avail); -static void crypto_submodule_release(uint16_t *submodule_avail); - /* Crypto done flags */ #define CRYPTO_DONE_OK BIT0 /* Done with OK */ #define CRYPTO_DONE_ERR BIT1 /* Done with error */ @@ -131,44 +154,52 @@ void crypto_zeroize32(uint32_t *v, size_t n) } } -bool crypto_aes_acquire(void) +void crypto_aes_acquire(void) { - return crypto_submodule_acquire(&crypto_aes_avail); + /* Don't check return code of Mutex::lock(void) + * + * This function treats RTOS errors as fatal system errors, so it can only return osOK. + * Use of the return value is deprecated, as the return is expected to become void in + * the future. + */ + crypto_aes_mutex->lock(); } void crypto_aes_release(void) { - crypto_submodule_release(&crypto_aes_avail); + crypto_aes_mutex->unlock(); } -bool crypto_des_acquire(void) +void crypto_des_acquire(void) { - return crypto_submodule_acquire(&crypto_des_avail); + /* Don't check return code of Mutex::lock(void) */ + crypto_des_mutex->lock(); } void crypto_des_release(void) { - crypto_submodule_release(&crypto_des_avail); + crypto_des_mutex->unlock(); } -bool crypto_sha_acquire(void) +void crypto_ecc_acquire(void) { - return crypto_submodule_acquire(&crypto_sha_avail); -} - -void crypto_sha_release(void) -{ - crypto_submodule_release(&crypto_sha_avail); -} - -bool crypto_ecc_acquire(void) -{ - return crypto_submodule_acquire(&crypto_ecc_avail); + /* Don't check return code of Mutex::lock(void) */ + crypto_ecc_mutex->lock(); } void crypto_ecc_release(void) { - crypto_submodule_release(&crypto_ecc_avail); + crypto_ecc_mutex->unlock(); +} + +bool crypto_sha_try_acquire(void) +{ + return !core_util_atomic_flag_test_and_set(&crypto_sha_atomic_flag); +} + +void crypto_sha_release(void) +{ + core_util_atomic_flag_clear(&crypto_sha_atomic_flag); } void crypto_prng_prestart(void) @@ -252,18 +283,6 @@ bool crypto_dma_buffs_overlap(const void *in_buff, size_t in_buff_size, const vo return overlap; } -static bool crypto_submodule_acquire(uint16_t *submodule_avail) -{ - uint16_t expectedCurrentValue = 1; - return core_util_atomic_cas_u16(submodule_avail, &expectedCurrentValue, 0); -} - -static void crypto_submodule_release(uint16_t *submodule_avail) -{ - uint16_t expectedCurrentValue = 0; - while (! core_util_atomic_cas_u16(submodule_avail, &expectedCurrentValue, 1)); -} - static void crypto_submodule_prestart(volatile uint16_t *submodule_done) { *submodule_done = 0; diff --git a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.h b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.h index c675cd76e3..a29e790c17 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.h +++ b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.h @@ -66,26 +66,33 @@ void crypto_uninit(void); void crypto_zeroize(void *v, size_t n); void crypto_zeroize32(uint32_t *v, size_t n); -/* Acquire/release ownership of AES H/W */ -/* NOTE: If "acquire" succeeds, "release" must be done to pair it. */ -bool crypto_aes_acquire(void); +/* Acquire/release ownership of crypto sub-module + * + * \note "acquire" is blocking until ownership is acquired + * + * \note "acquire"/"release" must be paired. + * + * \note Recursive "acquire" is allowed because the underlying synchronization + * primitive mutex supports it. + */ +void crypto_aes_acquire(void); void crypto_aes_release(void); - -/* Acquire/release ownership of DES H/W */ -/* NOTE: If "acquire" succeeds, "release" must be done to pair it. */ -bool crypto_des_acquire(void); +void crypto_des_acquire(void); void crypto_des_release(void); - -/* Acquire/release ownership of SHA H/W */ -/* NOTE: If "acquire" succeeds, "release" must be done to pair it. */ -bool crypto_sha_acquire(void); -void crypto_sha_release(void); - -/* Acquire/release ownership of ECC H/W */ -/* NOTE: If "acquire" succeeds, "release" must be done to pair it. */ -bool crypto_ecc_acquire(void); +void crypto_ecc_acquire(void); void crypto_ecc_release(void); +/* Acquire/release ownership of crypto sub-module + * + * \return false if crytpo sub-module is held by another thread or + * another mbedtls context. + * true if successful + * + * \note Successful "try_acquire" and "release" must be paired. + */ +bool crypto_sha_try_acquire(void); +void crypto_sha_release(void); + /* Flow control between crypto/xxx start and crypto/xxx ISR * * crypto_xxx_prestart/crypto_xxx_wait encapsulate control flow between crypto/xxx start and crypto/xxx ISR. From e5e9e4f3891e5c7df09eb8ddc84dfd76a9d1fdd7 Mon Sep 17 00:00:00 2001 From: ccli8 Date: Mon, 11 Feb 2019 14:21:41 +0800 Subject: [PATCH 021/109] Hook crypto interrupt handler without NVIC_SetVector --- .../TARGET_M2351/crypto/crypto-misc.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp index a2a8426a0a..9a6df270ab 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp +++ b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp @@ -60,11 +60,6 @@ static SingletonPtr crypto_ecc_mutex; /* Atomic flag for crypto SHA AC management */ static core_util_atomic_flag crypto_sha_atomic_flag = CORE_UTIL_ATOMIC_FLAG_INIT; -/* NOTE: There's inconsistency in cryptography related naming, Crpt or Crypto. For example, cryptography IRQ - * handler could be CRPT_IRQHandler or CRYPTO_IRQHandler. To override default cryptography IRQ handler, see - * device/startup_{CHIP}.c for its name or call NVIC_SetVector regardless of its name. */ -void CRPT_IRQHandler(); - /* Crypto (AES, DES, SHA, etc.) init counter. Crypto's keeps active as it is non-zero. */ static uint16_t crypto_init_counter = 0U; @@ -104,8 +99,7 @@ void crypto_init(void) * NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure. */ CLK_EnableModuleClock_S(CRPT_MODULE); - - NVIC_SetVector(CRPT_IRQn, (uint32_t) CRPT_IRQHandler); + NVIC_EnableIRQ(CRPT_IRQn); } core_util_critical_section_exit(); @@ -315,8 +309,13 @@ static bool crypto_submodule_wait(volatile uint16_t *submodule_done) return false; } -/* Crypto interrupt handler */ -void CRPT_IRQHandler() +/* Crypto interrupt handler + * + * There's inconsistency in cryptography related naming, Crpt or Crypto. For example, + * cryptography IRQ handler could be CRPT_IRQHandler or CRYPTO_IRQHandler. To override + * default cryptography IRQ handler, see device/startup_{CHIP}.c for its correct name + * or call NVIC_SetVector() in crypto_init() regardless of its name. */ +extern "C" void CRPT_IRQHandler() { uint32_t intsts; From 39262235b107b2ed1a92e7918a7d41359999d7fd Mon Sep 17 00:00:00 2001 From: ccli8 Date: Mon, 11 Feb 2019 18:10:51 +0800 Subject: [PATCH 022/109] Remove unnecessary header files in crypto-misc.cpp --- targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp | 4 ---- targets/TARGET_NUVOTON/TARGET_M480/crypto/crypto-misc.cpp | 4 ---- targets/TARGET_NUVOTON/TARGET_NUC472/crypto/crypto-misc.cpp | 4 ---- 3 files changed, 12 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp index 9a6df270ab..eed2603836 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp +++ b/targets/TARGET_NUVOTON/TARGET_M2351/crypto/crypto-misc.cpp @@ -19,10 +19,6 @@ #include "mbed_assert.h" #include "mbed_critical.h" #include "mbed_error.h" -#if MBED_CONF_RTOS_PRESENT -#include "cmsis_os2.h" -#endif -#include #include #include "nu_modutil.h" #include "nu_bitutil.h" diff --git a/targets/TARGET_NUVOTON/TARGET_M480/crypto/crypto-misc.cpp b/targets/TARGET_NUVOTON/TARGET_M480/crypto/crypto-misc.cpp index 13000985af..18f517a844 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/crypto/crypto-misc.cpp +++ b/targets/TARGET_NUVOTON/TARGET_M480/crypto/crypto-misc.cpp @@ -19,10 +19,6 @@ #include "mbed_assert.h" #include "mbed_critical.h" #include "mbed_error.h" -#if MBED_CONF_RTOS_PRESENT -#include "cmsis_os2.h" -#endif -#include #include #include "nu_modutil.h" #include "nu_bitutil.h" diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/crypto/crypto-misc.cpp b/targets/TARGET_NUVOTON/TARGET_NUC472/crypto/crypto-misc.cpp index f771a3e510..e4fd9143c3 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/crypto/crypto-misc.cpp +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/crypto/crypto-misc.cpp @@ -19,10 +19,6 @@ #include "mbed_assert.h" #include "mbed_critical.h" #include "mbed_error.h" -#if MBED_CONF_RTOS_PRESENT -#include "cmsis_os2.h" -#endif -#include #include #include "nu_modutil.h" #include "nu_bitutil.h" From 306943a5823da2f146c12ed8c43c2b288b83445d Mon Sep 17 00:00:00 2001 From: Mirela Chirica Date: Tue, 29 Jan 2019 15:10:45 +0200 Subject: [PATCH 023/109] Cellular: Fix socket bind tests for BG96 --- .../framework/AT/AT_CellularStack.cpp | 27 +++++++++++++++---- .../cellular/framework/AT/AT_CellularStack.h | 2 ++ .../BG96/QUECTEL_BG96_CellularStack.cpp | 12 +++++++++ .../QUECTEL/BG96/QUECTEL_BG96_CellularStack.h | 1 + 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/features/cellular/framework/AT/AT_CellularStack.cpp b/features/cellular/framework/AT/AT_CellularStack.cpp index a43e2ebd89..ad4932c072 100644 --- a/features/cellular/framework/AT/AT_CellularStack.cpp +++ b/features/cellular/framework/AT/AT_CellularStack.cpp @@ -198,15 +198,21 @@ nsapi_error_t AT_CellularStack::socket_bind(nsapi_socket_t handle, const SocketA } if (addr) { - socket->localAddress.set_addr(addr.get_addr()); - } - - if (addr.get_port()) { - socket->localAddress.set_port(addr.get_port()); + return NSAPI_ERROR_UNSUPPORTED; } _at.lock(); + uint16_t port = addr.get_port(); + if (port != socket->localAddress.get_port()) { + if (port && (get_socket_index_by_port(port) == -1)) { + socket->localAddress.set_port(port); + } else { + _at.unlock(); + return NSAPI_ERROR_PARAMETER; + } + } + if (!socket->created) { create_socket_impl(socket); } @@ -340,3 +346,14 @@ void AT_CellularStack::socket_attach(nsapi_socket_t handle, void (*callback)(voi socket->_cb = callback; socket->_data = data; } + +int AT_CellularStack::get_socket_index_by_port(uint16_t port) +{ + int max_socket_count = get_max_socket_count(); + for (int i = 0; i < max_socket_count; i++) { + if (_socket[i]->localAddress.get_port() == port) { + return i; + } + } + return -1; +} diff --git a/features/cellular/framework/AT/AT_CellularStack.h b/features/cellular/framework/AT/AT_CellularStack.h index 2c25da1579..8ce5764665 100644 --- a/features/cellular/framework/AT/AT_CellularStack.h +++ b/features/cellular/framework/AT/AT_CellularStack.h @@ -184,6 +184,8 @@ protected: private: int find_socket_index(nsapi_socket_t handle); + int get_socket_index_by_port(uint16_t port); + // mutex for write/read to a _socket array, needed when multiple threads may open sockets simultaneously PlatformMutex _socket_mutex; }; diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp index 8d79fa6c74..4a71a87e0d 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp @@ -62,6 +62,10 @@ nsapi_error_t QUECTEL_BG96_CellularStack::socket_connect(nsapi_socket_t handle, handle_open_socket_response(modem_connect_id, err); if ((_at.get_last_error() == NSAPI_ERROR_OK) && err) { + if (err == BG96_SOCKET_BIND_FAIL) { + socket->created = false; + return NSAPI_ERROR_PARAMETER; + } _at.cmd_start("AT+QICLOSE="); _at.write_int(modem_connect_id); _at.cmd_stop(); @@ -178,6 +182,10 @@ nsapi_error_t QUECTEL_BG96_CellularStack::create_socket_impl(CellularSocket *soc handle_open_socket_response(modem_connect_id, err); if ((_at.get_last_error() == NSAPI_ERROR_OK) && err) { + if (err == BG96_SOCKET_BIND_FAIL) { + socket->created = false; + return NSAPI_ERROR_PARAMETER; + } _at.cmd_start("AT+QICLOSE="); _at.write_int(modem_connect_id); _at.cmd_stop_read_resp(); @@ -206,6 +214,10 @@ nsapi_error_t QUECTEL_BG96_CellularStack::create_socket_impl(CellularSocket *soc handle_open_socket_response(modem_connect_id, err); if ((_at.get_last_error() == NSAPI_ERROR_OK) && err) { + if (err == BG96_SOCKET_BIND_FAIL) { + socket->created = false; + return NSAPI_ERROR_PARAMETER; + } _at.cmd_start("AT+QICLOSE="); _at.write_int(modem_connect_id); _at.cmd_stop_read_resp(); diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h index 1b8e547530..f5de062ac4 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h @@ -25,6 +25,7 @@ namespace mbed { #define BG96_SOCKET_MAX 12 #define BG96_CREATE_SOCKET_TIMEOUT 150000 //150 seconds #define BG96_CLOSE_SOCKET_TIMEOUT 20000 // TCP socket max timeout is >10sec +#define BG96_SOCKET_BIND_FAIL 556 class QUECTEL_BG96_CellularStack : public AT_CellularStack { public: From 0ed5e805df5eae861b87eb7b06338a736cee6db2 Mon Sep 17 00:00:00 2001 From: Mirela Chirica Date: Tue, 29 Jan 2019 15:13:04 +0200 Subject: [PATCH 024/109] Cellular: Fix socket's send and receive boundaries for BG96 --- .../QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp | 14 +++++++++++++- .../QUECTEL/BG96/QUECTEL_BG96_CellularStack.h | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp index 4a71a87e0d..091a53fac7 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp @@ -251,6 +251,9 @@ nsapi_error_t QUECTEL_BG96_CellularStack::create_socket_impl(CellularSocket *soc nsapi_size_or_error_t QUECTEL_BG96_CellularStack::socket_sendto_impl(CellularSocket *socket, const SocketAddress &address, const void *data, nsapi_size_t size) { + if (size > BG96_MAX_SEND_SIZE) { + return NSAPI_ERROR_PARAMETER; + } int sent_len = 0; int sent_len_before = 0; int sent_len_after = 0; @@ -308,6 +311,11 @@ nsapi_size_or_error_t QUECTEL_BG96_CellularStack::socket_recvfrom_impl(CellularS _at.cmd_start("AT+QIRD="); _at.write_int(socket->id); + if (socket->proto == NSAPI_TCP) { + // do not read more than max size + size = size > BG96_MAX_RECV_SIZE ? BG96_MAX_RECV_SIZE : size; + _at.write_int(size); + } _at.cmd_stop(); _at.resp_start("+QIRD:"); @@ -315,11 +323,15 @@ nsapi_size_or_error_t QUECTEL_BG96_CellularStack::socket_recvfrom_impl(CellularS _at.read_string(ip_address, sizeof(ip_address)); port = _at.read_int(); if (recv_len > 0) { + // do not read more than buffer size + recv_len = recv_len > size ? size : recv_len; _at.read_bytes((uint8_t *)buffer, recv_len); } _at.resp_stop(); - if (!recv_len || (_at.get_last_error() != NSAPI_ERROR_OK)) { + // We block only if 0 recv length really means no data. + // If 0 is followed by ip address and port can be an UDP 0 length packet + if (!recv_len && port < 0) { return NSAPI_ERROR_WOULD_BLOCK; } diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h index f5de062ac4..e8eb670c1c 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h @@ -25,6 +25,8 @@ namespace mbed { #define BG96_SOCKET_MAX 12 #define BG96_CREATE_SOCKET_TIMEOUT 150000 //150 seconds #define BG96_CLOSE_SOCKET_TIMEOUT 20000 // TCP socket max timeout is >10sec +#define BG96_MAX_RECV_SIZE 1500 +#define BG96_MAX_SEND_SIZE 1460 #define BG96_SOCKET_BIND_FAIL 556 class QUECTEL_BG96_CellularStack : public AT_CellularStack { From b8712b32813cf98a812a32b6d855d38f3a9171fe Mon Sep 17 00:00:00 2001 From: Mirela Chirica Date: Fri, 8 Feb 2019 15:43:01 +0200 Subject: [PATCH 025/109] Cellular: Fix UDPSOCKET_SENDTO_INVALID test for BG96 --- .../targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp index 091a53fac7..59ec9487f4 100644 --- a/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp +++ b/features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp @@ -254,6 +254,11 @@ nsapi_size_or_error_t QUECTEL_BG96_CellularStack::socket_sendto_impl(CellularSoc if (size > BG96_MAX_SEND_SIZE) { return NSAPI_ERROR_PARAMETER; } + + if (!size && socket->proto == NSAPI_UDP) { + return NSAPI_ERROR_UNSUPPORTED; + } + int sent_len = 0; int sent_len_before = 0; int sent_len_after = 0; From 182f229a58a673b30e30459afa1e5881befa5a34 Mon Sep 17 00:00:00 2001 From: Aleksi Klasila Date: Mon, 11 Feb 2019 10:55:33 +0200 Subject: [PATCH 026/109] REALTEK_RTL8195AM daplink timestamp from os.environ --- tools/targets/REALTEK_RTL8195AM.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/targets/REALTEK_RTL8195AM.py b/tools/targets/REALTEK_RTL8195AM.py index 3dc1577e4e..a4eb02510f 100644 --- a/tools/targets/REALTEK_RTL8195AM.py +++ b/tools/targets/REALTEK_RTL8195AM.py @@ -147,7 +147,7 @@ def create_daplink(image_bin, ram1_bin, ram2_bin): RAM2_HEADER['tag'] = format_number(TAG, 8) RAM2_HEADER['ver'] = format_number(VER, 8) - RAM2_HEADER['timestamp'] = format_number(epoch_timestamp(), 16) + RAM2_HEADER['timestamp'] = format_number(int(os.environ.get('DAPLINK_TIMESTAMP', epoch_timestamp())), 16) RAM2_HEADER['size'] = format_number(os.stat(ram2_bin).st_size + 72, 8) RAM2_HEADER['hash'] = format_string(sha256_checksum(ram2_bin)) RAM2_HEADER['campaign'] = format_string(CAMPAIGN) From 3930d2e9973c0e0f24fd015da6f3a20b1ed97a8b Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Fri, 1 Feb 2019 14:11:55 -0600 Subject: [PATCH 027/109] targets: QUECTEL: Fix build warning Fix the following warning seen when built with GCC_ARM with mbed-cli v1.8.3 $ mbed compile -c -t GCC_ARM -m K64F [Warning] QUECTEL_M26_CellularStack.cpp@364,9: variable 'sent_acked' set but not used [-Wunused-but-set-variable] --- .../framework/targets/QUECTEL/M26/QUECTEL_M26_CellularStack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/cellular/framework/targets/QUECTEL/M26/QUECTEL_M26_CellularStack.cpp b/features/cellular/framework/targets/QUECTEL/M26/QUECTEL_M26_CellularStack.cpp index 20515438a2..0840edee8d 100644 --- a/features/cellular/framework/targets/QUECTEL/M26/QUECTEL_M26_CellularStack.cpp +++ b/features/cellular/framework/targets/QUECTEL/M26/QUECTEL_M26_CellularStack.cpp @@ -361,10 +361,10 @@ nsapi_size_or_error_t QUECTEL_M26_CellularStack::socket_sendto_impl(CellularSock const void *data, nsapi_size_t size) { int sent_len = (size > M26_SENT_BYTE_MAX) ? M26_SENT_BYTE_MAX : size; - int sent_acked = 0; int sent_nacked = 0; int sent_len_before = 0; int sent_len_after = 0; + int sent_acked; nsapi_error_t error; tr_debug("QUECTEL_M26_CellularStack:%s:%u:[%d-%d]", __FUNCTION__, __LINE__, sent_len, size); From e8ce42ad83d727346fbdf51c061273fe081dbdf3 Mon Sep 17 00:00:00 2001 From: jeromecoutant Date: Mon, 4 Feb 2019 15:32:15 +0100 Subject: [PATCH 028/109] STM32 GPIO: use maximum speed --- targets/TARGET_STM/pinmap.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_STM/pinmap.c b/targets/TARGET_STM/pinmap.c index 5c92ad19bd..5076ef45ba 100644 --- a/targets/TARGET_STM/pinmap.c +++ b/targets/TARGET_STM/pinmap.c @@ -79,7 +79,13 @@ void pin_function(PinName pin, int data) #if defined (TARGET_STM32F1) if (mode == STM_PIN_OUTPUT) { #endif + +#if defined (LL_GPIO_SPEED_FREQ_VERY_HIGH) + LL_GPIO_SetPinSpeed(gpio, ll_pin, LL_GPIO_SPEED_FREQ_VERY_HIGH); +#else LL_GPIO_SetPinSpeed(gpio, ll_pin, LL_GPIO_SPEED_FREQ_HIGH); +#endif + #if defined (TARGET_STM32F1) } #endif From 46478abc6aba73664e9ba52197dc09d044dfea2b Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Thu, 31 Jan 2019 12:59:40 +0200 Subject: [PATCH 029/109] tests-netsocket-udp: UDPSOCKET_ECHOTEST_NONBLOCK restores non-blocking Fixes a bug where after dropping bad packets receiver doesn't restore the socket back to non-blocking state as it's supposed to. --- TESTS/netsocket/udp/udpsocket_echotest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTS/netsocket/udp/udpsocket_echotest.cpp b/TESTS/netsocket/udp/udpsocket_echotest.cpp index ffd3dc75e7..eb9c0c15e3 100644 --- a/TESTS/netsocket/udp/udpsocket_echotest.cpp +++ b/TESTS/netsocket/udp/udpsocket_echotest.cpp @@ -118,7 +118,7 @@ void udpsocket_echotest_nonblock_receiver(void *receive_bytes) } } - drop_bad_packets(sock, -1); // timeout equivalent to set_blocking(false) + drop_bad_packets(sock, 0); // timeout equivalent to set_blocking(false) tx_sem.release(); } From 1b5fdafce88182a5ce90257c57a3a3112d0968a7 Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Thu, 31 Jan 2019 14:22:47 +0200 Subject: [PATCH 030/109] tests-netsocket-udp: UDPSOCKET_ECHOTEST_NONBLOCK execution time limit Test case is allowed to take not more than a half what has been given to the whole UDP suite. UDP test cases reorganized so that the longest running ones are executed last. --- TESTS/netsocket/udp/main.cpp | 44 +++++++++++++--------- TESTS/netsocket/udp/udp_tests.h | 9 +++++ TESTS/netsocket/udp/udpsocket_echotest.cpp | 11 +++++- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/TESTS/netsocket/udp/main.cpp b/TESTS/netsocket/udp/main.cpp index f8b87e30b7..0057aed55f 100644 --- a/TESTS/netsocket/udp/main.cpp +++ b/TESTS/netsocket/udp/main.cpp @@ -33,10 +33,26 @@ using namespace utest::v1; +namespace { +Timer tc_bucket; // Timer to limit a test cases run time +} + #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLE mbed_stats_socket_t udp_stats[MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT]; #endif +void drop_bad_packets(UDPSocket &sock, int orig_timeout) +{ + nsapi_error_t err; + sock.set_timeout(0); + while (true) { + err = sock.recv(NULL, 0); + if (err == NSAPI_ERROR_WOULD_BLOCK) { + break; + } + } + sock.set_timeout(orig_timeout); +} static void _ifup() { NetworkInterface *net = NetworkInterface::get_default_instance(); @@ -51,18 +67,6 @@ static void _ifdown() printf("MBED: ifdown\n"); } -void drop_bad_packets(UDPSocket &sock, int orig_timeout) -{ - nsapi_error_t err; - sock.set_timeout(0); - while (true) { - err = sock.recvfrom(NULL, 0, 0); - if (err == NSAPI_ERROR_WOULD_BLOCK) { - break; - } - } - sock.set_timeout(orig_timeout); -} nsapi_version_t get_ip_version() { @@ -80,6 +84,11 @@ void fill_tx_buffer_ascii(char *buff, size_t len) } } +int split2half_rmng_udp_test_time() +{ + return (udp_global::TESTS_TIMEOUT - tc_bucket.read()) / 2; +} + #if MBED_CONF_NSAPI_SOCKET_STATS_ENABLE int fetch_stats() { @@ -90,20 +99,20 @@ int fetch_stats() // Test setup utest::v1::status_t greentea_setup(const size_t number_of_cases) { - GREENTEA_SETUP(480, "default_auto"); + GREENTEA_SETUP(udp_global::TESTS_TIMEOUT, "default_auto"); _ifup(); + tc_bucket.start(); return greentea_test_setup_handler(number_of_cases); } void greentea_teardown(const size_t passed, const size_t failed, const failure_t failure) { + tc_bucket.stop(); _ifdown(); return greentea_test_teardown_handler(passed, failed, failure); } Case cases[] = { - Case("UDPSOCKET_ECHOTEST", UDPSOCKET_ECHOTEST), - Case("UDPSOCKET_ECHOTEST_NONBLOCK", UDPSOCKET_ECHOTEST_NONBLOCK), Case("UDPSOCKET_OPEN_CLOSE_REPEAT", UDPSOCKET_OPEN_CLOSE_REPEAT), Case("UDPSOCKET_OPEN_LIMIT", UDPSOCKET_OPEN_LIMIT), Case("UDPSOCKET_RECV_TIMEOUT", UDPSOCKET_RECV_TIMEOUT), @@ -119,10 +128,11 @@ Case cases[] = { Case("UDPSOCKET_BIND_WRONG_TYPE", UDPSOCKET_BIND_WRONG_TYPE), Case("UDPSOCKET_BIND_UNOPENED", UDPSOCKET_BIND_UNOPENED), Case("UDPSOCKET_SENDTO_INVALID", UDPSOCKET_SENDTO_INVALID), - Case("UDPSOCKET_ECHOTEST", UDPSOCKET_ECHOTEST), - Case("UDPSOCKET_ECHOTEST_BURST", UDPSOCKET_ECHOTEST_BURST), + Case("UDPSOCKET_ECHOTEST_NONBLOCK", UDPSOCKET_ECHOTEST_NONBLOCK), Case("UDPSOCKET_ECHOTEST_BURST_NONBLOCK", UDPSOCKET_ECHOTEST_BURST_NONBLOCK), Case("UDPSOCKET_SENDTO_REPEAT", UDPSOCKET_SENDTO_REPEAT), + Case("UDPSOCKET_ECHOTEST", UDPSOCKET_ECHOTEST), + Case("UDPSOCKET_ECHOTEST_BURST", UDPSOCKET_ECHOTEST_BURST), }; Specification specification(greentea_setup, cases, greentea_teardown, greentea_continue_handlers); diff --git a/TESTS/netsocket/udp/udp_tests.h b/TESTS/netsocket/udp/udp_tests.h index 34a06670a3..a6222a786d 100644 --- a/TESTS/netsocket/udp/udp_tests.h +++ b/TESTS/netsocket/udp/udp_tests.h @@ -28,6 +28,15 @@ extern mbed_stats_socket_t udp_stats[MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT]; int fetch_stats(void); #endif +/** + * Single testcase might take only half of the remaining execution time + */ +int split2half_rmng_udp_test_time(); // [s] + +namespace udp_global { +static const int TESTS_TIMEOUT = 480; +} + /* * Test cases */ diff --git a/TESTS/netsocket/udp/udpsocket_echotest.cpp b/TESTS/netsocket/udp/udpsocket_echotest.cpp index eb9c0c15e3..1457096fce 100644 --- a/TESTS/netsocket/udp/udpsocket_echotest.cpp +++ b/TESTS/netsocket/udp/udpsocket_echotest.cpp @@ -45,6 +45,8 @@ static const int pkt_sizes[PKTS] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, \ 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, \ 1100, 1200 }; +Timer tc_exec_time; +int time_allotted; } static void _sigio_handler(osThreadId id) @@ -106,6 +108,9 @@ void udpsocket_echotest_nonblock_receiver(void *receive_bytes) for (int retry_cnt = 0; retry_cnt <= RETRIES; retry_cnt++) { recvd = sock.recvfrom(NULL, rx_buffer, expt2recv); if (recvd == NSAPI_ERROR_WOULD_BLOCK) { + if (tc_exec_time.read() >= time_allotted) { + break; + } wait_ms(WAIT2RECV_TIMEOUT); --retry_cnt; continue; @@ -132,6 +137,8 @@ void UDPSOCKET_ECHOTEST_NONBLOCK() TEST_ASSERT_EQUAL(SOCK_CLOSED, udp_stats[j].state); } #endif + tc_exec_time.start(); + time_allotted = split2half_rmng_udp_test_time(); // [s] SocketAddress udp_addr; NetworkInterface::get_default_instance()->gethostbyname(MBED_CONF_APP_ECHO_SERVER_ADDR, &udp_addr); @@ -166,7 +173,8 @@ void UDPSOCKET_ECHOTEST_NONBLOCK() packets_sent++; } if (sent == NSAPI_ERROR_WOULD_BLOCK) { - if (osSignalWait(SIGNAL_SIGIO, SIGIO_TIMEOUT).status == osEventTimeout) { + if (tc_exec_time.read() >= time_allotted || + osSignalWait(SIGNAL_SIGIO, SIGIO_TIMEOUT).status == osEventTimeout) { continue; } --retry_cnt; @@ -209,4 +217,5 @@ void UDPSOCKET_ECHOTEST_NONBLOCK() #endif } TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.close()); + tc_exec_time.stop(); } From b705934b6225c1c7901e42aa12281ef3135f820a Mon Sep 17 00:00:00 2001 From: Oren Cohen Date: Tue, 12 Feb 2019 11:22:15 +0200 Subject: [PATCH 031/109] Add MBEDTLS_ENTROPY_NV_SEED to NUCLEO_F411RE to fix the build --- targets/targets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/targets.json b/targets/targets.json index 8d99432812..3e7450ffd5 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -2435,7 +2435,7 @@ "macro_name": "CLOCK_SOURCE_USB" } }, - "macros_add": ["USB_STM_HAL", "USBHOST_OTHER", "MBEDTLS_PSA_CRYPTO_C"], + "macros_add": ["USB_STM_HAL", "USBHOST_OTHER", "MBEDTLS_PSA_CRYPTO_C", "MBEDTLS_ENTROPY_NV_SEED"], "device_has_add": [ "SERIAL_ASYNCH", "FLASH", From 3204ce5f9f98f03091b25fe42b2a954f889357c0 Mon Sep 17 00:00:00 2001 From: Cruz Monrreal II Date: Mon, 11 Feb 2019 20:02:57 -0600 Subject: [PATCH 032/109] Prefixed string to properly be parsed as bytes --- tools/targets/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/targets/__init__.py b/tools/targets/__init__.py index b083f74dd7..567c6380cc 100644 --- a/tools/targets/__init__.py +++ b/tools/targets/__init__.py @@ -427,7 +427,7 @@ class LPC4088Code(object): # Pad the fist part (internal flash) with 0xFF to 512k data = partf.read() outbin.write(data) - outbin.write('\xFF' * (512*1024 - len(data))) + outbin.write(b'\xFF' * (512*1024 - len(data))) partf.close() # Read and append the second part (external flash) in chunks of fixed # size @@ -470,7 +470,7 @@ class MTSCode(object): part = open(loader, 'rb') data = part.read() outbin.write(data) - outbin.write('\xFF' * (64*1024 - len(data))) + outbin.write(b'\xFF' * (64*1024 - len(data))) part.close() part = open(binf, 'rb') data = part.read() From b63f255af8de9b7da72bb1d2a74310a7e18915b4 Mon Sep 17 00:00:00 2001 From: Cruz Monrreal II Date: Mon, 11 Feb 2019 20:03:53 -0600 Subject: [PATCH 033/109] Removed decode since deeper tools always return strings --- tools/toolchains/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/toolchains/__init__.py b/tools/toolchains/__init__.py index 6595538f8d..cc1b6e21a9 100644 --- a/tools/toolchains/__init__.py +++ b/tools/toolchains/__init__.py @@ -571,7 +571,7 @@ class mbedToolchain: def compile_output(self, output=[]): _rc = output[0] - _stderr = output[1].decode("utf-8") + _stderr = output[1] command = output[2] # Parse output for Warnings and Errors From 64b263cedb53ee17f289d9a1c84648961bdbca32 Mon Sep 17 00:00:00 2001 From: Leszek Rusinowicz Date: Tue, 12 Feb 2019 12:20:01 +0100 Subject: [PATCH 034/109] FUTURE_SEQUANA: Fixed Arduino signal mappings Fixed Arduino signal mappings for production version of Sequana board. --- .../TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA/PinNames.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA/PinNames.h b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA/PinNames.h index 10a8f6dd41..a3b6d064d8 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA/PinNames.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/TARGET_FUTURE_SEQUANA/PinNames.h @@ -187,7 +187,7 @@ typedef enum { D2 = P10_6, D3 = P12_6, D4 = P12_7, - D5 = P6_2, + D5 = P5_5, D6 = P6_3, D7 = P7_2, D8 = P7_1, From c632480a25b001c79120889a12d06094050d5d91 Mon Sep 17 00:00:00 2001 From: Cai Date: Mon, 7 Jan 2019 20:26:00 +0800 Subject: [PATCH 035/109] Add WIFI support for RDA target UNO_91H --- TESTS/network/emac/main.cpp | 3 +- .../TARGET_RDA_EMAC/RdaWiFiInterface.cpp | 217 +++ .../TARGET_RDA_EMAC/RdaWiFiInterface.h | 137 ++ .../TARGET_RDA/TARGET_UNO_91H/inc/csl_mbed.h | 152 ++ .../TARGET_UNO_91H/inc/maclib_task.h | 69 + .../TARGET_UNO_91H/inc/rda5981_flash.h | 105 ++ .../TARGET_UNO_91H/inc/rda5981_ota.h | 57 + .../TARGET_UNO_91H/inc/rda5981_sniffer.h | 99 ++ .../TARGET_UNO_91H/inc/rda5991h_wland.h | 658 ++++++++ .../TARGET_UNO_91H/inc/rda_sys_wrapper.h | 216 +++ .../TARGET_RDA/TARGET_UNO_91H/inc/wland_dbg.h | 60 + .../TARGET_UNO_91H/inc/wland_flash.h | 311 ++++ .../TARGET_UNO_91H/inc/wland_flash_wp.h | 32 + .../TARGET_RDA/TARGET_UNO_91H/inc/wland_ota.h | 39 + .../TARGET_RDA/TARGET_UNO_91H/inc/wland_rf.h | 41 + .../TARGET_UNO_91H/inc/wland_types.h | 86 + .../LICENSE-permissive-binary-license-1.0.txt | 49 + .../TARGET_RDA/TARGET_UNO_91H/lib/README.md | 7 + .../lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar | Bin 0 -> 2534620 bytes .../lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a | Bin 0 -> 1179022 bytes .../lib/TOOLCHAIN_IAR/libwifi_sta_ap.a | Bin 0 -> 2519912 bytes .../TARGET_UNO_91H/src/maclib_task.c | 275 +++ .../TARGET_UNO_91H/src/rda5991h_wland.c | 509 ++++++ .../TARGET_UNO_91H/src/rda_sys_wrapper.c | 450 +++++ .../TARGET_UNO_91H/src/wland_flash.c | 1481 +++++++++++++++++ .../TARGET_UNO_91H/src/wland_flash_wp.c | 366 ++++ .../TARGET_RDA/TARGET_UNO_91H/src/wland_ota.c | 145 ++ .../TARGET_RDA_EMAC/rda5981x_emac.cpp | 293 ++++ .../TARGET_RDA_EMAC/rda5981x_emac.h | 161 ++ .../TARGET_RDA_EMAC/rda5981x_emac_config.h | 22 + .../TARGET_UNO_91H/device/RDA5991H.h | 32 +- targets/TARGET_RDA/TARGET_UNO_91H/trng_api.c | 10 + targets/targets.json | 8 +- 33 files changed, 6066 insertions(+), 24 deletions(-) create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/csl_mbed.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/maclib_task.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5981_flash.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5981_ota.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5981_sniffer.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda_sys_wrapper.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_dbg.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_flash.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_flash_wp.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_ota.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_rf.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_types.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/README.md create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libwifi_sta_ap.a create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda_sys_wrapper.c create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash.c create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash_wp.c create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_ota.c create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.h create mode 100644 features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac_config.h diff --git a/TESTS/network/emac/main.cpp b/TESTS/network/emac/main.cpp index 49ee3cf909..8da3492421 100644 --- a/TESTS/network/emac/main.cpp +++ b/TESTS/network/emac/main.cpp @@ -35,7 +35,8 @@ !defined(TARGET_MTB_ADV_WISE_1530) && \ !defined(TARGET_MTB_USI_WM_BN_BM_22) && \ !defined(TARGET_MTB_MXCHIP_EMW3166) && \ - !defined(TARGET_MTB_UBLOX_ODIN_W2) + !defined(TARGET_MTB_UBLOX_ODIN_W2) && \ + !defined(TARGET_UNO_91H) #error [NOT_SUPPORTED] Wifi tests are not valid for the target #endif #endif diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp new file mode 100644 index 0000000000..0df8bb6fee --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp @@ -0,0 +1,217 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "WiFiInterface.h" +#include "RdaWiFiInterface.h" +#include "rda5991h_wland.h" +#include "nsapi_types.h" +#include "wland_types.h" +#include "rda_sys_wrapper.h" + +nsapi_error_t RDAWiFiInterface::set_channel(uint8_t channel) +{ + int ret= 0; + init(); + + if (channel > 13) + return NSAPI_ERROR_PARAMETER; + + if (channel == 0) { + _channel = 0; + return NSAPI_ERROR_OK; + } + + ret = rda5981_set_channel(channel); + if (ret == 0) { + _channel = channel; + return NSAPI_ERROR_OK; + } else { + return NSAPI_ERROR_TIMEOUT; + } +} + +int8_t RDAWiFiInterface::get_rssi() +{ + return rda5981_get_rssi(); +} + +nsapi_error_t RDAWiFiInterface::init() +{ + if (!_interface) { + if (!_emac.power_up()) { + LWIP_DEBUGF(NETIF_DEBUG,"power up failed!\n"); + } + nsapi_error_t err = _stack.add_ethernet_interface(_emac, true, &_interface); + if (err != NSAPI_ERROR_OK) { + _interface = NULL; + return err; + } + _interface->attach(_connection_status_cb); + } + return NSAPI_ERROR_OK; +} + +nsapi_error_t RDAWiFiInterface::set_credentials(const char *ssid, const char *pass, + nsapi_security_t security) +{ + if (ssid == 0 || strlen(ssid) == 0) { + return NSAPI_ERROR_PARAMETER; + } + if (security != NSAPI_SECURITY_NONE && (pass == 0 || strlen(pass) == 0)) { + return NSAPI_ERROR_PARAMETER; + } + if (strlen(ssid) > 32 || strlen(pass) > 63) { + return NSAPI_ERROR_PARAMETER; + } + memcpy((void*)_ssid, (void*)ssid, strlen(ssid)); + _ssid[strlen(ssid)] = '\0'; + memcpy((void*)_pass, (void*)pass, strlen(pass)); + _pass[strlen(pass)] = '\0'; + _security = security; + return NSAPI_ERROR_OK; +} + +nsapi_error_t RDAWiFiInterface::connect(const char *ssid, const char *pass, + nsapi_security_t security, uint8_t channel) +{ + rda_msg msg; + bool find = false; + int i = 0; + rda5981_scan_result bss; + int ret = 0; + + if (ssid == NULL || ssid[0] == 0) { + return NSAPI_ERROR_PARAMETER; + } + + init(); + + if(rda5981_check_scan_result_name(ssid) != 0) { + for (i = 0; i< 5; i++) { + rda5981_scan(NULL, 0, 0); + if(rda5981_check_scan_result_name(ssid) == 0) { + find = true; + break; + } + } + } else { + find = true; + } + + if (find == false) { + LWIP_DEBUGF(NETIF_DEBUG,"can not find the ap.\r\n"); + return NSAPI_ERROR_CONNECTION_TIMEOUT; + } + bss.channel = 15; + rda5981_get_scan_result_name(&bss, ssid); + if ((channel !=0) && (bss.channel != channel)) { + LWIP_DEBUGF(NETIF_DEBUG, "invalid channel\r\n"); + return NSAPI_ERROR_CONNECTION_TIMEOUT; + } + + memcpy(gssid, ssid, strlen(ssid)); + if (pass[0] != 0) { + memcpy(gpass, pass, strlen(pass)); + } + memset(gbssid, 0, NSAPI_MAC_BYTES); + gssid[strlen(ssid)] = gpass[strlen(pass)] = '\0'; + + msg.type = WLAND_CONNECT; + rda_mail_put(wland_msgQ, (void*)&msg, osWaitForever); + ret = rda_sem_wait(wifi_auth_sem, 10000); + if (ret) { + return NSAPI_ERROR_CONNECTION_TIMEOUT; + } + + ret = _interface->bringup(_dhcp, + _ip_address[0] ? _ip_address : 0, + _netmask[0] ? _netmask : 0, + _gateway[0] ? _gateway : 0, + DEFAULT_STACK, + _blocking); + + return ret; +} + + +nsapi_error_t RDAWiFiInterface::connect() +{ + return connect(_ssid, _pass, _security, _channel); +} + +nsapi_error_t RDAWiFiInterface::disconnect() +{ + rda_msg msg; + + if(sta_state < 2) { + return NSAPI_ERROR_NO_CONNECTION; + } + msg.type = WLAND_DISCONNECT; + rda_mail_put(wland_msgQ, (void*)&msg, osWaitForever); + if (_interface) { + return _interface->bringdown(); + } + + return NSAPI_ERROR_NO_CONNECTION; +} + +nsapi_size_or_error_t RDAWiFiInterface::scan(WiFiAccessPoint *res, nsapi_size_t count) +{ + int bss_num = 0, i; + rda5981_scan_result *bss; + nsapi_wifi_ap_t ap; + + init(); + + rda5981_scan(NULL, 0, 0); + bss_num = rda5981_get_scan_num(); + if (count != 0) { + bss_num = (bss_num < count) ? bss_num : count; + } + if (res) { + bss = (rda5981_scan_result *)malloc(bss_num * sizeof(rda5981_scan_result)); + rda5981_get_scan_result(bss, bss_num); + for (i=0; i +#ifdef __cplusplus +extern "C" { +#endif + +extern const unsigned int RDA_FW_INFO_ADDR; +extern const unsigned int RDA_UPGRADE_ADDR; + +/* + * function: start to wirte a partition. this func will erase given flash region + * @addr: partition start address, must be 4k alignment + * @img_len: length of image getted from OTA server, must be 4k alignment + * return: 0:success, else:fail + */ +int rda5981_write_partition_start(unsigned int addr, unsigned int img_len); + +/* + * function: write image to flash, without erase. + * the write region must be inside of the area given by func rda5981_write_partition_start + * the write region must be in order, otherwise the end function will return crc error. + * the maximum length could be write once time is 0x1000 + * @offset: offset from image inital position, must be 1k alignment + * @buf: data to be written + * @len: buffer len, max #0x1000, must be 1k alignment + * return: 0:success, else:fail + */ +int rda5981_write_partition(unsigned int offset, const unsigned char *buf, unsigned int len); + +/* + * function: end of writing partition + * return: 0:crc32 check success, else:fail + */ +int rda5981_write_partition_end(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_RDA5981_OTA_H_*/ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5981_sniffer.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5981_sniffer.h new file mode 100644 index 0000000000..0f0f4658e3 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5981_sniffer.h @@ -0,0 +1,99 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 _RDA5981_SNIFFER_H_ +#define _RDA5981_SNIFFER_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#include "wland_types.h" + +/* Enable filtering ACK frames (no support)*/ +//#define RDA_RX_FILTER_DROP_ACK BIT0 + +/* Enable filtering CTS frames (no support)*/ +//#define RDA_RX_FILTER_DROP_CTS BIT1 + +/* Enable filtering RTS frames (no support)*/ +//#define RDA_RX_FILTER_DROP_RTS BIT2 + +/* Enable filtering beacon frames */ +#define RDA_RX_FILTER_DROP_BEACON BIT3 + +/* Enable filtering ATIM frames (no support)*/ +//#define RDA_RX_FILTER_DROP_ATIM BIT4 + +/* Enable filtering CF_END frames (no support)*/ +//#define RDA_RX_FILTER_DROP_CF_END BIT5 + +/* Enable filtering QCF_POLL frames (no support)*/ +//#define RDA_RX_FILTER_DROP_QCF_POLL BIT6 + +/* Filter Management frames which are not directed to current STA */ +#define RDA_RX_FILTER_DROP_ND_MGMT BIT7 + +/* Filter BC/MC MGMT frames belonging to other BSS */ +#define RDA_RX_FILTER_DROP_BC_MC_MGMT_OTHER_BSS BIT8 + +/* Enable filtering of duplicate frames */ +#define RDA_RX_FILTER_DROP_DUPLICATE BIT9 + +/* Enable filtering of frames whose FCS has failed */ +#define RDA_RX_FILTER_DROP_FCS_FAILED BIT10 + +/* Enable filtering of De-authentication frame */ +#define RDA_RX_FILTER_DROP_DEAUTH BIT11 + +/* Filter BA frames which are not received as SIFS response (no support)*/ +//#define RDA_RX_FILTER_DROP_NSIFS_RESP_BA BIT12 + +/* Filter BA frames which are received as SIFS response (no support)*/ +//#define RDA_RX_FILTER_DROP_SIFS_RESP_BA BIT13 + +/* Filter frames which are received in secondary channel (20 MHz PPDU from Secondary channel) */ +#define RDA_RX_FILTER_DROP_SEC_CHANNEL BIT14 + +/* Filter BC/MC DATA frames belonging to other BSS */ +#define RDA_RX_FILTER_DROP_BC_MC_DATA_OTHER_BSS BIT15 + +/* Filter DATA frames not directed to this station */ +#define RDA_RX_FILTER_DROP_ND_DATA BIT16 + +/* Filter Control frames which are not directed to current STA (no support)*/ +//#define RDA_RX_FILTER_DROP_ND_CONTROL BIT17 + +/* Filter Beacon frames (in IBSS mode) which are not used for adoption because the timestamp field is lower than TSF timer */ +#define RDA_RX_FILTER_DROP_IBSS_BEACON BIT18 + +typedef int (*sniffer_handler_t)(unsigned short data_len, void *data); + +int rda5981_enable_sniffer(sniffer_handler_t handler); +int rda5981_disable_sniffer(void); +//don't use this in sniffer callback handler +int rda5981_disable_sniffer_nocallback(void); +///TODO: time is no use anymore +int rda5981_start_sniffer(unsigned char channel, unsigned char to_ds, + unsigned char from_ds, unsigned char mgm_frame, unsigned short time); +int rda5981_stop_sniffer(void); +int wland_sniffer_set_channel(unsigned char channel); +int rda5981_set_filter(unsigned char to_ds, unsigned char from_ds, unsigned int mgm_filter); +int rda5981_sniffer_enable_fcs(void);//for hiflying +#ifdef __cplusplus +} +#endif + +#endif /*_RDA5981_SNIFFER_H_*/ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h new file mode 100644 index 0000000000..25ec00acbc --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h @@ -0,0 +1,658 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 _RDA5991H_WLAND_H_ +#define _RDA5991H_WLAND_H_ + +#include "sys_arch.h" +#include "wland_types.h" + +/* Mbed interface mac address + * if MBED_MAC_ADD_x are zero, interface uid sets mac address, + * otherwise MAC_ADD_x are used. + */ + +extern unsigned char user_mac[6];//not save in flash, need fill before wifi init every time +extern unsigned char gssid[32+1]; +extern unsigned char gpass[64+1]; +extern unsigned char gchannel; +extern unsigned char gbssid[6]; + +extern unsigned char gssid_ap[32+1]; +extern unsigned char gpass_ap[64+1]; +extern unsigned char gchannel_ap; +extern void *wland_msgQ; +extern void *wifi_auth_sem; + +extern u8 sta_state; + +typedef enum { + WLAND_CONNECT, + WLAND_RECONNECT, + WLAND_DISCONNECT, + WLAND_DISCONNECT_ERROR, + WLAND_STARTAP, + WLAND_STOPAP, + WLAND_ADD_AP_GTK, + WLAND_AP_EAPOL_3_OF_4, + WLAND_ADD_AP_PTK, + WLAND_STAJOINED, + WLAND_STAEXITED, + WLAND_STADEAUTH, + WLAND_MAC_CONNECTED, + WLAND_MAC_AP_CONNECTED, + WLAND_ADD_GTK, + WLAND_ADD_PTK, + WLAND_CON_FINISH, + WLAND_AUTO_RATE, + WLAND_ARP_OFFLOAD, + WLAND_SM_START, + WLAND_SM_STOP, + WLAND_WPS_CONNECT, + WLAND_WPS_START, + WLAND_WPS_DISCONNECT, +}WLAND_MSG; + +typedef enum { + MAIN_CONNECT, + MAIN_RECONNECT, + MAIN_DISCONNECT, + MAIN_STOP_AP, +}MAIN_MSG; + +typedef struct { + unsigned int type; + unsigned int arg1; + unsigned int arg2; + unsigned int arg3; +}rda_msg; + + +enum { + D_NONE_LEVEL = 0, + D_ERROR_LEVEL = 1, + D_INFO_LEVEL = 2, + D_DEBUG_LEVEL = 3, +}; + +#define WLAND_DBG_DUMP 0 +#define WPA_DBG_DUMP 0 +#define HUT_DBG_DUMP 0 +#define WLAND_DBG_LEVEL D_NONE_LEVEL +#define WPA_DBG_LEBEL D_NONE_LEVEL +#define WLANDLIB_DBG_LEVEL D_NONE_LEVEL + +#define ETH_ALEN 6 + +//encrypt type +#define ENCRYPT_NONE (0) +#define ENCRYPT_WPA_TKIP BIT0 +#define ENCRYPT_WPA_CCMP BIT1 +#define ENCRYPT_WPA2_TKIP BIT2 +#define ENCRYPT_WPA2_CCMP BIT3 +#define ENCRYPT_WEP BIT4 + +/* r91h driver data structure */ +typedef struct { + struct netif *netif_sta; + struct netif *netif_ap; + sys_thread_t wland_thread; + sys_thread_t maclib_thread; + sys_mbox_t maclib_mbox; + sys_mbox_t wland_mbox; +} rda_enetdata_t; + +__STATIC_INLINE int mac_is_valid(char* mac) +{ + return (mac[0] | mac[1] | mac[2] | mac[3] | mac[4] | mac[5]); +} + + +#ifdef __cplusplus +extern "C" { +#endif + +extern void wland_txip_data(void *data, unsigned int len, int mode); +extern void *wland_get_databuf(void); +extern void wland_sta_init(void); +extern void wland_reg_func(void); +extern void r91h_phy_task(void *data); +extern void wland_task(void *arg); +extern void rda_get_macaddr(u8_t *macaddr, int mode); +extern void rda5981_send_rawdata(char* data, unsigned int len); +extern int rda5981_send_nulldata(int power_save); +extern void rda5981_set_country_code(unsigned char country_code);// 0~china(1-14) 1~NA(1-11) 2~EU(1-13) +extern int rda5981_set_retrans_policy(unsigned char count); +extern int rda5981_set_channel(unsigned char channel); +/* default is 0, receive multicast packet, disable please set 1*/ +extern int rda5981_filter_multicast(unsigned char enable); +/* default is 0, 0 ~ no hidden, 1 ~ hidden zero len, 2 ~ hidden zero contents */ +extern void rda5981_set_AP_hidden_type(unsigned char mode); +extern void rda5981_set_AP_link_num(unsigned char num); +extern char* rda5981_get_ver(void); +extern int rda5981_enter_CE_MODE(unsigned char enable); +/* + * mode 0 - not 11n 1 - 11n + * + * -----------------11n(mode 1)(Mbps)----------------- + * rate HT20 HT40 + * GI(800ns) GI(400ns) GI(800ns) GI(400ns) + * 0 6.5 7.2 13.5 15 + * 1 13 14.2 27 30 + * 2 19.5 21.7 40.5 45 + * 3 26 28.9 54 60 + * 4 39 43.3 81 90 + * 5 52 57.8 108 120 + * 6 58.5 65 121.5 135 + * 7 65 72 135 150 + * + * --------------not 11n(mode 0)(Mbps)----------------- + * rate data rate rate data rate + * 0 autorate 9 9 + * 1 1 12 12 + * 2 2 18 18 + * 5 5.5 24 24 + * 11 11 36 36 + * 6 6 48 48 + * + */ +extern int rda5981_set_data_rate(unsigned char mode, unsigned char rate); +extern void rda5981_set_mode(unsigned char bgn_enable); +extern void rda5981_set_auth_timeout(unsigned char timeout_enable); +typedef struct { + char BSSID[ETH_ALEN]; + char SSID[32+1]; + signed char RSSI; + unsigned char SSID_len; + unsigned char channel; + unsigned char secure_type;//refer #define ENCRYPT_XXX + unsigned char wmm; + unsigned char *ie;//user program couldn't free(ie); + unsigned short capability; + unsigned int ie_length; +} rda5981_scan_result; + +typedef struct { + unsigned char mac[ETH_ALEN]; + unsigned int ip; +} rda5981_apsta_info; + +//scan one or all channel(if channel is 0) once +int rda5981_scan(const char *SSID, const unsigned char SSID_len, const unsigned char channel); +//0 passive mode, 1 active mode, scan time(unit is second) +int rda5981_scan_v2(const char *SSID, const unsigned char SSID_len, const unsigned char channel, const unsigned char mode, \ + const unsigned char scan_time); +int rda5981_get_scan_num(); +int rda5981_get_scan_result(rda5981_scan_result *buf, const unsigned char len); +int rda5981_get_scan_result_index(rda5981_scan_result *buf, const unsigned char index); +int rda5981_get_scan_result_name(rda5981_scan_result *buf, const char *name); +int rda5981_get_scan_result_bssid(rda5981_scan_result *buf, const unsigned char *bssid); +int rda5981_check_scan_result_name(const char *name); +int rda5981_check_scan_result(const char *ssid, const char *bssid, const unsigned channel); +int rda5981_check_scan_result_name_bssid(const unsigned char *name, const unsigned char *bssid); +int rda5981_del_scan_all_result(void); +void rda5981_set_expired_time(unsigned int expired_time); +int rda5981_get_joined_AP(rda5981_scan_result *bss); +s8 rda5981_get_rssi(); +void rda5981_set_main_queue(void* queue); + +void rda5981_set_sta_listen_interval(unsigned char interval); +void rda5981_set_sta_link_loss_time(unsigned char time); +unsigned int rda5981_get_ap_join_info(rda5981_apsta_info *buf, const unsigned char len); +void rda5981_set_AP_white_list(unsigned char flag, unsigned char *mac); +int wland_set_joined_sta_ip(char *mac, unsigned int ip); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_mac_addr(unsigned char *mac_addr); +int rda5981_flash_write_mac_addr(unsigned char *mac_addr); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_uart(void); +int rda5981_flash_read_uart(unsigned int *uart); +int rda5981_flash_write_uart(unsigned int *uart); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_ip_addr(unsigned char *ip_addr, unsigned char *server_addr); +int rda5981_flash_write_ip_addr(unsigned char *ip_add, unsigned char *server_addr); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_dhcp_data(void); +int rda5981_flash_read_dhcp_data(unsigned int *enable, unsigned int *ip, unsigned int *msk, unsigned int *gw); +int rda5981_flash_write_dhcp_data(unsigned int enable, unsigned int ip, unsigned int msk, unsigned int gw); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_ap_data(char *ssid, char *passwd, unsigned char *channel); +int rda5981_flash_write_ap_data(const char *ssid, const char *passwd, unsigned char channel); +int rda5981_flash_erase_ap_data(void); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_ap_net_data(unsigned int *ip, unsigned int *msk, unsigned int *gw, + unsigned int *dhcps, unsigned int *dhcpe); +int rda5981_flash_write_ap_net_data(unsigned int ip, unsigned int msk, unsigned int gw, + unsigned int dhcps, unsigned int dhcpe); +int rda5981_flash_erase_ap_net_data(void); + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_sta_data(char *ssid, char *passwd); +int rda5981_flash_write_sta_data(const char *ssid, const char *passwd); +int rda5981_flash_erase_sta_data(void); + + +/* + * read 3rd parter data length from flash + * return user data length + */ +int rda5981_flash_read_3rdparter_data_length(void); + +/* + * read 3rd parter data from flash + * @buf, buf to store user data + * @buf_len, length of buf + * return user data length + */ +int rda5981_flash_read_3rdparter_data(unsigned char *buf, unsigned int buf_len); + +/* + * write 3rd parter data from flash + * @buf, data to write + * @buf_len, length of buf. + * return 0:ok, else:fail + */ +int rda5981_flash_write_3rdparter_data(const unsigned char *buf, unsigned int buf_len); + +/* + * erase 3rd parter data from flash + * return 0:ok, else:fail + */ +int rda5981_flash_erase_3rdparter_data(void); + +/* + * set flash size + * @size, 1MB:0x100000, 2MB:0x200000, 4MB:0x400000. default size: 1MB + * return 0:ok, else:fail + */ +int rda5981_set_flash_size(const unsigned int size); + +/* + * set userdata location on flash + * @sys_data_addr, data to save system parameter, user can not operate this area directly. + * size:4KB. default location:0x180fb000 + * @user_data_addr, data to save user data. user can save own data in this area + * by @rda5981_flash_read_3rdparter_data + * and @rda5981_flash_write_3rdparter_data + * default location:0x180fc000 + * @user_data_len, user data length, default:4KB + * return 0:ok, else:fail + */ +int rda5981_set_user_data_addr(const unsigned int sys_data_addr, + const unsigned int user_data_addr, const unsigned int user_data_len); + +/* + * function: erase flash + * @addr: mast be 4k alignment + * @len: must be 4k alignment. (package 64KB erase and 4KB erase for different condition automatically) + * return: 0:success, else:fail + */ +int rda5981_erase_flash(unsigned int addr, unsigned int len); + +/* + * function: write flash + * @addr: mast be 256 alignment + * @buf: data to be written, best be 4 alignment + * @len: buffer len, mast be 4 alignment + * return: 0:success, else:fail + */ +int rda5981_write_flash(unsigned int addr, char *buf, unsigned int len); + +/* + * function: read flash to @buf + * @addr: best be 4 alignment + * @buf: best be 4 alignment + * @len: buffer len + * return: 0:success, else:fail + */ +int rda5981_read_flash(unsigned int addr, char *buf, unsigned int len); + +/* + * function: read user data + * @data: data to read + * @len: length of data in byte + * @flag: user data flag + * return: 0:success, else:fail + */ +int rda5981_read_user_data(unsigned char *data, unsigned short len, unsigned int flag); + +/* + * function: write user data + * @data: data to write + * @len: length of data in byte + * @flag: user data flag + * return: 0:success, else:fail + */ +int rda5981_write_user_data(unsigned char *data, unsigned short len, unsigned int flag); + +/* + * function: erase user data + * @flag: user data flag + * return: 0:success, else:fail + */ +int rda5981_erase_user_data(unsigned int flag); + +/* + * function: update tx power from efuse data, for reg 11F and 120 + * return: 0:success, else:fail + */ +int update_tx_power_from_efuse(void); + +/* + * function: update xtal calibration from efuse data, for reg DA + * return: 0:success, else:fail + */ +int update_xtal_cal_from_efuse(void); + +/* + * function: update mac addr from flash data + * return: 0:success, else:fail + */ +int update_mac_addr_from_efuse(void); + +/* + * function: update tx power from flash data, Deprecated version + * return: 0:success, else:fail + */ +int update_tx_power_from_flash(void); + +/* + * function: update tx power from flash data, for reg 8A + * return: 0:success, else:fail + */ +int update_tx_power_rf_from_flash(void); + +/* + * function: update tx power from flash data, for reg 11F and 120 + * return: 0:success, else:fail + */ +int update_tx_power_phy_from_flash(void); + +/* + * function: update xtal calibration from flash data + * return: 0:success, else:fail + */ +int update_xtal_cal_from_flash(void); + +/* + * function: update mac addr from flash data + * return: 0:success, else:fail + */ +int update_mac_addr_from_flash(void); + +/* + * function: write rf reg + * @reg: rf reg data + * @value: rf reg value + * return: 0:success, else:fail + * eg: 0x00DA:xtal calibration + */ +int wland_rf_write(unsigned short reg, unsigned short value); + +/* + * function: write rf reg + * @reg: rf reg data + * @value: rf reg value + * @len : value length + * return: 0:success, else:fail + * eg: 0x008A:tx power rf + */ +int wland_rf_write_all_channels(unsigned short reg, unsigned short *value, unsigned short len); + +/* + * function: read rf reg + * @reg: rf reg data + * @value: rf reg value + * return: 0:success, else:fail + */ +int wland_rf_read(unsigned short reg, unsigned short *value); + +/* + * function: read rf reg + * @reg: rf reg data + * @value: rf reg value + * return: 0:success, else:fail + * eg: 0x008A:tx power rf + */ +int wland_rf_read_all_channels(unsigned short reg, unsigned short *value); + +/* + * function: write phy reg + * @reg: phy reg data + * @value: phy reg value + * return: 0:success, else:fail + */ +int wland_phy_write(unsigned int reg, unsigned int value); + +/* + * function: write phy reg + * @reg: phy reg data + * @value: phy reg value + * @len : value length + * return: 0:success, else:fail + */ +int wland_phy_write_all_channels(unsigned int reg, unsigned int *value, unsigned short len); + +/* + * function: read phy reg + * @reg: phy reg data + * @value: phy reg value + * return: 0:success, else:fail + */ +int wland_phy_read(unsigned int reg, unsigned int *value); + +/* + * function: read phy reg + * @reg: phy reg data + * @value: phy reg value + * return: 0:success, else:fail + */ +int wland_phy_read_all_channels(unsigned int reg, unsigned int *value); + +/* efuse API start */ +/* Efuse CAN ONLY WRITE ONCE! DO NOT CALL THESE API IF YOU DO KNOW WHAT THEY MEANS!!! */ + +/* + * function: read all efuse + * @value: buffer to store efuse data, 28 bytes + * return: 0:success, else:fail + */ +int wland_read_efuse(unsigned char *value); + +/* + * function: read tx power from efuse + * @tx_power: 2 bytes, first is mode g/n(range 0x25~0x54), second is mode b(range 0x15~0x54). + * return: 0:success, else:fail + */ +int wland_read_tx_power_from_efuse(unsigned char *tx_power); + +/* + * function: read tx power from efuse + * @tx_power: 2 bytes, first is mode g/n(range 0x25~0x54), second is mode b(range 0x15~0x54) + * @len: must be 2 + * return: 0:success, else:fail + */ +int wland_write_tx_power_to_efuse(unsigned char *tx_power, unsigned char len); + +/* + * function: read xtal cal from efuse + * @xtal_cal: 1 byte, maximum 0x7F + * return: 0:success, else:fail + */ +int wland_read_xtal_cal_from_efuse(unsigned char *cal_val); + +/* + * function: write xtal cal to efuse + * @xtal_cal: 1 byte, maximum 0x7F + * @len : must be 1 + * return: 0:success, else:fail + */ +int wland_write_xtal_cal_to_efuse(unsigned char *xtal_cal, unsigned char len); + +/* + * function: write mac to efuse + * @xtal_cal: 6 bytes + * return: 0:success, else:fail + */ +int wland_read_mac_addr_from_efuse(unsigned char *mac_addr); + +/* + * function: write mac to efuse + * @xtal_cal: 6 bytes + * @len : must be 6 + * return: 0:success, else:fail + */ +int wland_write_mac_addr_to_efuse(unsigned char*mac_addr, unsigned char len); +/* efuse API end */ + +/* + * function: start rf test + * @argc: number of argv + * @argv: args for test, 6 elements for tx test, 4 elements for rx test + * @is_tx: 1 for tx test, 0 for rx test + * return: 0:success, else:fail + */ +int wland_start_rf_test(unsigned int argc, unsigned int *argv, unsigned int is_tx); + +/* + * function: stop rx test + * return: 0:success, else:fail + */ +int wland_stop_rx_test(void); + +/* + * function: get rf test result + * @result buffer to store rx result + * return: 0:success, else:fail + */ +int wland_get_rx_result(char *result); + +/* + * function: restart rx test, use last rx test args + * return: 0:success, else:fail + */ +int wland_restart_rx_test(void); + +/* + * function: stop tx test + * return: 0:success, else:fail + */ +int wland_stop_tx_test(void); + +/* + * function: restart tx test, use last tx test args + * return: 0:success, else:fail + */ +int wland_restart_tx_test(void); + +#define RDA5981_FIRMWARE_INFO_ADDR 0x18003000 +/* + * function: reboot to assigned addr (onece). + * reboot to rf test mode, not for OTA + * @firmware_info_addr: firmware info addr, depend on your flash layout + * @reboot_addr: reboot addr, 0x18001000-0x1840000 + * return: 0:success, else:fail + */ +int rda5981_reboot_to_addr(unsigned int firmware_info_addr, unsigned int reboot_addr); + +/* + * function: read reg and corresponding value related to test mode stored in flash + * @reg: reg to read + * @value: buffer to store value + * @flag: user data flag + * return: 0:success, else:fail + */ +int rda5981_read_user_data_regs(unsigned char *reg, unsigned char *value, unsigned int flag); + +/* + * function: write reg and corresponding value related to test mode stored in flash + * @reg: reg to write + * @value: buffer that stores value + * @flag: user data flag + * return: 0:success, else:fail + */ +int rda5981_write_user_data_regs(unsigned char *reg, unsigned char *value, unsigned int flag); + +/* + * function: erase reg and corresponding value related to test mode stored in flash + * @reg: reg to erase + * @flag: user data flag + * return: 0:success, else:fail + */ +int rda5981_erase_user_data_regs(unsigned char *reg, unsigned int flag); + +/* + * function: get flash Manufacturer ID + * @mid: + * return: 0:success, else:fail + */ +int rda5981_flash_get_mid(unsigned char *mid); + +/* + * function: get flash Device ID + * @did: + * return: 0:success, else:fail + */ +int rda5981_flash_get_did(unsigned char *did); + +/* + * function: get flash ID + * @mid: + * return: 0:success, else:fail + */ +int rda5981_flash_get_jdid(unsigned short *jdid); + +/* + * function: read mac reg + * @reg: mac reg data + * @value: mac reg value + * return: 0:success, else:fail + */ +int wland_mac_reg_read(unsigned short reg, unsigned int *value); + +/* + * function: write mac reg + * @reg: mac reg data + * @value: mac reg value + * return: 0:success, else:fail + */ +int wland_mac_reg_write(unsigned short reg, unsigned int value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda_sys_wrapper.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda_sys_wrapper.h new file mode 100644 index 0000000000..25b80b5199 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda_sys_wrapper.h @@ -0,0 +1,216 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if 1 +#ifndef _RDA_SYS_WRAPPER_H_ +#define _RDA_SYS_WRAPPER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Alarm */ +/** + * @brief : get current time in units of micro second + * @param[in] : + * @param[out]: + * @return : return time value with uint32 type + */ +extern unsigned long rda_get_cur_time_ms(void); + +/** + * @brief : create an alarm with given function, return timer handle + * @param[in] : func(callback)/data(pass to func)/mode(once or periodic) + * @param[out]: + * @return : return timer handle, a pointer to the timer structure, non-zero is valid + */ +extern void * rda_alarm_create_v2(void *func, unsigned int data, unsigned int mode); +extern void * rda_alarm_create(void *func, unsigned int data); + +/** + * @brief : delete an alarm with given handle, then reset the handle + * @param[in] : *handle(pointer to the timer structure) + * @param[out]: **handle(address of the handle variable) + * @return : + */ +extern int rda_alarm_delete(void **handle); + +/** + * @brief : start an alarm, raise a function call after given timeout delay + * @param[in] : handle(pointer to the timer structure)/timeout(micro second) + * @param[out]: + * @return : + */ +extern int rda_alarm_start(void *handle, unsigned int timeout_ms); + +/** + * @brief : stop an alarm, will not raise a function call any more + * @param[in] : handle(pointer to the timer structure) + * @param[out]: + * @return : + */ +extern int rda_alarm_stop(void *handle); + + +/* Semaphore */ +/** + * @brief : create a semaphore + * @param[in] : name and initial valve of semaphore + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern void* rda_sem_create(unsigned int count); + +/** + * @brief : wait a semaphore + * @param[in] : name of semaphore + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_sem_wait(void *sem, unsigned int millisec); + +/** + * @brief : release a semaphore + * @param[in] : name of semaphore + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_sem_release(void *sem); + +/** + * @brief : delete a semaphore + * @param[in] : name of semaphore + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_sem_delete(void *sem); + + +/* Queue */ +/** + * @brief : create a message queue + * @param[in] : size of message queue + * @param[out]: + * @return : return message queue id or NULL if error + */ +extern void* rda_msgQ_create(unsigned int queuesz); + +/** + * @brief : put a message to queue + * @param[in] : message queue id, message value and wait time + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_msg_put(void *msgQId, unsigned int msg, unsigned int millisec); + +/** + * @brief : get a message from queue + * @param[in] : message queue id, message value and wait time + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_msg_get(void *msgQId, unsigned int *value, unsigned int millisec); + +/* Mail */ +/** + * @brief : create a mail + * @param[in] : mail count/size + * @param[out]: + * @return : return mail handle + */ +void* rda_mail_create(unsigned int msgcnt, unsigned int msgsize); + +/** + * @brief : get a msg from mail + * @param[in] : handler name of mail/mail/wait time + * @param[out]: + * @return : return ERR or NO_ERR + */ +int rda_mail_get(void *rdahandle, void *evt, unsigned int wait); + +/** + * @brief : put a msg to mail + * @param[in] : handler of mail/mail/wait time + * @param[out]: + * @return : return ERR or NO_ERR + */ + +int rda_mail_put(void *rdahandle, void *evt, unsigned int wait); + +/* Mutex */ +/** + * @brief : create a mutex + * @param[in] : + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern void* rda_mutex_create(void); + +/** + * @brief : wait a mutex + * @param[in] : id of mutex and wait time + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_mutex_wait(void *rdamutex, unsigned int millisec); + +/** + * @brief : release a mutex + * @param[in] : id of mutex + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_mutex_realease(void *rdamutex); + +/** + * @brief : delete a mutex + * @param[in] : id of mutex + * @param[out]: + * @return : return ERR or NO_ERR + */ +extern int rda_mutex_delete(void *rdamutex); + +/* Thread */ +/** + * @brief : creat a thread + * @param[in] : thread name/thread function/thread fuction argument/stacksize/thread priority + * @param[out]: + * @return : return thread id + */ +void* rda_thread_new(const char *pcName, void (*thread)(void *arg), void *arg, int stacksize, int priority); + +/** + * @brief : delete a thread + * @param[in] : thread id + * @param[out]: + * @return : return ERR or NO_ERR + */ +int rda_thread_delete(void* id); + +/** + * @brief : get current thread id + * @param[in] : + * @param[out]: + * @return : return thread id + */ +void* rda_thread_get_id(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _RDA_SYS_WRAPPER_H_ */ +#endif diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_dbg.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_dbg.h new file mode 100644 index 0000000000..ce418c023b --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_dbg.h @@ -0,0 +1,60 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 _WLAND_DBG_H_ +#define _WLAND_DBG_H_ +#include +#include "rda5991h_wland.h" +#include "wland_types.h" + +extern int wland_dbg_dump; +extern int wland_dbg_level; + +#define RDA_WLAND_DBG + +#ifdef RDA_WLAND_DBG +#define WLAND_DBG(level, fmt, ...) do {\ + int dbg_level = D_##level##_LEVEL;\ + if((dbg_level <= wland_dbg_level)){\ + printf("%s,"fmt, __func__, ##__VA_ARGS__);\ + } \ + } while (0) + +//if frmae_len is zero, get len from frame header +static inline void wland_dump_frame(const char* msg, u8 *data, u32 frame_len) +{ + + u32 len,i; + + if(wland_dbg_dump == 1) { + if(frame_len != 0) { + len = frame_len; + } else { + len = data[0] | ((data[1]&0x0f) << 8); + } + printf("%s : ",msg); + for(i=0; i= 4) { + wait_busy_down_4(); + } else { + wait_busy_down_2(); + } +} + +static void spi_write_reset(void) +{ + if (rda_ccfg_hwver() >= 4) { + spi_write_reset_4(); + } else { + spi_write_reset_2(); + } +} + +static void spi_wip_reset(void) +{ + if (rda_ccfg_hwver() >= 4) { + spi_wip_reset_4(); + } else { + spi_wip_reset_2(); + } +} + +static inline void spi_flash_enable_cache(void) +{ + unsigned int func = spi_flash_cfg_cache_addr; + if (rda_ccfg_hwver() >= 4) { + func = spi_flash_cfg_cache_addr_4; + } + ((void(*)(void))func)(); +} + +static inline void spi_flash_disable_cache(void) +{ + unsigned int func = spi_flash_disable_cache_addr; + if (rda_ccfg_hwver() >= 4) { + func = spi_flash_disable_cache_addr_4; + } + ((void(*)(void))func)(); +} + +static inline void spi_flash_flush_cache(void) +{ + unsigned int func = spi_flash_flush_cache_addr; + if (rda_ccfg_hwver() >= 4) { + func = spi_flash_flush_cache_addr_4; + } + ((void(*)(void))func)(); +} + +static inline void rda5981_spi_flash_erase_4KB_sector(u32 addr) +{ + unsigned int func = spi_flash_erase_4KB_sector_addr; + if (rda_ccfg_hwver() >= 4) { + func = spi_flash_erase_4KB_sector_addr_4; + } + ((void(*)(u32))func)(addr); +} + +static inline void RDA5991H_ERASE_FLASH(void *addr, u32 len) +{ + unsigned int func = FLASH_ERASE_FUN_ADDR; + if (rda_ccfg_hwver() >= 4) { + func = FLASH_ERASE_FUN_ADDR_4; + } + ((void(*)(void *, u32))func)(addr, len); +} + +static inline void RDA5991H_WRITE_FLASH(u32 addr, u8 *data, u32 len) +{ + unsigned int func = FLASH_WRITE_FUN_ADDR; + if (rda_ccfg_hwver() >= 4) { + func = FLASH_WRITE_FUN_ADDR_4; + } + ((void(*)(u32, u8 *, u32))func)(addr, data, len); +} + +static inline void RDA5991H_READ_FLASH(u32 addr, u8 *buf, u32 len) +{ + unsigned int func = FLASH_READ_FUN_ADDR; + if (rda_ccfg_hwver() >= 4) { + func = FLASH_READ_FUN_ADDR_4; + } + ((void(*)(u32, u8 *, u32))func)(addr, buf, len); +} + +static inline void SPI_FLASH_READ_DATA_FOR_MBED(void *addr, void *buf, u32 len) +{ + unsigned int func = SPI_FLASH_READ_DATA_FOR_MBED_ADDR; + if (rda_ccfg_hwver() >= 4) { + func = SPI_FLASH_READ_DATA_FOR_MBED_ADDR_4; + } + ((void(*)(void *, void *, u32))func)(buf, addr, len); +} + +#endif /*_WLAND_FLASH_H_*/ + diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_flash_wp.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_flash_wp.h new file mode 100644 index 0000000000..40ee40ee59 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_flash_wp.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 _WLAND_FLASH_WP_H_ +#define _WLAND_FLASH_WP_H_ + +#ifdef __cplusplus +extern "C" { +#endif +extern void flash_wrtie_protect_all(); +extern void flash_wrtie_protect_none(); +extern void flash_wrtie_protect(unsigned int offset); +extern void rda5981_flash_init(); +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_ota.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_ota.h new file mode 100644 index 0000000000..57b9052871 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_ota.h @@ -0,0 +1,39 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 _WLAND_OTA_H_ +#define _WLAND_OTA_H_ +#include "wland_types.h" +#include "rda_ccfg_api.h" + +extern u32 flash_size; + +#define CRC32_TABLE_ADDR 0xbb5c +#define CRC32_ADDR 0x8dff//u32 crc32(const u8 *p, size_t len) + +#define CRC32_TABLE_ADDR_4 0xbbd8 +#define CRC32_ADDR_4 0x8e33//u32 crc32(const u8 *p, size_t len) + +static inline unsigned int bootrom_crc32(unsigned char *p, unsigned int len) +{ + unsigned int func = CRC32_ADDR; + if (rda_ccfg_hwver() >= 4) { + func = CRC32_ADDR_4; + } + return ((unsigned int(*)(unsigned char *, unsigned int))func)(p, len); +} + +#endif /*_WLAND_OTA_H_*/ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_rf.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_rf.h new file mode 100644 index 0000000000..6a9ebebc98 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_rf.h @@ -0,0 +1,41 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 _WLAND_RF_H_ +#define _WLAND_RF_H_ + +#include "wland_types.h" + +#define WLAND_TXP_NUM 2 +#define WLAND_CHANNEL_NUM 14 +#define WLAND_TX_POWER_PHY_GN_REG 0x11F +#define WLAND_TX_POWER_PHY_B_REG 0x120 +#define WLAND_TX_POWER_RF_REG 0x8A +#define WLAND_XTAL_CAL_REG 0xDA + +#define MAKE_WORD16(lsb, msb) (((u16)(msb) << 8) & 0xFF00) | (lsb) +#define MAKE_WORD32(lsw, msw) (((u32)(msw) << 16) & 0xFFFF0000) | (lsw) + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_types.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_types.h new file mode 100644 index 0000000000..3cb0e7e9e6 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/wland_types.h @@ -0,0 +1,86 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +/*****************************************************************************/ +/* */ +/* File Name : wland_types.h */ +/* */ +/* Description : This file contains all the data type definitions for */ +/* MAC implementation. */ +/* */ +/*****************************************************************************/ + +#ifndef WLAND_TYPES_H +#define WLAND_TYPES_H + +/*****************************************************************************/ +/* Constants Definitions */ +/*****************************************************************************/ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; +typedef signed char s8; +typedef signed short s16; +typedef signed int s32; +typedef signed long long s64; + +typedef unsigned int size_t; + +/** Indicates Bit Value of BITx */ +#ifndef BIT +#define BIT(x) (1ul << (x)) + +/*****************************************************************************/ +/* Constant Definitions */ +/*****************************************************************************/ + +#define BIT0 (1ul << 0) +#define BIT1 (1ul << 1) +#define BIT2 (1ul << 2) +#define BIT3 (1ul << 3) +#define BIT4 (1ul << 4) +#define BIT5 (1ul << 5) +#define BIT6 (1ul << 6) +#define BIT7 (1ul << 7) +#define BIT8 (1ul << 8) +#define BIT9 (1ul << 9) +#define BIT10 (1ul << 10) +#define BIT11 (1ul << 11) +#define BIT12 (1ul << 12) +#define BIT13 (1ul << 13) +#define BIT14 (1ul << 14) +#define BIT15 (1ul << 15) +#define BIT16 (1ul << 16) +#define BIT17 (1ul << 17) +#define BIT18 (1ul << 18) +#define BIT19 (1ul << 19) +#define BIT20 (1ul << 20) +#define BIT21 (1ul << 21) +#define BIT22 (1ul << 22) +#define BIT23 (1ul << 23) +#define BIT24 (1ul << 24) +#define BIT25 (1ul << 25) +#define BIT26 (1ul << 26) +#define BIT27 (1ul << 27) +#define BIT28 (1ul << 28) +#define BIT29 (1ul << 29) +#define BIT30 (1ul << 30) +#define BIT31 (1ul << 31) +#endif + +#endif /* WLAND_TYPES_H */ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt new file mode 100644 index 0000000000..24e25298db --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/LICENSE-permissive-binary-license-1.0.txt @@ -0,0 +1,49 @@ +Permissive Binary License + +Version 1.0, January 2019 + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +1) Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. + +2) Unless to the extent explicitly permitted by law, no reverse + engineering, decompilation, or disassembly of this software is + permitted. + +3) Redistribution as part of a software development kit must include the + accompanying file named “DEPENDENCIES” and any dependencies listed in + that file. + +4) 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. + +Limited patent license. The copyright holders (and contributors) grant a +worldwide, non-exclusive, no-charge, royalty-free patent license to +make, have made, use, offer to sell, sell, import, and otherwise +transfer this software, where such license applies only to those patent +claims licensable by the copyright holders (and contributors) that are +necessarily infringed by this software. This patent license shall not +apply to any combinations that include this software. No hardware is +licensed hereunder. + +If you institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the software +itself infringes your patent(s), then your rights granted under this +license shall terminate as of the date such litigation is filed. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS." 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 +HOLDERS 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. \ No newline at end of file diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/README.md b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/README.md new file mode 100644 index 0000000000..5df1aa37df --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/README.md @@ -0,0 +1,7 @@ +This directory tree contains binaries build from RDA SDK modified for Mbed OS and released under Permissive Binary License. + +libhal files in the subfolders are generated with toolchains: + +Arm Compiler 5 - version 5.06u6 +GNU Arm Embedded - version 6.3.1 +IAR EWARM - version 8.32.2.178 \ No newline at end of file diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar new file mode 100644 index 0000000000000000000000000000000000000000..3c5307cd7741140c9fd2ae603bc99d2991e7950c GIT binary patch literal 2534620 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

yi&a%FqJp2RpI4wE*jHf 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 t%fuoRxK#IKR?wamVmKi5k9b&NOV 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�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

D;Zhff*q5H}IWQogOt0e=QyUS~~o- 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≦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�%`!UL0L6gih0{EI6S1bD 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.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
MBK7i9q#^Gqxr4yTG9X&s{|NVb+?Rk0cfR^R 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�^h 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
=HQ!hHXKm**#8TylRaF@e2 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 LV|%3nDRKV~F(z$S literal 0 HcmV?d00001 diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a new file mode 100644 index 0000000000000000000000000000000000000000..58685c856246a6029506f555ed49ba3af72435d3 GIT binary patch literal 1179022 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≀samc3a?U^~ujufZv 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 G^#29*@Uw*g literal 0 HcmV?d00001 diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c new file mode 100644 index 0000000000..bd31ff81d2 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c @@ -0,0 +1,275 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +/****************************************************************************** + * @file : maclib_task.c + * @brief : WiFi MACLib task source file + * @version: V1.0 + * @date : 6. May 2017 + * + * @note + * + ******************************************************************************/ +#include +#include +#include + +#include "mbed_interface.h" +#include "cmsis_os.h" +#include "csl_mbed.h" +#include "maclib_task.h" +#include "rda5991h_wland.h" + +#include "lwip/pbuf.h" +#include "lwip/sys.h" + +/** + * Macros + */ +#define MACLIB_TASK_DEBUG (0) + +/** + * Variables + */ +static int maclib_task_run = 0; +static sys_mbox_t maclib_mbox; +static int g_event_num = 0; +static int g_event_proc_done = 1; +static sys_sem_t g_maclib_sem_sleep; +static int g_maclib_sleep_flag = 0; + +extern maclib_func_t *maclib_func_p; + +extern void rda_critical_sec_start(void); +extern void rda_critical_sec_end(void); +extern void wland_set_sta_sleep(unsigned char is_sleep); + +#define MAX_MSG_POOL_NUM (64) +maclib_msg_t msg_str_pool[MAX_MSG_POOL_NUM]; +int msg_str_pool_inited = 0; + +void init_msg_str_pool(void) +{ + int idx; + for(idx = 0; idx < MAX_MSG_POOL_NUM; idx++) { + msg_str_pool[idx].is_free = 1; + } +} + +maclib_msg_t *alloc_msg_str(void) +{ + int idx; + maclib_msg_t *ret = NULL; + rda_critical_sec_start(); + if (0 == msg_str_pool_inited) { + init_msg_str_pool(); + msg_str_pool_inited = 1; + } + rda_critical_sec_end(); + for (idx = 0; idx < MAX_MSG_POOL_NUM; idx++) { + rda_critical_sec_start(); + ret = &msg_str_pool[idx]; + if (1 == ret->is_free) { + ret->is_free = 0; + rda_critical_sec_end(); + break; + } + rda_critical_sec_end(); + } + return ret; +} + +void free_msg_str(maclib_msg_t *p_msg) +{ + rda_critical_sec_start(); + p_msg->is_free = 1; + rda_critical_sec_end(); +} + +/** + * Functions + */ +/* maybe called in isr, should not use "printf", "malloc" */ +void mbed_event_handle_cb(unsigned int event) +{ + MACLIB_EVENT_HANDLE_T type = (MACLIB_EVENT_HANDLE_T)event; + if ((maclib_task_run == 0) && (MACLIB_EVENT_CLEANUP != type)) { + mbed_error_printf("evntHndlCb_nulldata\r\n"); + return; + } + switch(type) { + case MACLIB_EVENT_PEND: + rda_critical_sec_start(); + g_event_num++; + if((1 == g_event_num) && (1 == g_event_proc_done)) { + maclib_msg_t *msg; +#if MACLIB_TASK_DEBUG + mbed_error_printf("#1-1,%d(%08X)\r\n", g_event_num, __get_xPSR()); +#endif + msg = alloc_msg_str(); + if(NULL == msg) { + mbed_error_printf("malloc err\r\n"); + return; + } + msg->type = MACLIB_MSG_EVNT_HNDL; + msg->msg = NULL; + sys_mbox_trypost(&(maclib_mbox), msg); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#1-2\r\n"); +#endif + } + rda_critical_sec_end(); + break; + case MACLIB_EVENT_PROCESS: +#if 1 + rda_critical_sec_start(); + g_event_num--; + if(0 > g_event_num) { + mbed_error_printf("event handle err\r\n"); + g_event_num = 0; + } + rda_critical_sec_end(); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#3,%d\r\n",g_event_num); +#endif +#endif + break; + case MACLIB_EVENT_CLEANUP: +#if MACLIB_TASK_DEBUG + mbed_error_printf("event cleanup\r\n"); +#endif + rda_critical_sec_start(); + g_event_num = 0; + rda_critical_sec_end(); + break; + default: + break; + } +} + +void mbed_mltask_sleep_cb(void) +{ + g_maclib_sleep_flag = 1; + sys_arch_sem_wait(&g_maclib_sem_sleep, 0); +} + +void mbed_mltask_wakeup_cb(void) +{ + rda_critical_sec_start(); + if (1 == g_maclib_sleep_flag) { + g_maclib_sleep_flag = 0; + sys_sem_signal(&g_maclib_sem_sleep); + } + rda_critical_sec_end(); +} + +void maclib_check_status(void) +{ + rda_critical_sec_start(); + if (1 == g_maclib_sleep_flag) { + if(*((unsigned int *)0x40020580U) & (0x01UL << 2)) { + mbed_mltask_wakeup_cb(); + } + } + rda_critical_sec_end(); +} + +int maclib_is_sleep_allowed(void) +{ + return g_maclib_sleep_flag; +} + +void maclib_task(void *pvParameters) +{ + int ret; +#if 0 + sleep_entry_t maclib_sleep_entry = { + wland_set_sta_sleep, + maclib_is_sleep_allowed, + maclib_check_status + }; +#endif + sys_sem_new(&g_maclib_sem_sleep, 0); + //sleep_entry_register(&maclib_sleep_entry); + + ret = sys_mbox_new(&(maclib_mbox), 8); + if(0 != ret) { + LWIP_DEBUGF(NETIF_DEBUG,"msgbox init err!\r\n"); + goto mac_lib_err; + } +#if MACLIB_TASK_DEBUG + LWIP_DEBUGF(NETIF_DEBUG,"#mbox new\r\n"); +#endif + maclib_task_run = 1; + while(1) { + int mem_free = 1; + maclib_msg_t *msg = NULL; + unsigned int time = sys_arch_mbox_fetch(&(maclib_mbox), (void **)&msg, 0); + if ((SYS_ARCH_TIMEOUT == time) || (NULL == msg)) { + LWIP_DEBUGF(NETIF_DEBUG, "ml_task: invalid msg\r\n"); + continue; + } + switch(msg->type) { + case MACLIB_MSG_EVNT_HNDL: { + rda_critical_sec_start(); + g_event_proc_done = 0; + rda_critical_sec_end(); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#get event %d\r\n", g_event_num); +#endif + maclib_func_p->ml_tasklet(); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#5\r\n"); +#endif + rda_critical_sec_start(); +#if 0 + g_event_num--; + if(0 > g_event_num) { + mbed_error_printf("event handle err\r\n"); + } else +#endif + g_event_proc_done = 1; + if(0 < g_event_num) { +#if MACLIB_TASK_DEBUG + mbed_error_printf("#2-1\r\n"); +#endif + sys_mbox_trypost(&(maclib_mbox), msg); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#2-2\r\n"); +#endif + mem_free = 0; + } + rda_critical_sec_end(); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#pDone\r\n"); +#endif + break; + } + default: + break; + } + if (mem_free) { + free_msg_str(msg); +#if MACLIB_TASK_DEBUG + mbed_error_printf("#4\r\n"); +#endif + } + } + +mac_lib_err: + LWIP_DEBUGF(NETIF_DEBUG,"MACLib exit!\r\n"); + osDelay(osWaitForever); +} diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c new file mode 100644 index 0000000000..4c6febce9d --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c @@ -0,0 +1,509 @@ +/* Copyright (c) 2019 ARM Limited + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +/****************************************************************************** + * @file rda5991h_wland.c + * @brief RDA5991H wlan driver for LWIP + * @version: V1.0 + * @date: 25. July 2016 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#include "lwip/opt.h" +#include "lwip/sys.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "lwip/tcpip.h" +#include "netif/etharp.h" +#include "sys_arch.h" +#include "rda5991h_wland.h" +#include "cmsis.h" +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) +#include "entropy_poll.h" +#else +#include "trng_api.h" +#endif +#include "gpio_api.h" +#include "gpio_irq_api.h" +#include "maclib_task.h" +#include "rda_sys_wrapper.h" +#include +#include +#include +#include + +/* Global variables */ +rda_enetdata_t r91h_wifidata; + +int wland_dbg_dump = WLAND_DBG_DUMP; +int wland_dbg_level = WLAND_DBG_LEVEL; +int wpa_dbg_dump = WPA_DBG_DUMP; +int wpa_dbg_level = WPA_DBG_LEBEL; +int wlandlib_dbg_level = WLANDLIB_DBG_LEVEL; +int hut_dbg_dump = HUT_DBG_DUMP; + +//#define CONFIG_DISABLE_ALL_INT +#define CRI_SEC_START_PRI_LEVEL 0xF8 +#define CRI_SEC_END_PRI_LEVEL 0x00 +static unsigned int g_critical_sec_counter = 0U; +#if defined(CONFIG_DISABLE_ALL_INT) +static unsigned int g_critical_ctxt_saved = 0U; +#endif /* CONFIG_DISABLE_ALL_INT */ +void *packet_rx_queue; + +/* Function statements */ +void r91h_wifiif_input(struct netif *netif, u8_t *data, u32_t len, int idx); +void mbed_mac_address(char *mac); + +/** \brief Driver transmit and receive thread priorities + * + * Thread priorities for receive thread and TX cleanup thread. Alter + * to prioritize receive or transmit bandwidth. In a heavily loaded + * system or with LEIP_DEBUG enabled, the priorities might be better + * the same. */ +#define RX_PRIORITY (osPriorityNormal) +#define TX_PRIORITY (osPriorityNormal) +#define PHY_PRIORITY (osPriorityNormal) + +void rda_netif_down(int netif) +{ + if (netif == 0) { + netif_set_down(r91h_wifidata.netif_sta); + } else { + netif_set_down(r91h_wifidata.netif_ap); + } +} + +void rda_netif_link_down(int netif) +{ + rda_msg msg; + msg.type = 1; + msg.arg1 = 0; + rda_mail_put(packet_rx_queue, (void*)&msg, osWaitForever); +} + +void rda_netif_up(int netif) +{ + if (netif == 0) { + netif_set_up(r91h_wifidata.netif_sta); + } else { + netif_set_up(r91h_wifidata.netif_ap); + } +} + +void rda_netif_link_up(int netif) +{ + rda_msg msg; + msg.type = 1; + msg.arg1 = 1; + rda_mail_put(packet_rx_queue, (void*)&msg, osWaitForever); + return; +} + +void rda_netif_input(u8_t *data, u32_t len, int idx, int netif) +{ + if (netif == 0) { + r91h_wifiif_input(r91h_wifidata.netif_sta, data, len, idx++); + } else { + r91h_wifiif_input(r91h_wifidata.netif_ap, data, len, idx++); + } +} + +void rda_get_macaddr(u8_t *macaddr, int mode) +{ + mbed_mac_address((char *)macaddr); + if (mode == 1) { + if(macaddr[0] & 0x04) { + macaddr[0] &= 0xFB; + } else { + macaddr[0] |= 0x04; + } + } + return; +} + +void rda_critical_sec_start(void) +{ + if (__get_IPSR() == 0U) { + if (0U == g_critical_sec_counter) { +#if defined(CONFIG_DISABLE_ALL_INT) + g_critical_ctxt_saved = __disable_irq(); +#else /* CONFIG_DISABLE_ALL_INT */ + __set_BASEPRI(CRI_SEC_START_PRI_LEVEL); +#endif /* CONFIG_DISABLE_ALL_INT */ + } + g_critical_sec_counter++; + } +} + +void rda_critical_sec_end(void) +{ + if (__get_IPSR() == 0U) { + g_critical_sec_counter--; + if (0U == g_critical_sec_counter) { +#if defined(CONFIG_DISABLE_ALL_INT) + __set_PRIMASK(g_critical_ctxt_saved); +#else /* CONFIG_DISABLE_ALL_INT */ + __set_BASEPRI(CRI_SEC_END_PRI_LEVEL); +#endif /* CONFIG_DISABLE_ALL_INT */ + } + } +} + +void * rda_create_interrupt(unsigned int vec, unsigned int pri, void *isr) +{ + NVIC_SetPriority((IRQn_Type)vec, (uint32_t) pri); + NVIC_SetVector((IRQn_Type)vec, (uint32_t) isr); + + return NULL; +} + +void rda_delete_interrupt(unsigned int vec) +{ + NVIC_SetVector((IRQn_Type)vec, 0); +} + +void rda_enable_interrupt(unsigned int vec) +{ + NVIC_EnableIRQ((IRQn_Type)vec); +} + +void rda_disable_interrupt(unsigned int vec) +{ + NVIC_DisableIRQ((IRQn_Type)vec); +} + +/** \brief Allocates a pbuf and returns the data from the incoming packet. + * + * \param[in] netif the lwip network interface structure + * \param[in] idx index of packet to be read + * \return a pbuf filled with the received packet (including MAC header) + */ +static struct pbuf *r91h_low_level_input(struct netif *netif, u8_t *data, u32_t len, int idx) +{ + struct pbuf *p, *q; + u16_t index = 0; + + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input enter, rxlen:%d\n", len)); + + /* Obtain the size of the packet and put it into the "len" + variable. */ + if(!len) { + return NULL; + } + +#if ETH_PAD_SIZE + len += ETH_PAD_SIZE; /* allow room for Ethernet padding */ +#endif + + /* We allocate a pbuf chain of pbufs from the pool. */ + p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); + + if (p != NULL) { + +#if ETH_PAD_SIZE + pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */ +#endif + + /* We iterate over the pbuf chain until we have read the entire + * packet into the pbuf. */ + for (q = p; q != NULL; q = q->next) { + /* Read enough bytes to fill this pbuf in the chain. The + * available data in the pbuf is given by the q->len + * variable. + * This does not necessarily have to be a memcpy, you can also preallocate + * pbufs for a DMA-enabled MAC and after receiving truncate it to the + * actually received size. In this case, ensure the tot_len member of the + * pbuf is the sum of the chained pbuf len members. + */ + /* load rx data from 96 to local mem_pool */ + MEMCPY(q->payload, &data[index], q->len); + index += q->len; + + if (index >= len) { + break; + } + } + +#if ETH_PAD_SIZE + pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */ +#endif + + LINK_STATS_INC(link.recv); + } else { + /* Drop this packet */ + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input pbuf_alloc fail, rxlen:%d\n", len)); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + + return NULL; + } + + return p; +} + +/** \brief Attempt to read a packet from the EMAC interface. + * + * \param[in] netif the lwip network interface structure + * \param[in] idx index of packet to be read + */ +void *data_sem = NULL; +void r91h_wifiif_input(struct netif *netif, u8_t *data, u32_t len, int idx) +{ + if(data_sem == NULL) + data_sem = rda_sem_create(0); + rda_msg msg; + msg.type = 0; + msg.arg1 = (int)data; + msg.arg2 = len; + msg.arg3 = (int)data_sem; + rda_mail_put(packet_rx_queue, (void*)&msg, osWaitForever); + rda_sem_wait(data_sem, osWaitForever); + return; +} + +/** \brief Low level init of the MAC and PHY. + * + * \param[in] netif Pointer to LWIP netif structure + */ + +static err_t low_level_init(struct netif *netif) +{ + static int init_flag = 0; + if (init_flag == 0) { + wland_reg_func(); + init_flag = 1; + } + return ERR_OK; +} + +/** + * This function is the ethernet packet send function. It calls + * etharp_output after checking link status. + * + * \param[in] netif the lwip network interface structure for this enetif + * \param[in] q Pointer to pbug to send + * \param[in] ipaddr IP address + * \return ERR_OK or error code + */ +err_t rda91h_etharp_output(struct netif *netif, struct pbuf *q, const ip_addr_t *ipaddr) +{ + /* Only send packet is link is up */ + if (netif->flags & NETIF_FLAG_LINK_UP) + return etharp_output(netif, q, ipaddr); + + return ERR_CONN; +} + +/** \brief Low level output of a packet. Never call this from an + * interrupt context, as it may block until TX descriptors + * become available. + * + * \param[in] netif the lwip network interface structure for this netif + * \param[in] p the MAC packet to send (e.g. IP packet including MAC addresses and type) + * \return ERR_OK if the packet could be sent or an err_t value if the packet couldn't be sent + */ +static err_t rda91h_low_level_output(struct netif *netif, struct pbuf *p) +{ + struct pbuf *q; + + /* rda5996 initiate transfer */ + u32_t actual_txlen = 0; + u8_t **data; + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output enter, p:%08x\n", p)); + +#if ETH_PAD_SIZE + pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */ +#endif + + data = (void*)wland_get_databuf(); + + if(data == NULL){ + LWIP_DEBUGF(NETIF_DEBUG, ("rda91h_low_level_output, no PKT buf\r\n")); + return ERR_BUF; + } + + for(q = p; q != NULL; q = q->next) + { + /* Send the data from the pbuf to the interface, one pbuf at a + time. The size of the data in each pbuf is kept in the ->len + variable. */ + MEMCPY(&((*data)[actual_txlen+2]), q->payload, q->len);//reserve wid header length + actual_txlen += q->len; + if(actual_txlen > 1514 || actual_txlen > p->tot_len) + { + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output err, actual_txlen:%d, tot_len%d\n", + actual_txlen, p->tot_len)); + return ERR_BUF; + } + } + + /* Signal rda5996 that packet should be sent */ + if(actual_txlen == p->tot_len) + { + if(netif->name[0] == 's' && netif->name[1] == 't') { + wland_txip_data((void*)data, actual_txlen, 0); + } else if(netif->name[0] == 'a' && netif->name[1] == 'p') { + wland_txip_data((void*)data, actual_txlen, 1); + } + +#if ETH_PAD_SIZE + pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */ +#endif + + LINK_STATS_INC(link.xmit); + + return ERR_OK; + } + + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output pkt len mismatch, actual_txlen:%d, tot_len%d\n", + actual_txlen, p->tot_len)); + + + return ERR_BUF; +} + +/** + * Should be called at the beginning of the program to set up the + * network interface. + * + * This function should be passed as a parameter to netif_add(). + * + * @param[in] netif the lwip network interface structure for this netif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data couldn't be allocated + * any other err_t on error + */ +err_t wifi_arch_enetif_init(struct netif *netif) +{ + err_t err; + static int thread_init_flag = 0; + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + if (*((int *)netif->state) == 0) { + r91h_wifidata.netif_sta = netif; + netif->name[0] = 's'; + netif->name[1] = 't'; +#if LWIP_NETIF_HOSTNAME + /* Initialize interface hostname */ + if(netif->hostname == NULL) + netif->hostname = "lwipr91h_sta"; +#endif /* LWIP_NETIF_HOSTNAME */ + rda_get_macaddr((u8_t *)(netif->hwaddr), 0); + } else if(*((int *)netif->state) == 1) { + r91h_wifidata.netif_ap = netif; + netif->name[0] = 'a'; + netif->name[1] = 'p'; +#if LWIP_NETIF_HOSTNAME + /* Initialize interface hostname */ + if(netif->hostname == NULL) + netif->hostname = "lwipr91h_ap"; +#endif /* LWIP_NETIF_HOSTNAME */ + rda_get_macaddr((u8_t *)(netif->hwaddr), 1); + } + + netif->hwaddr_len = ETHARP_HWADDR_LEN; + + /* maximum transfer unit */ + netif->mtu = 1500; + + /* device capabilities */ + // TODOETH: check if the flags are correct below + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP; + + /* Initialize the hardware */ + netif->state = &r91h_wifidata; + err = low_level_init(netif); + if (err != ERR_OK) + return err; + + netif->output = rda91h_etharp_output; + netif->linkoutput = rda91h_low_level_output; + if(thread_init_flag == 0){ + /* PHY monitoring task */ + sys_thread_new("maclib_thread", maclib_task, netif->state, DEFAULT_THREAD_STACKSIZE*8, PHY_PRIORITY); + sys_thread_new("wland_thread", wland_task, NULL, DEFAULT_THREAD_STACKSIZE*5, PHY_PRIORITY); + /* Allow the PHY task to detect the initial link state and set up the proper flags */ + osDelay(10); + thread_init_flag = 1; + } + return ERR_OK; +} + +unsigned char rda_mac_addr[6] = "\0"; +static int is_available_mac_addr(unsigned char *mac_addr) +{ + if (mac_addr[0]==0 && mac_addr[1]==0 && mac_addr[2]==0 && + mac_addr[3]==0 && mac_addr[4]==0 && mac_addr[5]==0) + return 0; + if (mac_addr[0]&0x1) + return 0; + return 1; +} +static void rda_get_macaddr_from_flash(unsigned char *macaddr) +{ + int ret; + if (!mac_is_valid((char *)rda_mac_addr)) { + ret = rda5981_flash_read_mac_addr(rda_mac_addr); + if ((ret!=0) || (is_available_mac_addr(rda_mac_addr)==0)) { +#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) + unsigned int out_len; + ret = mbedtls_hardware_poll(NULL, rda_mac_addr, 6, &out_len); + if (6 != out_len) { + LWIP_DEBUGF(NETIF_DEBUG, ("out_len err:%d\n", out_len)); + } +#else + ret = rda_trng_get_bytes(rda_mac_addr, 6); +#endif + rda_mac_addr[0] &= 0xfe; /* clear multicast bit */ + rda_mac_addr[0] |= 0x02; /* set local assignment bit (IEEE802) */ + rda5981_flash_write_mac_addr(rda_mac_addr); + } + } + memcpy(macaddr, rda_mac_addr, 6); +} +void mbed_mac_address(char *mac) +{ + mac[0] = 0xD6; + mac[1] = 0x71; + mac[2] = 0x36; + mac[3] = 0x60; + mac[4] = 0xD8; +#if !MBED_CONF_APP_ECHO_SERVER + mac[5] = 0xF4; +#else + mac[5] = 0xF3; +#endif + return; +} diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda_sys_wrapper.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda_sys_wrapper.c new file mode 100644 index 0000000000..35401ef3fe --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda_sys_wrapper.c @@ -0,0 +1,450 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if 1 +#include "sys_arch.h" +#include "cmsis_os.h" +#include "cmsis_os2.h" +#include "lwip/sys.h" +#include "rtx_lib.h" + +#include +#include +#include "mbed_assert.h" +#define NO_ERR 0 +#define ERR -1 + +//#define RDA_SYS_DEBUG +#ifdef RDA_SYS_DEBUG +#define RDA_SYS_PRINT(fmt, ...) do {\ + printf(fmt, ##__VA_ARGS__);\ + } while (0) +#else +#define RDA_SYS_PRINT(fmt, ...) +#endif + + +/* Alarm */ +// Timer definitions +#define osTimerInvalid 0 +#define osTimerStopped 1 +#define osTimerRunning 2 +#if 0 +// Timer structures, same as os_timer_cb(rt_CMSIS.c) +typedef struct rda_ostmr_cb { + struct rda_ostmr_cb *next; // Pointer to next active Timer + uint8_t state; // Timer State + uint8_t type; // Timer Type (Periodic/One-shot) + uint16_t reserved; // Reserved + uint32_t tcnt; // Timer Delay Count + uint32_t icnt; // Timer Initial Count + void *arg; // Timer Function Argument + const osTimerDef_t *timer; // Pointer to Timer definition +} rda_ostmr_cb_t; +#endif +//#define USING_STDLIB + +#if !defined(USING_STDLIB) +typedef struct rda_tmr_node { + mbed_rtos_storage_timer_t _obj_mem; +} rda_tmr_node_t; + +typedef struct rda_tmr_ctrl { + unsigned char *buff; + unsigned char *state; + unsigned char max_node_num; + unsigned char node_size; + unsigned char node_cntr; + unsigned char last_freed_node_idx; +} rda_tmr_ctrl_t; + +#define MAX_ALARM_NUM (28) +#define WORD_ALIGN(n) (((n) + 0x03UL) & ~0x03UL) +#define MAX_ALARM_STAT_SIZE WORD_ALIGN(MAX_ALARM_NUM >> 3) +#define MAX_ALARM_MEM_SIZE (MAX_ALARM_NUM * WORD_ALIGN(sizeof(mbed_rtos_storage_timer_t)) + MAX_ALARM_STAT_SIZE) + +unsigned long g_alarm_buf[WORD_ALIGN(MAX_ALARM_MEM_SIZE) >> 2] = {0}; +rda_tmr_ctrl_t g_alarm_ctrl = { + (unsigned char *)g_alarm_buf + MAX_ALARM_STAT_SIZE, + (unsigned char *)g_alarm_buf, + MAX_ALARM_NUM, + WORD_ALIGN(sizeof(mbed_rtos_storage_timer_t)), + 0U, + 0U +}; + +__STATIC_INLINE unsigned char get_node_state(unsigned char *buf, unsigned char idx) +{ + unsigned char state, ofst; + ofst = (idx & 0x07U); + buf += (idx >> 3); + state = (*buf >> ofst) & 0x01U; + return state; +} + +__STATIC_INLINE void set_node_state(unsigned char *buf, unsigned char idx, unsigned char state) +{ + unsigned char ofst, tmp; + ofst = (idx & 0x07U); + buf += (idx >> 3); + tmp = *buf & (~(0x01U << ofst)); + *buf = tmp | (((state & 0x01U) << ofst)); +} + +static rda_tmr_node_t *get_tmr_node(void) +{ + rda_tmr_node_t *node = NULL; + unsigned char idx = g_alarm_ctrl.last_freed_node_idx; + if ((idx < g_alarm_ctrl.max_node_num) && (0U == get_node_state(g_alarm_ctrl.state, idx))) { + set_node_state(g_alarm_ctrl.state, idx, 1U); + node = (rda_tmr_node_t *)(g_alarm_ctrl.buff + idx * g_alarm_ctrl.node_size); + g_alarm_ctrl.node_cntr++; + } else { + for (idx = 0U; idx < g_alarm_ctrl.max_node_num; idx++) { + if(0U == get_node_state(g_alarm_ctrl.state, idx)) { + set_node_state(g_alarm_ctrl.state, idx, 1U); + node = (rda_tmr_node_t *)(g_alarm_ctrl.buff + idx * g_alarm_ctrl.node_size); + g_alarm_ctrl.node_cntr++; + break; + } + } + } + return node; +} + +static void put_tmr_node(rda_tmr_node_t *node) +{ + unsigned char *node_buf = (unsigned char *)node; + unsigned char idx = (node_buf - g_alarm_ctrl.buff) / g_alarm_ctrl.node_size; + if ((node_buf > g_alarm_ctrl.buff) && (idx < g_alarm_ctrl.max_node_num) && + (1U == get_node_state(g_alarm_ctrl.state, idx))) { + set_node_state(g_alarm_ctrl.state, idx, 0U); + g_alarm_ctrl.node_cntr--; + g_alarm_ctrl.last_freed_node_idx = idx; + } +} +#endif /* !USING_STDLIB */ + +/** + * @brief : get current time in units of micro second + * @param[in] : + * @param[out]: + * @return : return time value with uint32 type + */ +unsigned long rda_get_cur_time_ms(void) +{ + return sys_now(); +} + +/** + * @brief : create an alarm with given function, return timer handle + * @param[in] : func(callback)/data(pass to func)/mode(once or periodic) + * @param[out]: + * @return : return timer handle, a pointer to the timer structure, non-zero is valid + */ +void * rda_alarm_create_v2(void *func, unsigned int data, unsigned int mode) +{ + osTimerId_t handle; + mbed_rtos_storage_timer_t* _obj_mem = NULL; + MBED_ASSERT(func != NULL); + osTimerAttr_t attr = { 0 }; +#if defined(USING_STDLIB) + _obj_mem = (mbed_rtos_storage_timer_t*)malloc(sizeof(mbed_rtos_storage_timer_t)); +#else /* USING_STDLIB */ + _obj_mem = (mbed_rtos_storage_timer_t*)get_tmr_node(); +#endif /* USING_STDLIB */ + MBED_ASSERT(_obj_mem != NULL); + memset(_obj_mem, 0, sizeof(_obj_mem)); + attr.cb_mem = _obj_mem; + attr.cb_size = sizeof(mbed_rtos_storage_timer_t); + //printf("hehehehe fun %p\r\n", func); + handle = osTimerNew((osTimerFunc_t)func, mode, (void *)data, &attr); + //printf("time cb %p handle %p\r\n", _obj_mem, handle); + MBED_ASSERT(handle != NULL); + return handle; +} + +void * rda_alarm_create(void *func, unsigned int data) +{ + return rda_alarm_create_v2(func, data, osTimerOnce); +} + +/** + * @brief : delete an alarm with given handle, then reset the handle + * @param[in] : *handle(pointer to the timer structure) + * @param[out]: **handle(address of the handle variable) + * @return : + */ +int rda_alarm_delete(void **handle) +{ + if (NULL != *handle) { + osTimerId timer_id = (osTimerId)(*handle); + osStatus retval = osTimerDelete(timer_id); + if (osOK == retval) { +#if defined(USING_STDLIB) + free(timer_id); +#else /* USING_STDLIB */ + put_tmr_node((rda_tmr_node_t *)timer_id); +#endif /* USING_STDLIB */ + *handle = NULL; + } else { + RDA_SYS_PRINT("Delete alarm error: %d\r\n", retval); + return ERR; + } + return NO_ERR; + } + return ERR; +} + +/** + * @brief : start an alarm, raise a function call after given timeout delay + * @param[in] : handle(pointer to the timer structure)/timeout(micro second) + * @param[out]: + * @return : + */ +int rda_alarm_start(void *handle, unsigned int timeout_ms) +{ + if (NULL != handle) { + osTimerId timer_id = (osTimerId)handle; + osStatus retval = osTimerStart(timer_id, (uint32_t)timeout_ms); + if (osOK != retval) { + RDA_SYS_PRINT("Start alarm error: %d\r\n", retval); + return ERR; + } + return NO_ERR; + } + return ERR; +} + +/** + * @brief : stop an alarm, will not raise a function call any more + * @param[in] : handle(pointer to the timer structure) + * @param[out]: + * @return : + */ +int rda_alarm_stop(void *handle) +{ + if (NULL != handle) { + osTimerId timer_id = (osTimerId)handle; + osStatus retval = osTimerStop(timer_id); + if (osOK != retval) { + RDA_SYS_PRINT("Stop alarm error: %d\r\n", retval); + return ERR; + } + return NO_ERR; + } + return ERR; +} + + + +/* Semaphore */ +void* rda_sem_create(unsigned int count) +{ + osSemaphoreId_t sem; + mbed_rtos_storage_semaphore_t *_obj_mem = (mbed_rtos_storage_semaphore_t*)malloc(sizeof(mbed_rtos_storage_semaphore_t)); + osSemaphoreAttr_t attr = { 0 }; + attr.name = "rda_unnamed_sem"; + attr.cb_mem = _obj_mem; + attr.cb_size = sizeof(mbed_rtos_storage_semaphore_t); + sem = osSemaphoreNew(1, count, &attr); + MBED_ASSERT(sem != NULL); + + return (void*)sem; +} + +int rda_sem_wait(void* sem, unsigned int millisec) +{ + int res; + + res = osSemaphoreWait(sem, millisec); + if (res > 0) { + return NO_ERR; + } else { + RDA_SYS_PRINT("rda_sem_wait error %d\r\n", res); + return ERR; + } +} + +int rda_sem_release(void *sem) +{ + int res; + + res = osSemaphoreRelease(sem); + if (res == 0) { + return NO_ERR; + } else { + RDA_SYS_PRINT("rda_sem_release error %d\r\n", res); + return ERR; + } +} + +int rda_sem_delete(void *sem) +{ + int res; + + res = osSemaphoreDelete(sem); + free(sem); + if (res == 0) { + return NO_ERR; + } else { + RDA_SYS_PRINT("rda_sem_delete error %d\r\n", res); + return ERR; + } +} + +/* Mail */ +void* rda_mail_create(unsigned int msgcnt, unsigned int msgsize) +{ + unsigned int mq_size = msgcnt * (msgsize + sizeof(os_message_t)); + osMessageQueueId_t msgq; + mbed_rtos_storage_msg_queue_t *_obj_mem = (mbed_rtos_storage_msg_queue_t*)malloc(sizeof(mbed_rtos_storage_msg_queue_t)); + MBED_ASSERT(_obj_mem != NULL); + memset(_obj_mem, 0, sizeof(mbed_rtos_storage_msg_queue_t)); + void *_mq_mem = (void *)malloc(mq_size); + MBED_ASSERT(_mq_mem != NULL); + memset(_mq_mem, 0, mq_size); + osMessageQueueAttr_t attr = { 0 }; + attr.name = "rda_unnamed_message_queue"; + attr.cb_mem = _obj_mem; + attr.cb_size = sizeof(mbed_rtos_storage_msg_queue_t); + attr.mq_mem = _mq_mem; + attr.mq_size = mq_size; + msgq = osMessageQueueNew(msgcnt, msgsize, &attr); + MBED_ASSERT(msgq != NULL); + + return (void*)msgq; +} + +int rda_mail_get(void *msgq, void *msg, unsigned int wait) +{ + int ret; + ret = osMessageQueueGet(msgq, msg, 0, wait); + return ret; +} + +int rda_mail_put(void *msgq, void *msg, unsigned int wait) +{ + int ret; + ret = osMessageQueuePut(msgq, msg, 0, wait); + return ret; +} + +/* Mutex */ +void* rda_mutex_create(void) +{ + osMutexId_t rdamutex; + osMutexAttr_t attr = { 0 }; + mbed_rtos_storage_mutex_t *_obj_mem = (mbed_rtos_storage_mutex_t *)malloc(sizeof(mbed_rtos_storage_mutex_t)); + memset(_obj_mem, 0, sizeof(mbed_rtos_storage_mutex_t)); + attr.name = "rda_unnamed_mutex"; + attr.cb_mem = _obj_mem; + attr.cb_size = sizeof(mbed_rtos_storage_mutex_t); + attr.attr_bits = osMutexRecursive | osMutexPrioInherit | osMutexRobust; + rdamutex = osMutexNew(&attr); + MBED_ASSERT(rdamutex != NULL); + return (void *)rdamutex; +} + +int rda_mutex_wait(void *rdamutex, unsigned int millisec) +{ + osMutexId_t mutex = (osMutexId_t)rdamutex; + osStatus res; + res = osMutexWait(mutex, millisec); + if (res == osOK) { + return NO_ERR; + } else { + return ERR; + } +} + +int rda_mutex_realease(void *rdamutex) +{ + osMutexId_t mutex = (osMutexId_t)rdamutex; + osStatus res; + res = osMutexRelease(mutex); + if(res == osOK) { + return NO_ERR; + } else { + return ERR; + } +} + +int rda_mutex_delete(void *rdamutex) +{ + osMutexId_t mutex = (osMutexId_t)rdamutex; + osStatus res; + res = osMutexDelete(mutex); + free(mutex); + if (res == osOK) { + return NO_ERR; + } else { + return ERR; + } +} + +/* Thread */ +void* rda_thread_new(const char *pcName, + void (*thread)(void *arg), + void *arg, int stacksize, int priority) +{ + osThreadId_t id; + osThreadAttr_t _attr = { 0 }; + mbed_rtos_storage_thread_t *_obj_mem = (mbed_rtos_storage_thread_t *)malloc(sizeof(mbed_rtos_storage_thread_t)); + MBED_ASSERT(_obj_mem != NULL); + memset(_obj_mem, 0, sizeof(mbed_rtos_storage_thread_t)); + _attr.priority = priority; + _attr.stack_size = stacksize; + _attr.name = pcName ? pcName : "rda_unnamed_thread"; + _attr.stack_mem = malloc(stacksize); + MBED_ASSERT(_attr.stack_mem != NULL); + _attr.cb_size = sizeof(mbed_rtos_storage_thread_t); + _attr.cb_mem = _obj_mem; + _attr.tz_module = 0; + + //Fill the stack with a magic word for maximum usage checking + for (uint32_t i = 0; i < (_attr.stack_size / sizeof(uint32_t)); i++) { + ((uint32_t *)_attr.stack_mem)[i] = 0xE25A2EA5; + } + id = osThreadNew(thread, arg, &_attr); + if (id == NULL){ + free(_attr.stack_mem); + free(_attr.cb_mem); + RDA_SYS_PRINT("sys_thread_new create error\n"); + return NULL; + } + return (void *)id; +} + +int rda_thread_delete(void* id) +{ + osStatus ret; + unsigned int *stk = ((osRtxThread_t *)id)->stack_mem; + ret = osThreadTerminate(id); + free(id); + free(stk); + if (ret != osOK) { + return ERR; + } + return NO_ERR; +} + +void* rda_thread_get_id(void) +{ + osThreadId id = osThreadGetId(); + return (void*)id; +} +#endif diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash.c new file mode 100644 index 0000000000..a2c0cd8ffa --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash.c @@ -0,0 +1,1481 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 +#include +#include +#include "critical.h" +#include "wland_flash.h" +#include "wland_dbg.h" +#include "rda5981_flash.h" +#include "wland_flash_wp.h" + +#define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] + +u32 flash_size = FLASH_SIZE; +static u32 user_data_location = RDA5991H_USER_DATA_ADDR; +static u32 third_parter_data_location = RDA5991H_3RDPARTER_DATA_ADDR; +static u32 third_parter_data_len = RDA5991H_3RDPARTER_DATA_LEN; +int rda5981_read_flash(u32 addr, char *buf, u32 len) +{ + int ret = 0; + char *temp_buf = NULL, *temp_buf_aligned; + + addr &= (flash_size -1); + if (addr < RDA5991H_PARTITION_TABLE_END_ADDR-0x18000000) { + WLAND_DBG(ERROR, "couldn't read system data\n"); + return -1; + } + + if ((u32)buf % 4) { + temp_buf = malloc(len + 3); + if (temp_buf == NULL) { + ret = -1; + goto out; + } + if ((u32)temp_buf % 4) { + temp_buf_aligned = temp_buf + (4-(u32)temp_buf%4); + } else { + temp_buf_aligned = temp_buf; + } + } else { + temp_buf_aligned = buf; + } + + core_util_critical_section_enter(); + spi_flash_flush_cache(); + SPI_FLASH_READ_DATA_FOR_MBED((void *)addr, temp_buf_aligned, len); + core_util_critical_section_exit(); + + if (temp_buf_aligned != buf) { + memcpy(buf, temp_buf_aligned, len); + } + +out: + if (temp_buf) { + free(temp_buf); + } + + return ret; +} + +void rda5981_spi_flash_erase_64KB_block(u32 addr) +{ + if (rda_ccfg_hwver() < 4) { + spi_wip_reset_2(); + spi_write_reset_2(); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, CMD_64KB_BLOCK_ERASE | (addr<<8)); + wait_busy_down_2(); + spi_wip_reset_2(); + } else { + spi_wip_reset_4(); + spi_write_reset_4(); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, CMD_64KB_BLOCK_ERASE | (addr<<8)); + wait_busy_down_4(); + spi_wip_reset_4(); + } +} +void rda5981_spi_erase_partition(void *src, u32 counts) +{ + u32 a4k, a64k, a64kend, a4kend, atmp; + + if (counts > 0x00) { + a4k = ((u32)src ) & (~((0x01UL << 12) - 0x01UL)); + a64k = ((u32)src + (0x01UL << 16) - 0x01UL) & (~((0x01UL << 16) - 0x01UL)); + a64kend = ((u32)src + counts ) & (~((0x01UL << 16) - 0x01UL)); + a4kend = ((u32)src + counts + (0x01UL << 12) - 0x01UL) & (~((0x01UL << 12) - 0x01UL)); + + for (atmp = a4k; atmp < a4kend; atmp += (0x01UL << 12)) { + if (a64kend > a64k) { + if (atmp == a64k) { + for (; atmp < a64kend; atmp += (0x01UL << 16)) { + core_util_critical_section_enter(); + rda5981_spi_flash_erase_64KB_block(atmp); + core_util_critical_section_exit(); + } + if (atmp == a4kend) { + break; + } + } + } + core_util_critical_section_enter(); + rda5981_spi_flash_erase_4KB_sector(atmp); + core_util_critical_section_exit(); + } + } +} +//@len must be 4k aligment +int rda5981_erase_flash(u32 addr, u32 len) +{ + WLAND_DBG(INFO, "erase flash :%x:%x\n", addr, len); + + addr &= (flash_size - 1); + if (addr < RDA5991H_PARTITION_TABLE_END_ADDR-0x18000000) { + WLAND_DBG(ERROR, "couldn't erase system data\n"); + return -1; + } + + if (len & (SECTOR_SIZE-1)) { + len = ((len+SECTOR_SIZE) & (~(SECTOR_SIZE-1))); + } + flash_wrtie_protect(addr); + rda5981_spi_erase_partition((void*)addr, len); + flash_wrtie_protect_all(); + return 0; +} + +//@len must be 256 aligment +int rda5981_write_flash(u32 addr, char *buf, u32 len) +{ + int ret = 0; + u8 *temp_buf = NULL, *temp_buf_aligned; + u8 *check_buf = NULL; + + addr &= (flash_size -1); + if (addr < RDA5991H_PARTITION_TABLE_END_ADDR-0x18000000) { + WLAND_DBG(ERROR, "couldn't write system data\n"); + return -1; + } + + if ((u32)buf % 4) { + temp_buf = malloc(len + 3); + if (temp_buf == NULL) { + goto out; + } + if ((u32)temp_buf % 4) { + temp_buf_aligned = temp_buf + (4-(u32)temp_buf%4); + } else { + temp_buf_aligned = temp_buf; + } + memcpy(temp_buf_aligned, buf, len); + } else { + temp_buf_aligned = (u8*)buf; + } + flash_wrtie_protect(addr); + core_util_critical_section_enter(); + //RDA5991H_ERASE_FLASH(addr, len); + RDA5991H_WRITE_FLASH(addr, temp_buf_aligned, len); + core_util_critical_section_exit(); + flash_wrtie_protect_all(); + +#ifdef FLASH_READ_CHECK + if (ret == 0) { + check_buf = malloc(len); + rda5981_read_flash(addr, check_buf, len); + if (memcmp(buf, check_buf, len) == 0) { + ret = 0; + } else { + ret = -1; + } + } +#endif /*FLASH_READ_CHECK*/ + +out: + if (temp_buf) { + free(temp_buf); + } + if (check_buf) { + free(check_buf); + } + return ret; +} + +/* + * return 0:ok, else:error. + */ +rda5991h_user_data wland_user_data; +u8 read_flag = 0; +int rda5981_write_user_data(u8 *data, u16 len, u32 flag) +{ + WLAND_DBG(INFO, "Enter, flag:0x%x\r\n", flag); + + if (!read_flag) { + if (0 == rda5981_read_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data))) { + read_flag = 1; + } else { + return -1; + } + } + + if ((wland_user_data.flag & RDA5991H_USER_DATA_FLAG_UNINITIALIZED) || + strcmp((const char *)(wland_user_data.rda5981_flag), RDA5981_FLAG_FLAG)) { + memset(&wland_user_data, 0xff, sizeof(wland_user_data)); + wland_user_data.flag = flag; + strcpy((char *)(wland_user_data.rda5981_flag), RDA5981_FLAG_FLAG); + } + + wland_user_data.flag |= flag; + + switch (flag) { + case RDA5991H_USER_DATA_FLAG_STA: + memcpy(&wland_user_data.sta_data, data, + min(sizeof(wland_user_data.sta_data), len)); + break; + case RDA5991H_USER_DATA_FLAG_MAC: + memcpy(wland_user_data.mac_addr, data, + min(sizeof(wland_user_data.mac_addr), len)); + break; + case RDA5991H_USER_DATA_FLAG_PMK: + memcpy(wland_user_data.pmk, data, + min(sizeof(wland_user_data.pmk), len)); + break; + case RDA5991H_USER_DATA_FLAG_IP: + memcpy(wland_user_data.ip, data, + min(RDA5991H_USER_DATA_IP_LENGTH, len)); + break; + case RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN: + memcpy(&wland_user_data.parter_data_len, data, + min(sizeof(wland_user_data.parter_data_len), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER: + memcpy(&wland_user_data.tx_power, data, + min(sizeof(wland_user_data.tx_power), len)); + break; + case RDA5991H_USER_DATA_FLAG_XTAL_CAL: + memcpy(&wland_user_data.xtal_cal, data, + min(sizeof(wland_user_data.xtal_cal), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_RF: + memcpy(&wland_user_data.tx_power_rf, data, + min(sizeof(wland_user_data.tx_power_rf), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_PHY_GN: + memcpy(&wland_user_data.tx_power_phy_gn, data, + min(sizeof(wland_user_data.tx_power_phy_gn), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_PHY_B: + memcpy(&wland_user_data.tx_power_phy_b, data, + min(sizeof(wland_user_data.tx_power_phy_b), len)); + break; + case RDA5991H_USER_DATA_FLAG_AP: + memcpy(&wland_user_data.ap_data, data, + min(sizeof(wland_user_data.ap_data), len)); + break; + case RDA5991H_USER_DATA_FLAG_APNET: + memcpy(&wland_user_data.ap_net_data, data, + min(sizeof(wland_user_data.ap_net_data), len)); + break; + case RDA5991H_USER_DATA_FLAG_DHCP: + memcpy(&wland_user_data.dhcp, data, + min(sizeof(wland_user_data.dhcp), len)); + break; + case RDA5991H_USER_DATA_FLAG_UART: + memcpy(&wland_user_data.uart, data, + min(sizeof(wland_user_data.uart), len)); + break; + case RDA5991H_USER_DATA_FLAG_RF: + memcpy(&wland_user_data.rf, data, + min(sizeof(wland_user_data.rf), len)); + break; + case RDA5991H_USER_DATA_FLAG_RF_CHANNELS: + memcpy(&wland_user_data.rf_channels, data, + min(sizeof(wland_user_data.rf_channels), len)); + break; + case RDA5991H_USER_DATA_FLAG_PHY: + memcpy(&wland_user_data.phy, data, + min(sizeof(wland_user_data.phy), len)); + break; + case RDA5991H_USER_DATA_FLAG_PHY_CHANNELS: + memcpy(&wland_user_data.phy_channels, data, + min(sizeof(wland_user_data.phy_channels), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_OFFSET: + memcpy(&wland_user_data.tp_offset, data, + min(sizeof(wland_user_data.tp_offset), len)); + break; + default: + return -1; + } + rda5981_erase_flash(user_data_location, sizeof(wland_user_data)); + return rda5981_write_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data)); +} + +/* + * return 0:ok, else:error. + */ +int rda5981_erase_user_data(u32 flag) +{ + if (!read_flag) { + read_flag = 1; + rda5981_read_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data)); + } + + if (wland_user_data.flag & RDA5991H_USER_DATA_FLAG_UNINITIALIZED) {//flash init is 0xffffffff + return -1; + } + + if ((wland_user_data.flag & flag) == 0) { + return 0; + } + + wland_user_data.flag &= (~flag); + + if (wland_user_data.flag == 0) { + wland_user_data.flag = RDA5991H_USER_DATA_FLAG_UNINITIALIZED; + } + if (flag & RDA5991H_USER_DATA_FLAG_STA) { + memset(&wland_user_data.sta_data, 0xff, + sizeof(wland_user_data.sta_data)); + } + if (flag & RDA5991H_USER_DATA_FLAG_MAC) { + memset(wland_user_data.mac_addr, 0xff, + sizeof(wland_user_data.mac_addr)); + } + if (flag & RDA5991H_USER_DATA_FLAG_PMK) { + memset(wland_user_data.pmk, 0xff, + sizeof(wland_user_data.pmk)); + } + if (flag & RDA5991H_USER_DATA_FLAG_IP) { + memset(wland_user_data.ip, 0xff, + RDA5991H_USER_DATA_IP_LENGTH); + } + if (flag & RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN) { + memset(&wland_user_data.parter_data_len, 0xff, + sizeof(wland_user_data.parter_data_len)); + } + if (flag & RDA5991H_USER_DATA_FLAG_TX_POWER) { + memset(&wland_user_data.tx_power, 0xff, + sizeof(wland_user_data.tx_power)); + } + if (flag & RDA5991H_USER_DATA_FLAG_XTAL_CAL) { + memset(&wland_user_data.xtal_cal, 0xff, + sizeof(wland_user_data.xtal_cal)); + } + if (flag & RDA5991H_USER_DATA_FLAG_TX_POWER_RF) { + memset(&wland_user_data.tx_power_rf, 0xff, + sizeof(wland_user_data.tx_power_rf)); + } + if (flag & RDA5991H_USER_DATA_FLAG_TX_POWER_PHY_GN) { + memset(&wland_user_data.tx_power_phy_gn, 0xff, + sizeof(wland_user_data.tx_power_phy_gn)); + } + if (flag & RDA5991H_USER_DATA_FLAG_TX_POWER_PHY_B) { + memset(&wland_user_data.tx_power_phy_b, 0xff, + sizeof(wland_user_data.tx_power_phy_b)); + } + if (flag & RDA5991H_USER_DATA_FLAG_AP) { + memset(&wland_user_data.ap_data, 0xff, + sizeof(wland_user_data.ap_data)); + } + if (flag & RDA5991H_USER_DATA_FLAG_APNET) { + memset(&wland_user_data.ap_net_data, 0xff, + sizeof(wland_user_data.ap_net_data)); + } + if (flag & RDA5991H_USER_DATA_FLAG_DHCP) { + memset(&wland_user_data.dhcp, 0xff, + sizeof(wland_user_data.dhcp)); + } + if (flag & RDA5991H_USER_DATA_FLAG_UART) { + memset(&wland_user_data.uart, 0xff, + sizeof(wland_user_data.uart)); + } + if (flag & RDA5991H_USER_DATA_FLAG_RF) { + memset(&wland_user_data.rf, 0xff, + sizeof(wland_user_data.rf)); + } + if (flag & RDA5991H_USER_DATA_FLAG_RF_CHANNELS) { + memset(&wland_user_data.rf_channels, 0xff, + sizeof(wland_user_data.rf_channels)); + } + if (flag & RDA5991H_USER_DATA_FLAG_PHY) { + memset(&wland_user_data.phy, 0xff, + sizeof(wland_user_data.phy)); + } + if (flag & RDA5991H_USER_DATA_FLAG_PHY_CHANNELS) { + memset(&wland_user_data.phy_channels, 0xff, + sizeof(wland_user_data.phy_channels)); + } + if (flag & RDA5991H_USER_DATA_FLAG_TX_POWER_OFFSET) { + memset(&wland_user_data.tp_offset, 0xff, + sizeof(wland_user_data.tp_offset)); + } + rda5981_erase_flash(user_data_location, sizeof(wland_user_data)); + return rda5981_write_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data)); +} + +/* + * return 0:ok, else:error. + */ +int rda5981_read_user_data(u8 *data, u16 len, u32 flag) +{ + //rda5991h_user_data wland_user_data; + WLAND_DBG(INFO, "Enter, flag:0x%x\r\n", flag); + + if (!read_flag) { + read_flag = 1; + rda5981_read_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data)); + } + + if (wland_user_data.flag & RDA5991H_USER_DATA_FLAG_UNINITIALIZED) {//flash init is 0xffffffff + return -1; + } + if (strcmp((const char *)(wland_user_data.rda5981_flag), RDA5981_FLAG_FLAG)) { + return -2; + } + if ((wland_user_data.flag & flag) == 0) { + return -3; + } + switch (flag) { + case RDA5991H_USER_DATA_FLAG_STA: + memcpy(data, &wland_user_data.sta_data, + min(sizeof(wland_user_data.sta_data), len)); + break; + case RDA5991H_USER_DATA_FLAG_MAC: + memcpy(data, wland_user_data.mac_addr, + min(sizeof(wland_user_data.mac_addr), len)); + break; + case RDA5991H_USER_DATA_FLAG_PMK: + memcpy(data, wland_user_data.pmk, + min(sizeof(wland_user_data.pmk), len)); + break; + case RDA5991H_USER_DATA_FLAG_IP: + memcpy(data, wland_user_data.ip, + min(RDA5991H_USER_DATA_IP_LENGTH, len)); + break; + case RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN: + memcpy(data, &wland_user_data.parter_data_len, + min(sizeof(wland_user_data.parter_data_len), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER: + memcpy(data, &wland_user_data.tx_power, + min(sizeof(wland_user_data.tx_power), len)); + break; + case RDA5991H_USER_DATA_FLAG_XTAL_CAL: + memcpy(data, &wland_user_data.xtal_cal, + min(sizeof(wland_user_data.xtal_cal), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_RF: + memcpy(data, &wland_user_data.tx_power_rf, + min(sizeof(wland_user_data.tx_power_rf), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_PHY_GN: + memcpy(data, &wland_user_data.tx_power_phy_gn, + min(sizeof(wland_user_data.tx_power_phy_gn), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_PHY_B: + memcpy(data, &wland_user_data.tx_power_phy_b, + min(sizeof(wland_user_data.tx_power_phy_b), len)); + break; + case RDA5991H_USER_DATA_FLAG_AP: + memcpy(data, &wland_user_data.ap_data, + min(sizeof(wland_user_data.ap_data), len)); + break; + case RDA5991H_USER_DATA_FLAG_APNET: + memcpy(data, &wland_user_data.ap_net_data, + min(sizeof(wland_user_data.ap_net_data), len)); + break; + case RDA5991H_USER_DATA_FLAG_DHCP: + memcpy(data, &wland_user_data.dhcp, + min(sizeof(wland_user_data.dhcp), len)); + break; + case RDA5991H_USER_DATA_FLAG_UART: + memcpy(data, &wland_user_data.uart, + min(sizeof(wland_user_data.uart), len)); + break; + case RDA5991H_USER_DATA_FLAG_RF: + memcpy(data, &wland_user_data.rf, + min(sizeof(wland_user_data.rf), len)); + break; + case RDA5991H_USER_DATA_FLAG_RF_CHANNELS: + memcpy(data, &wland_user_data.rf_channels, + min(sizeof(wland_user_data.rf_channels), len)); + break; + case RDA5991H_USER_DATA_FLAG_PHY: + memcpy(data, &wland_user_data.phy, + min(sizeof(wland_user_data.phy), len)); + break; + case RDA5991H_USER_DATA_FLAG_PHY_CHANNELS: + memcpy(data, &wland_user_data.phy_channels, + min(sizeof(wland_user_data.phy_channels), len)); + break; + case RDA5991H_USER_DATA_FLAG_TX_POWER_OFFSET: + memcpy(data, &wland_user_data.tp_offset, + min(sizeof(wland_user_data.tp_offset), len)); + break; + default: + return -1; + } + return 0; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_mac_addr(u8 *mac_addr) +{ + int ret; + WLAND_DBG(DEBUG, "Enter\r\n"); + ret = rda5981_read_user_data(mac_addr, 6, RDA5991H_USER_DATA_FLAG_MAC); + if (ret) { + WLAND_DBG(ERROR, "read mac addr from flash fail\r\n"); + } else { + WLAND_DBG(INFO, "Done(ret:%d)"MACDBG"\r\n", ret, MAC2STRDBG(mac_addr)); + } + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_write_mac_addr(u8 *mac_addr) +{ + WLAND_DBG(INFO, "Enter"MACDBG"\r\n", MAC2STRDBG(mac_addr)); + return rda5981_write_user_data(mac_addr, 6, RDA5991H_USER_DATA_FLAG_MAC); +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_uart(void) +{ + return rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_UART); +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_uart(u32 *uart) +{ + int ret; + WLAND_DBG(DEBUG, "Enter\r\n"); + ret = rda5981_read_user_data((u8 *)uart, 4, RDA5991H_USER_DATA_FLAG_UART); + if (ret) { + WLAND_DBG(ERROR, "read uart setting from flash fail\r\n"); + } + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_write_uart(u32 *uart) +{ + return rda5981_write_user_data((u8 *)uart, 4, RDA5991H_USER_DATA_FLAG_UART); +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_sta_data(void) +{ + int ret; + ret = rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_PMK | + RDA5991H_USER_DATA_FLAG_STA); + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_sta_data(char *ssid, char *passwd) +{ + int ret; + wland_sta_data_t sta_data; + + WLAND_DBG(INFO, "Enter\r\n"); + + ret = rda5981_read_user_data((u8 *)&sta_data, sizeof(sta_data), RDA5991H_USER_DATA_FLAG_STA); + if (ret == 0) { + strcpy(ssid, sta_data.ssid); + strcpy(passwd, sta_data.key); + } + return ret; +} + +/* + * return 0:ok, else:error. + */ +extern u8 *rda_get_bssinfo_pmk(void); +extern u8 *rda_get_bssinfo_SSID(void); +int rda5981_flash_write_sta_data(const char *ssid, const char *passwd) +{ + int ret = 0, ret1; + wland_sta_data_t sta_data; + u8 *pbss_info_pmk = NULL, *pbss_info_SSID = NULL; + pbss_info_pmk = rda_get_bssinfo_pmk(); + pbss_info_SSID = rda_get_bssinfo_SSID(); + + WLAND_DBG(INFO, "Enter:ssid:%s,pw:%s, pmk:%02x %02x***\r\n", + ssid, passwd, pbss_info_pmk[0], pbss_info_SSID[1]); + if (strlen(ssid) == 0) { + WLAND_DBG(ERROR, "ssid is NULL\n"); + return -1; + } + + memset(&sta_data, 0xff, sizeof(sta_data)); + strcpy(sta_data.ssid, ssid); + strcpy(sta_data.key, passwd); + if (pbss_info_pmk[0] && memcmp(pbss_info_SSID, ssid, 6)==0) { + ret = rda5981_write_user_data(pbss_info_pmk, sizeof(pbss_info_pmk), RDA5991H_USER_DATA_FLAG_PMK); + } + ret1 = rda5981_write_user_data((u8 *)&sta_data, sizeof(sta_data), RDA5991H_USER_DATA_FLAG_STA); + return ret || ret1;; +} + + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_dhcp_data(void) +{ + int ret;//, ret1; + //WLAND_DBG(INFO, "Enter\r\n"); + ret = rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_DHCP); + //ret1 = rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_PMK); + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_dhcp_data(unsigned int *fixip, unsigned int *ip, unsigned int *msk, unsigned int *gw) +{ + int ret; + wland_dhcp_t dhcp; + + WLAND_DBG(INFO, "Enter\r\n"); + + ret = rda5981_read_user_data((u8 *)&dhcp, sizeof(dhcp), RDA5991H_USER_DATA_FLAG_DHCP); + if (ret == 0) { + *fixip = dhcp.fixip; + *ip = dhcp.ip; + *msk = dhcp.msk; + *gw = dhcp.gw; + } + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_write_dhcp_data(unsigned int fixip, unsigned int ip, unsigned int msk, unsigned int gw) +{ + int ret = 0; + wland_dhcp_t dhcp; + + memset(&dhcp, 0xff, sizeof(dhcp)); + dhcp.fixip = fixip; + dhcp.ip = ip; + dhcp.msk = msk; + dhcp.gw = gw; + ret = rda5981_write_user_data((u8 *)&dhcp, sizeof(dhcp), RDA5991H_USER_DATA_FLAG_DHCP); + return ret; +} + + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_ap_data(void) +{ + int ret; + ret = rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_AP); + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_write_ap_data(const char *ssid, const char *passwd, unsigned char channel) +{ + int ret = 0; + wland_ap_data_t ap_data; + + if (strlen(ssid) == 0) { + WLAND_DBG(ERROR, "ssid is NULL\n"); + return -1; + } + + memset(&ap_data, 0xff, sizeof(ap_data)); + strcpy(ap_data.ssid, ssid); + strcpy(ap_data.key, passwd); + ap_data.channel = channel; + ret = rda5981_write_user_data((u8 *)&ap_data, sizeof(ap_data), RDA5991H_USER_DATA_FLAG_AP); + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_ap_data(char *ssid, char *passwd, unsigned char *channel) +{ + int ret; + wland_ap_data_t ap_data; + + WLAND_DBG(INFO, "Enter\r\n"); + + ret = rda5981_read_user_data((u8 *)&ap_data, sizeof(ap_data), RDA5991H_USER_DATA_FLAG_AP); + if (ret == 0) { + strcpy(ssid, ap_data.ssid); + strcpy(passwd, ap_data.key); + *channel = ap_data.channel; + } + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_erase_ap_net_data(void) +{ + int ret; + ret = rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_APNET); + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_write_ap_net_data(unsigned int ip, unsigned int msk, unsigned int gw, + unsigned int dhcps, unsigned int dhcpe) +{ + int ret = 0; + wland_ap_net_data_t ap_net_data; + + WLAND_DBG(INFO, "Enter\r\n"); + + memset(&ap_net_data, 0xff, sizeof(ap_net_data)); + ap_net_data.ip = ip; + ap_net_data.msk = msk; + ap_net_data.gw = gw; + ap_net_data.dhcps = dhcps; + ap_net_data.dhcpe = dhcpe; + + ret = rda5981_write_user_data((u8 *)&ap_net_data, sizeof(ap_net_data), RDA5991H_USER_DATA_FLAG_APNET); + return ret; +} + +/* + * return 0:ok, else:error. + */ +int rda5981_flash_read_ap_net_data(unsigned int *ip, unsigned int *msk, unsigned int *gw, + unsigned int *dhcps, unsigned int *dhcpe) +{ + int ret = 0; + wland_ap_net_data_t ap_net_data; + + WLAND_DBG(INFO, "Enter\r\n"); + + ret = rda5981_read_user_data((u8 *)&ap_net_data, sizeof(ap_net_data), RDA5991H_USER_DATA_FLAG_APNET); + if (ret == 0) { + *ip = ap_net_data.ip; + *msk = ap_net_data.msk; + *gw = ap_net_data.gw; + *dhcps = ap_net_data.dhcps; + *dhcpe = ap_net_data.dhcpe; + } + return ret; +} + + +int rda5981_flash_read_pmk(u8 *pmk) +{ + WLAND_DBG(INFO, "Enter\r\n"); + return rda5981_read_user_data(pmk, 32, RDA5991H_USER_DATA_FLAG_PMK); +} + +int rda5981_flash_read_ip_addr(u8 *ip_addr, u8 *server_addr) +{ + int ret; + u8 buf[RDA5991H_USER_DATA_IP_LENGTH]; + WLAND_DBG(DEBUG, "Enter\r\n"); + ret = rda5981_read_user_data(buf, RDA5991H_USER_DATA_IP_LENGTH, RDA5991H_USER_DATA_FLAG_IP); + if (ret) { + WLAND_DBG(ERROR, "read ip addr from flash fail\r\n"); + } else { + memcpy(ip_addr, buf, 4); + memcpy(server_addr, buf+4, 4); + WLAND_DBG(INFO, "read ip:%u.%u.%u.%u\r\n", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]); + } + return ret; +} + +int rda5981_flash_write_ip_addr(u8 *ip_addr, u8 *server_addr) +{ + u8 buf[RDA5991H_USER_DATA_IP_LENGTH]; + WLAND_DBG(INFO, "write:%u.%u.%u.%u\r\n", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]); + memcpy(buf, ip_addr, 4); + memcpy(buf+4, server_addr, 4); + return rda5981_write_user_data(buf, RDA5991H_USER_DATA_IP_LENGTH, RDA5991H_USER_DATA_FLAG_IP); +} + +int rda5981_flash_read_3rdparter_data_length() +{ + int ret; + u32 data_len = 0; + + WLAND_DBG(INFO, "Enter\r\n"); + ret = rda5981_read_user_data((u8 *)(&data_len), 4, RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN); + if (ret) { + WLAND_DBG(ERROR, "read parter data length from flash fail(%d)\r\n", ret); + return -1; + } + return data_len; +} + +int rda5981_flash_read_3rdparter_data(u8 *buf, u32 buf_len) +{ + int ret; + u32 data_len = 0; + + WLAND_DBG(INFO, "Enter: %u\r\n", buf_len); + ret = rda5981_read_user_data((u8 *)(&data_len), 4, RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN); + if (ret) { + WLAND_DBG(ERROR, "read parter data length from flash fail(%d)\r\n", ret); + return -1; + } + + if (buf_len < data_len) + WLAND_DBG(ERROR, "The buf you prepared is to small(%u:%u)\r\n", buf_len, data_len); + + data_len = min(buf_len, data_len); + + ret = rda5981_read_flash(third_parter_data_location, + (char *)(buf), data_len); + if (ret) { + WLAND_DBG(ERROR, "read parter data from flash fail(%d)\r\n", ret); + return -2; + } + + return data_len; +} + +int rda5981_flash_erase_3rdparter_data() +{ + return rda5981_erase_user_data(RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN); +} + +int rda5981_flash_write_3rdparter_data(const u8 *buf, u32 buf_len) +{ + int ret; + + WLAND_DBG(INFO, "Enter: %u\r\n", buf_len); + if (buf_len > third_parter_data_len) { + WLAND_DBG(ERROR, "buf too long(%u), we have only %x flash space\r\n", + buf_len, third_parter_data_len); + return -1; + } + + rda5981_erase_flash(third_parter_data_location, buf_len); + ret = rda5981_write_flash(third_parter_data_location, + (char *)(buf), buf_len); + if (ret) { + WLAND_DBG(ERROR, "write parter data to flash fail\r\n"); + return -2; + } + + ret = rda5981_write_user_data((u8 *)(&buf_len), 4, RDA5991H_USER_DATA_FLAG_PARTER_DATA_LEN); + if (ret) { + WLAND_DBG(ERROR, "write parter data length to flash fail\r\n"); + return -3; + } + return 0; +} + +int rda5981_set_flash_size(const u32 size) +{ + + WLAND_DBG(INFO, "Enter set flash size: %x\r\n", size); + if (size == 0x100000 || + size == 0x200000 || + size == 0x400000) { + flash_size = size; + return 0; + } + + return -1; +} + +int rda5981_set_user_data_addr(const u32 sys_data_addr, + const u32 user_data_addr, const u32 user_data_len) +{ + WLAND_DBG(INFO, "Enter set userdata addr: %x:%x:%x\r\n", + sys_data_addr, user_data_addr, user_data_len); + if ((sys_data_addr&(SECTOR_SIZE-1)) || (user_data_addr&(SECTOR_SIZE-1))) { + return -1; + } + if (sys_data_addr == user_data_addr) { + return -2; + } + + if (sys_data_addr<=0x18001000 || user_data_addr<=0x18001000) { + return -3; + } + if (sys_data_addr+0x1000 > 0x18000000+flash_size) { + return -4; + } + if (user_data_addr+user_data_len > 0x18000000+flash_size) { + return -5; + } + + user_data_location = sys_data_addr; + third_parter_data_location = user_data_addr; + third_parter_data_len= user_data_len; + return 0; +} + +int rda5981_write_user_data_regs(u8 *reg, u8 *value, u32 flag) +{ + u16 reg16 = 0; + u32 reg32 = 0; + u8 idx = 0; + + if (!read_flag) { + if (0 == rda5981_read_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data))) { + read_flag = 1; + } else { + return -1; + } + } + + if ((wland_user_data.flag & RDA5991H_USER_DATA_FLAG_UNINITIALIZED) || + strcmp((const char *)(wland_user_data.rda5981_flag), RDA5981_FLAG_FLAG)) { + memset(&wland_user_data, 0xff, sizeof(wland_user_data)); + wland_user_data.flag = flag; + strcpy((char *)(wland_user_data.rda5981_flag), RDA5981_FLAG_FLAG); + } + + wland_user_data.flag |= flag; + + switch (flag) { + case RDA5991H_USER_DATA_FLAG_RF: + if (wland_user_data.rf.valid != 1) { + wland_user_data.rf.valid = 1; + wland_user_data.rf.flag = 0; + } + + reg16 = *((u16 *)reg); + if (wland_user_data.rf.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.rf.flag & BIT(idx)) && + (wland_user_data.rf.reg_val[idx][0] == reg16)) { + wland_user_data.rf.reg_val[idx][1] = *((u16 *)value); + break; + } else { + continue; + } + } + if ((8 == idx) && (0xFF == wland_user_data.rf.flag)) + return -2; + } + + if ((8 == idx) || (0 == wland_user_data.rf.flag)) { + for (idx = 0; idx < 8; idx++) { + if (!(wland_user_data.rf.flag & BIT(idx))) { + wland_user_data.rf.reg_val[idx][0] = reg16; + wland_user_data.rf.reg_val[idx][1] = *((u16 *)value); + wland_user_data.rf.flag |= BIT(idx); + break; + } else { + continue; + } + } + } + + break; + case RDA5991H_USER_DATA_FLAG_RF_CHANNELS: + if (wland_user_data.rf_channels.valid != 1) { + wland_user_data.rf_channels.valid = 1; + wland_user_data.rf_channels.flag = 0; + } + + reg16 = *((u16 *)reg); + if (wland_user_data.rf_channels.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.rf_channels.flag & BIT(idx)) && + (wland_user_data.rf_channels.reg_val[idx][0] == reg16)) { + memcpy(&wland_user_data.rf_channels.reg_val[idx][1], value, 14 * sizeof(u16)); + break; + } else { + continue; + } + } + if ((8 == idx) && (0xFF == wland_user_data.rf_channels.flag)) { + return -2; + } + } + + if ((8 == idx) || (0 == wland_user_data.rf_channels.flag)) { + for (idx = 0; idx < 8; idx++) { + if (!(wland_user_data.rf_channels.flag & BIT(idx))) { + wland_user_data.rf_channels.reg_val[idx][0] = reg16; + memcpy(&wland_user_data.rf_channels.reg_val[idx][1], value, 14 * sizeof(u16)); + wland_user_data.rf_channels.flag |= BIT(idx); + break; + } else { + continue; + } + } + } + break; + case RDA5991H_USER_DATA_FLAG_PHY: + if (wland_user_data.phy.valid != 1) { + wland_user_data.phy.valid = 1; + wland_user_data.phy.flag = 0; + } + + reg32 = *((u32 *)reg); + if (wland_user_data.phy.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.phy.flag & BIT(idx)) && + (wland_user_data.phy.reg_val[idx][0] == reg32)) { + wland_user_data.phy.reg_val[idx][1] = *((u32 *)value); + break; + } else { + continue; + } + } + if ((8 == idx) && (0xFF == wland_user_data.phy.flag)) { + return -2; + } + } + + if ((8 == idx) || (0 == wland_user_data.phy.flag)) { + for (idx = 0; idx < 8; idx++) { + if (!(wland_user_data.phy.flag & BIT(idx))) { + wland_user_data.phy.reg_val[idx][0] = reg32; + wland_user_data.phy.reg_val[idx][1] = *((u32 *)value); + wland_user_data.phy.flag |= BIT(idx); + break; + } else { + continue; + } + } + } + break; + case RDA5991H_USER_DATA_FLAG_PHY_CHANNELS: + if (wland_user_data.phy_channels.valid != 1) { + wland_user_data.phy_channels.valid = 1; + wland_user_data.phy_channels.flag = 0; + } + + reg32 = *((u32 *)reg); + if (wland_user_data.phy_channels.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.phy_channels.flag & BIT(idx)) && + (wland_user_data.phy_channels.reg_val[idx][0] == reg32)) { + memcpy(&wland_user_data.phy_channels.reg_val[idx][1], value, 14 * sizeof(u32)); + break; + } else { + continue; + } + } + if ((8 == idx) && (0xFF == wland_user_data.phy_channels.flag)) { + return -2; + } + } + + if ((8 == idx) || (0 == wland_user_data.phy_channels.flag)) { + for (idx = 0; idx < 8; idx++) { + if (!(wland_user_data.phy_channels.flag & BIT(idx))) { + wland_user_data.phy_channels.reg_val[idx][0] = reg32; + memcpy(&wland_user_data.phy_channels.reg_val[idx][1], value, 14 * sizeof(u32)); + wland_user_data.phy_channels.flag |= BIT(idx); + break; + } else { + continue; + } + } + } + break; + default: + WLAND_DBG(ERROR, "Unknown flag:0x%08x\n", flag); + return -3; + } + + rda5981_erase_flash(user_data_location, sizeof(wland_user_data)); + return rda5981_write_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data)); +} + +int rda5981_erase_user_data_regs(u8 *reg, u32 flag) +{ + u16 reg16 = 0; + u32 reg32 = 0; + u8 idx = 0; + + if (!read_flag) { + if (0 == rda5981_read_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data))) { + read_flag = 1; + } else { + return -1; + } + } + + if (wland_user_data.flag & RDA5991H_USER_DATA_FLAG_UNINITIALIZED) {//flash init is 0xffffffff + return -1; + } + if ((wland_user_data.flag & flag) == 0) { + return 0; + } + switch (flag) { + case RDA5991H_USER_DATA_FLAG_RF: + if (wland_user_data.rf.valid != 1) { + return 0; + } + + reg16 = *((u16 *)reg); + if (wland_user_data.rf.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.rf.flag & BIT(idx)) && + (wland_user_data.rf.reg_val[idx][0] == reg16)) { + memset(&wland_user_data.rf.reg_val[idx][0], 0xFF, 2 * sizeof(u16)); + wland_user_data.rf.flag &= ~BIT(idx); + break; + } else { + continue; + } + } + } + + if (0 == wland_user_data.rf.flag) { + wland_user_data.rf.valid = 0xFFFFFFFF; + wland_user_data.rf.flag = 0xFFFFFFFF; + wland_user_data.flag &= (~flag); + } + + break; + case RDA5991H_USER_DATA_FLAG_RF_CHANNELS: + if (wland_user_data.rf_channels.valid != 1) { + return 0; + } + + reg16 = *((u16 *)reg); + if (wland_user_data.rf_channels.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.rf_channels.flag & BIT(idx)) && + (wland_user_data.rf_channels.reg_val[idx][0] == reg16)) { + memset(&wland_user_data.rf_channels.reg_val[idx][0], 0xFF, 15 * sizeof(u16)); + wland_user_data.rf_channels.flag &= ~BIT(idx); + break; + } else { + continue; + } + } + } + + if (0 == wland_user_data.rf_channels.flag) { + wland_user_data.rf_channels.valid = 0xFFFFFFFF; + wland_user_data.rf_channels.flag = 0xFFFFFFFF; + wland_user_data.flag &= (~flag); + } + + break; + case RDA5991H_USER_DATA_FLAG_PHY: + if (wland_user_data.phy.valid != 1) { + return 0; + } + + reg32 = *((u32 *)reg); + if (wland_user_data.phy.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.phy.flag & BIT(idx)) && + (wland_user_data.phy.reg_val[idx][0] == reg32)) { + memset(&wland_user_data.phy.reg_val[idx][0], 0xFF, 2 * sizeof(u32)); + wland_user_data.phy.flag &= ~BIT(idx); + break; + } else { + continue; + } + } + } + + if (0 == wland_user_data.phy.flag) { + wland_user_data.phy.valid = 0xFFFFFFFF; + wland_user_data.phy.flag = 0xFFFFFFFF; + wland_user_data.flag &= (~flag); + } + + break; + case RDA5991H_USER_DATA_FLAG_PHY_CHANNELS: + if (wland_user_data.phy_channels.valid != 1) { + return 0; + } + + reg32 = *((u32 *)reg); + if (wland_user_data.phy_channels.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.phy_channels.flag & BIT(idx)) && + (wland_user_data.phy_channels.reg_val[idx][0] == reg32)) { + memset(&wland_user_data.phy_channels.reg_val[idx][0], 0xFF, 15 * sizeof(u32)); + wland_user_data.phy_channels.flag &= ~BIT(idx); + break; + } else { + continue; + } + } + } + + if (0 == wland_user_data.phy_channels.flag) { + wland_user_data.phy_channels.valid = 0xFFFFFFFF; + wland_user_data.phy_channels.flag = 0xFFFFFFFF; + wland_user_data.flag &= (~flag); + } + + break; + default: + WLAND_DBG(ERROR, "Unknown flag:0x%08x\n", flag); + return -3; + } + + rda5981_erase_flash(user_data_location, sizeof(wland_user_data)); + return rda5981_write_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data)); +} + + +int rda5981_read_user_data_regs(u8 *reg, u8 *value, u32 flag) +{ + u16 reg16 = 0; + u32 reg32 = 0; + u8 idx = 0; + + if (!read_flag) { + if(0 == rda5981_read_flash(user_data_location, + (char *)(&wland_user_data), sizeof(wland_user_data))) { + read_flag = 1; + } else { + return -1; + } + } + + if (wland_user_data.flag & RDA5991H_USER_DATA_FLAG_UNINITIALIZED) {//flash init is 0xffffffff + return -1; + } + if (strcmp((const char *)(wland_user_data.rda5981_flag), RDA5981_FLAG_FLAG)) { + return -2; + } + if ((wland_user_data.flag & flag) == 0) { + return -3; + } + switch (flag) { + case RDA5991H_USER_DATA_FLAG_RF: + if (wland_user_data.rf.valid != 1) { + return -4; + } + + reg16 = *((u16 *)reg); + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.rf.flag & BIT(idx)) && + (wland_user_data.rf.reg_val[idx][0] == reg16)) { + memcpy(value, &wland_user_data.rf.reg_val[idx][1], sizeof(u16)); + break; + } else { + continue; + } + } + + if (8 == idx) { + return -4; + } + break; + case RDA5991H_USER_DATA_FLAG_RF_CHANNELS: + if (wland_user_data.rf_channels.valid != 1) { + return -4; + } + + reg16 = *((u16 *)reg); + if (wland_user_data.rf_channels.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.rf_channels.flag & BIT(idx)) && + (wland_user_data.rf_channels.reg_val[idx][0] == reg16)) { + memcpy(value, &wland_user_data.rf_channels.reg_val[idx][1], 14 * sizeof(u16)); + break; + } else { + continue; + } + } + } + + if (8 == idx) { + return -4; + } + break; + case RDA5991H_USER_DATA_FLAG_PHY: + if (wland_user_data.phy.valid != 1) { + return -4; + } + + reg32 = *((u32 *)reg); + if (wland_user_data.phy.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.phy.flag & BIT(idx)) && + (wland_user_data.phy.reg_val[idx][0] == reg32)) { + memcpy(value, &wland_user_data.phy.reg_val[idx][1], sizeof(u32)); + break; + } else { + continue; + } + } + } + + if (8 == idx) { + return -4; + } + break; + case RDA5991H_USER_DATA_FLAG_PHY_CHANNELS: + if (wland_user_data.phy_channels.valid != 1) { + return -4; + } + + reg32 = *((u32 *)reg); + if (wland_user_data.phy_channels.flag != 0) { + for (idx = 0; idx < 8; idx++) { + if ((wland_user_data.phy_channels.flag & BIT(idx)) && + (wland_user_data.phy_channels.reg_val[idx][0] == reg32)) { + memcpy(value, &wland_user_data.phy_channels.reg_val[idx][1], 14 * sizeof(u32)); + break; + } else { + continue; + } + } + } + + if (8 == idx) { + return -4; + } + break; + default: + WLAND_DBG(ERROR, "Unknown flag:0x%08x\n", flag); + return -3; + } + + return 0; +} + +int rda5981_flash_get_mid(u8 *mid) +{ + *mid = 0xC8; + + return 0; +} + +int rda5981_flash_get_did(u8 *did) +{ + *did = 0x13; + + return 0; +} + +int rda5981_flash_get_jdid(u16 *jdid) +{ + *jdid = 0x4014; + + return 0; +} + +int rda5981_read_default_config(char *buf, u32 len, u32 flag) +{ + int ret = 0; + u32 addr; + u32 addr_offset = 0; + char *temp_buf = NULL, *temp_buf_aligned; + + switch (flag) { + case RDA5981_VBAT_CAL: + addr = 0x18000088; + break; + case RDA5981_GPADC0_CAL: + case RDA5981_GPADC1_CAL: + addr = 0x1800008C; + break; + case RDA5981_PRODUCT_ID: + addr = 0x18000084; + break; + case RDA5981_POWER_CLASS: + addr = 0x18000085; + break; + default: + WLAND_DBG(ERROR, "Unknown flag\n"); + return -1; + } + + addr_offset = addr % 4; + addr = (addr - addr_offset) & (flash_size -1); + + if (((u32)buf % 4) || (addr_offset != 0)) { + temp_buf = (char *)malloc(addr_offset + len + 4); + if (temp_buf == NULL) { + ret = -1; + goto out; + } + if ((u32)temp_buf % 4) { + temp_buf_aligned = temp_buf + (4 - (u32)temp_buf % 4); + } else { + temp_buf_aligned = temp_buf; + } + } else { + temp_buf_aligned = buf; + } + + core_util_critical_section_enter(); + spi_flash_flush_cache(); + SPI_FLASH_READ_DATA_FOR_MBED((void *)addr, temp_buf_aligned, (len + addr_offset)); + core_util_critical_section_exit(); + + if (temp_buf_aligned != buf) { + memcpy(buf, temp_buf_aligned + addr_offset, len); + } +out: + if (temp_buf) { + free(temp_buf); + } + return ret; +} + +int rda5981_flash_read_vbat_cal(float *k, float *b) +{ + int ret = 0; + u32 value = 0; + u32 x1 = 0;//y1 3.0f + u32 x2 = 0;//y2 4.2f + float k_tmp = 0; + float b_tmp = 0; + + ret = rda5981_read_default_config((char *)&value, 4, RDA5981_VBAT_CAL); + + if (ret < 0) { + WLAND_DBG(ERROR, "read vbat_cal form flash fail\n"); + return -1; + } + if ((0 == (value & 0xFFFFFUL)) || (0xFFFFFUL == (value & 0xFFFFFUL))) { + WLAND_DBG(ERROR, "invalid vbat_cal:0x%08x\n", value); + return -1; + } else { + x1 = value & 0x3FFUL; + x2 = (value >> 10) & 0x3FFUL; + } + + if (x1 == x2) { + return -1; + } + + k_tmp = (4.2f - 3.0f) / (float)(x2 - x1); + b_tmp = 4.2f - k_tmp * x2; + + *k = k_tmp; + *b = b_tmp; + + return ret; +} diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash_wp.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash_wp.c new file mode 100644 index 0000000000..6ff0181640 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_flash_wp.c @@ -0,0 +1,366 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "mbed_interface.h" +#include "wland_flash.h" + +//#define FLASH_PROTECT_ENABLE + +#define FLASH_CTL_REG_BASE 0x17fff000 +#define FLASH_CTL_TX_CMD_ADDR_REG (FLASH_CTL_REG_BASE + 0x00) +#define FLASH_CTL_TX_BLOCK_SIZE_REG (FLASH_CTL_REG_BASE + 0x04) +#define FLAHS_CTL_TX_FIFO_DATA_REG (FLASH_CTL_REG_BASE + 0x08) +#define FLASH_CTL_STATUS_REG (FLASH_CTL_REG_BASE + 0x0c) +#define FLAHS_CTL_RX_FIFO_DATA_REG (FLASH_CTL_REG_BASE + 0x10) + +#define WRITE_REG32(REG, VAL) ((*(volatile unsigned int*)(REG)) = (unsigned int)(VAL)) +#define WRITE_REG8(REG, VAL) ((*(volatile unsigned char*)(REG)) = (unsigned char)(VAL)) +#define MREAD_WORD(addr) *((volatile unsigned int *)(addr)) + +#define MID_GD 0xC8 +#define MID_WINBOND 0xEF + +#define FLASH_1M 0x100000 +#define FLASH_2M 0x200000 +#define FLASH_4M 0x400000 +extern unsigned int flash_size; + +#ifdef FLASH_PROTECT_ENABLE + +#define FLASH_WP_MASK 0x407c +#define FLASH_WP_NONE 0x0000 +#define FLASH_WP_ALL 0x1c + +#define FLASH_4M_WP_4K 0x0064 +#define FLASH_4M_WP_8K 0x0068 +#define FLASH_4M_WP_16K 0x006c +#define FLASH_4M_WP_32K 0x0070 +#define FLASH_4M_WP_1_64 0x0024 +#define FLASH_4M_WP_1_32 0x0028 +#define FLASH_4M_WP_1_16 0x002c +#define FLASH_4M_WP_1_8 0x0030 +#define FLASH_4M_WP_1_4 0x0034 +#define FLASH_4M_WP_1_2 0x0038 +#define FLASH_4M_WP_3_4 0x4014 +#define FLASH_4M_WP_7_8 0x4010 +#define FLASH_4M_WP_15_16 0x400c +#define FLASH_4M_WP_31_32 0x4008 +#define FLASH_4M_WP_63_64 0x4004 +#define FLASH_4M_WP_127_128 0x4058 +#define FLASH_4M_WP_255_256 0x404C +#define FLASH_4M_WP_1023_1024 0x4044 + +#define FLASH_2M_WP_4K 0x0064 +#define FLASH_2M_WP_8K 0x0068 +#define FLASH_2M_WP_16K 0x006c +#define FLASH_2M_WP_32K 0x0070 +#define FLASH_2M_WP_1_32 0x0024 +#define FLASH_2M_WP_1_16 0x0028 +#define FLASH_2M_WP_1_8 0x002c +#define FLASH_2M_WP_1_4 0x0050 +#define FLASH_2M_WP_1_2 0x0051 +#define FLASH_2M_WP_3_4 0x4010 +#define FLASH_2M_WP_7_8 0x400c +#define FLASH_2M_WP_15_16 0x4004 +#define FLASH_2M_WP_31_32 0x4000 +#define FLASH_2M_WP_63_64 0x4050 +#define FLASH_2M_WP_127_128 0x404c +#define FLASH_2M_WP_255_256 0x4048 +#define FLASH_2M_WP_511_512 0x4044 + + +#define FLASH_1M_WP_4K 0x0064 +#define FLASH_1M_WP_8K 0x0068 +#define FLASH_1M_WP_16K 0x006c +#define FLASH_1M_WP_32K 0x0070 +#define FLASH_1M_WP_1_16 0x0024 +#define FLASH_1M_WP_1_8 0x0028 +#define FLASH_1M_WP_1_4 0x002c +#define FLASH_1M_WP_1_2 0x0050 +#define FLASH_1M_WP_3_4 0x400C +#define FLASH_1M_WP_7_8 0x4008 +#define FLASH_1M_WP_15_16 0x4004 +#define FLASH_1M_WP_31_32 0x4050 +#define FLASH_1M_WP_63_64 0x404C +#define FLASH_1M_WP_127_128 0x4048 +#define FLASH_1M_WP_255_256 0x4044 + +static unsigned short flash_wrtie_protect_4M(unsigned short status, unsigned int offset) +{ + unsigned int wp = FLASH_WP_NONE; + if (offset >= flash_size - flash_size/1024) { + wp = FLASH_4M_WP_1023_1024; + } else if(offset >= flash_size - flash_size/256) { + wp = FLASH_4M_WP_255_256; + } else if(offset >= flash_size - flash_size/128) { + wp = FLASH_4M_WP_127_128; + } else if(offset >= flash_size - flash_size/64) { + wp = FLASH_4M_WP_63_64; + } else if(offset >= flash_size - flash_size/32) { + wp = FLASH_4M_WP_31_32; + } else if(offset >= flash_size - flash_size/16) { + wp = FLASH_4M_WP_15_16; + } else if(offset >= flash_size - flash_size/8) { + wp = FLASH_4M_WP_7_8; + } else if(offset >= flash_size - flash_size/4) { + wp = FLASH_4M_WP_3_4; + } else if(offset >= flash_size/2) { + wp = FLASH_4M_WP_1_2; + } else if(offset >= flash_size/4) { + wp = FLASH_4M_WP_1_4; + } else if(offset >= flash_size/8) { + wp = FLASH_4M_WP_1_8; + } else if(offset >= flash_size/16) { + wp = FLASH_4M_WP_1_16; + } else if(offset >= flash_size/32) { + wp = FLASH_4M_WP_1_32; + } else if(offset >= flash_size/64) { + wp = FLASH_4M_WP_1_64; + } else if(offset >= 32 * 1024) { + wp = FLASH_4M_WP_32K; + } else if(offset >= 16 * 1024) { + wp = FLASH_4M_WP_16K; + } else if(offset >= 8 * 1024) { + wp = FLASH_4M_WP_8K; + } else if(offset >= 4 * 1024) { + wp = FLASH_4M_WP_4K; + } + + return (status & ~FLASH_WP_MASK) | wp; + +} + +static unsigned short flash_wrtie_protect_2M(unsigned short status, unsigned int offset) +{ + unsigned int wp = FLASH_WP_NONE; + if (offset >= flash_size - flash_size/256) { + wp = FLASH_2M_WP_255_256; + } else if(offset >= flash_size - flash_size/128) { + wp = FLASH_2M_WP_127_128; + } else if(offset >= flash_size - flash_size/64) { + wp = FLASH_2M_WP_63_64; + } else if(offset >= flash_size - flash_size/32) { + wp = FLASH_2M_WP_31_32; + } else if(offset >= flash_size - flash_size/16) { + wp = FLASH_2M_WP_15_16; + } else if(offset >= flash_size - flash_size/8) { + wp = FLASH_2M_WP_7_8; + } else if(offset >= flash_size - flash_size/4) { + wp = FLASH_2M_WP_3_4; + } else if(offset >= flash_size/2) { + wp = FLASH_2M_WP_1_2; + } else if(offset >= flash_size/4) { + wp = FLASH_2M_WP_1_4; + } else if(offset >= flash_size/8) { + wp = FLASH_2M_WP_1_8; + } else if(offset >= flash_size/16) { + wp = FLASH_2M_WP_1_16; + } else if(offset >= flash_size/32) { + wp = FLASH_2M_WP_1_32; + } else if(offset >= 32 * 1024) { + wp = FLASH_2M_WP_32K; + } else if(offset >= 16 * 1024) { + wp = FLASH_2M_WP_16K; + } else if(offset >= 8 * 1024) { + wp = FLASH_2M_WP_8K; + } else if(offset >= 4 * 1024) { + wp = FLASH_2M_WP_4K; + } + + return (status & ~FLASH_WP_MASK) | wp; + +} + +static unsigned short flash_wrtie_protect_1M(unsigned short status, unsigned int offset) +{ + unsigned int wp = FLASH_WP_NONE; + + if (offset >= flash_size - flash_size/256) { + wp = FLASH_1M_WP_255_256; + } else if(offset >= flash_size - flash_size/128) { + wp = FLASH_1M_WP_127_128; + } else if(offset >= flash_size - flash_size/64) { + wp = FLASH_1M_WP_63_64; + } else if(offset >= flash_size - flash_size/32) { + wp = FLASH_1M_WP_31_32; + } else if(offset >= flash_size - flash_size/16) { + wp = FLASH_1M_WP_15_16; + } else if(offset >= flash_size - flash_size/8) { + wp = FLASH_1M_WP_7_8; + } else if(offset >= flash_size - flash_size/4) { + wp = FLASH_1M_WP_3_4; + } else if(offset >= flash_size/2) { + wp = FLASH_1M_WP_1_2; + } else if(offset >= flash_size/4) { + wp = FLASH_1M_WP_1_4; + } else if(offset >= flash_size/8) { + wp = FLASH_1M_WP_1_8; + } else if(offset >= flash_size/16) { + wp = FLASH_1M_WP_1_16; + } else if(offset >= 32 * 1024) { + wp = FLASH_1M_WP_32K; + } else if(offset >= 16 * 1024) { + wp = FLASH_1M_WP_16K; + } else if(offset >= 8 * 1024) { + wp = FLASH_1M_WP_8K; + } else if(offset >= 4 * 1024) { + wp = FLASH_1M_WP_4K; + } + + return (status & ~FLASH_WP_MASK) | wp; + +} + +void flash_wrtie_protect_all() +{ + unsigned short status; + unsigned char r1, r2; + core_util_critical_section_enter(); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x05); + wait_busy_down(); + r1 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x35); + wait_busy_down(); + r2 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + //mbed_error_printf("status %x %x\r\n", r2, r1); + + status = (r2 << 8) | r1; + status = (status & ~FLASH_WP_MASK) | FLASH_WP_ALL; + //mbed_error_printf("status %04x\r\n", status); + + spi_write_reset(); + wait_busy_down(); + WRITE_REG8(FLAHS_CTL_TX_FIFO_DATA_REG, (status&0xff)); + WRITE_REG8(FLAHS_CTL_TX_FIFO_DATA_REG, ((status>>8)&0xff)); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x01); + wait_busy_down(); + spi_wip_reset(); + core_util_critical_section_exit(); + return; +} + +void flash_wrtie_protect_none() +{ + unsigned short status; + unsigned char r1, r2; + core_util_critical_section_enter(); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x05); + wait_busy_down(); + r1 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x35); + wait_busy_down(); + r2 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + //mbed_error_printf("status %x %x\r\n", r2, r1); + + status = (r2 << 8) | r1; + status = status & ~FLASH_WP_MASK; + //mbed_error_printf("status %04x\r\n", status); + + spi_write_reset(); + wait_busy_down(); + WRITE_REG8(FLAHS_CTL_TX_FIFO_DATA_REG, (status&0xff)); + WRITE_REG8(FLAHS_CTL_TX_FIFO_DATA_REG, ((status>>8)&0xff)); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x01); + wait_busy_down(); + spi_wip_reset(); + core_util_critical_section_exit(); + return; +} + +void flash_wrtie_protect(unsigned int offset) +{ + unsigned short status; + unsigned char r1, r2; + core_util_critical_section_enter(); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x05); + wait_busy_down(); + r1 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x35); + wait_busy_down(); + r2 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + //mbed_error_printf("status %x %x\r\n", r2, r1); + + status = (r2 << 8) | r1; + if (flash_size == FLASH_4M) { + status = flash_wrtie_protect_4M(status, offset); + } else if(flash_size == FLASH_2M) { + status = flash_wrtie_protect_2M(status, offset); + } else if(flash_size == FLASH_1M) { + status = flash_wrtie_protect_1M(status, offset); + } else [ + LWIP_DEBUGF(NETIF_DEBUG,"flash_size is error\r\n"); + } + //mbed_error_printf("status %04x\r\n", status); + + spi_write_reset(); + wait_busy_down(); + WRITE_REG8(FLAHS_CTL_TX_FIFO_DATA_REG, (status&0xff)); + WRITE_REG8(FLAHS_CTL_TX_FIFO_DATA_REG, ((status>>8)&0xff)); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x01); + wait_busy_down(); + spi_wip_reset(); + core_util_critical_section_exit(); + return; +} +#else +void flash_wrtie_protect_all() +{ + return; +} + +void flash_wrtie_protect_none() +{ + return; +} + +void flash_wrtie_protect(unsigned int offset) +{ + return; +} + +#endif +void rda5981_flash_init() +{ + unsigned int status3, status4, status5; + core_util_critical_section_enter(); + WRITE_REG32(FLASH_CTL_TX_BLOCK_SIZE_REG, 3<<8); + status3 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + status4 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + status5 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + + wait_busy_down(); + spi_wip_reset(); + WRITE_REG32(FLASH_CTL_TX_CMD_ADDR_REG, 0x9F); + wait_busy_down(); + //WRITE_REG32(FLASH_CTL_TX_BLOCK_SIZE_REG, 3<<8); + //wait_busy_down(); + status3 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + status4 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + status5 = MREAD_WORD(FLAHS_CTL_RX_FIFO_DATA_REG); + core_util_critical_section_exit(); + + if ((status5&0xff != 0x14) && (status5&0xff != 0x15) && (status5&0xff != 0x16)) { + mbed_error_printf("flash size error\r\n"); + return; + } + flash_size = (1 << (status5&0xff)); + flash_wrtie_protect_all(); + + return; +} diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_ota.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_ota.c new file mode 100644 index 0000000000..05a85abc0a --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/wland_ota.c @@ -0,0 +1,145 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "wland_ota.h" +#include "wland_flash.h" +#include "rda5981_ota.h" +#include "wland_dbg.h" +#include "wland_types.h" +#include "critical.h" +#include +#include + +#define IMAGE_MAGIC 0xAEAE + +u32 wland_ota_partition_addr = 0; +u32 wland_ota_partition_len = 0; +u32 wland_crc_result = ~0UL; + +static u32 crc32(const u8 *p, u32 len, u32 crc) +{ + const u32 *crc32_tab = (const u32 *)CRC32_TABLE_ADDR; + + if (rda_ccfg_hwver() >= 4) { + crc32_tab = (const u32 *)CRC32_TABLE_ADDR_4; + } + /* Calculate CRC */ + while(len--) { + crc = crc32_tab[((crc & 0xFF) ^ *p++)] ^ (crc >> 8); + } + + return crc; +} + +static int rda5981_ota_erase_flash(u32 addr, u32 len) +{ + addr &= (flash_size -1); + rda5981_spi_erase_partition((void *)addr, len); + return 0; +} +//write without erase +static int rda5981_ota_write_flash(u32 addr, char *buf, u32 len) +{ + int ret = 0; + u8 *temp_buf = NULL, *temp_buf_aligned; + + addr &= (flash_size -1); + if ((u32)buf % 4) { + temp_buf = malloc(len + 3); + if (temp_buf == NULL) { + goto out; + } + if ((u32)temp_buf % 4) { + temp_buf_aligned = temp_buf + (4-(u32)temp_buf%4); + } else { + temp_buf_aligned = temp_buf; + } + memcpy(temp_buf_aligned, (unsigned char *)buf, len); + } else { + temp_buf_aligned = (u8 *)buf; + } + core_util_critical_section_enter(); + RDA5991H_WRITE_FLASH(addr, temp_buf_aligned, len); + core_util_critical_section_exit(); + +out: + if (temp_buf) { + free(temp_buf); + } + return ret; +} + +int rda5981_write_partition_start(u32 addr, u32 img_len) +{ + if (addr < 0x18001000 || addr+img_len>0x18000000+flash_size) { + WLAND_DBG(ERROR,"write partition start addr error. (0x%08x, %u)\r\n", addr, img_len); + return -1; + } + if (addr%0x1000 || img_len%0x1000) { + WLAND_DBG(ERROR,"write partition start length error.(mast be 4k alignment) (0x%08x, %u)\r\n", addr, img_len); + return -1; + } + + WLAND_DBG(INFO, "rda5981_write_partition_start:0x%08x, %u\r\n", addr, img_len); + wland_ota_partition_addr = addr; + wland_ota_partition_len = img_len; + wland_crc_result = ~0U; + + rda5981_ota_erase_flash(addr, img_len); + return 0; +} +int rda5981_write_partition(u32 offset, const u8 *buf, u32 len) +{ + if (wland_ota_partition_addr==0 || offset+len>wland_ota_partition_len) { + WLAND_DBG(ERROR,"write partition error. out of start addr(0x%08x, %u). (0x%08x, %u)\r\n", + wland_ota_partition_addr, wland_ota_partition_len, offset, len); + return -1; + } + if (len%0x400) { + WLAND_DBG(ERROR,"write partition length error.(mast be 1k alignment) (0x%08x, %u)\r\n", offset, len); + return -1; + } + WLAND_DBG(DEBUG, "rda5981_write_partition:0x%08x, %u.(%02x)\r\n", + wland_ota_partition_addr + offset, len, buf[0]); + wland_crc_result = crc32(buf, len, wland_crc_result); + + WLAND_DBG(DEBUG, "rda5981_write_partition: wland_crc_result 0x%08x\r\n", + wland_crc_result); + return rda5981_ota_write_flash(wland_ota_partition_addr + offset, (char *)buf, len); + //return rda5981_write_flash(wland_ota_partition_addr + offset, buf, len); +} +int rda5981_write_partition_end(void) +{ + WLAND_DBG(INFO, "check crc32:0x%08x, %u\r\n", wland_ota_partition_addr, wland_ota_partition_len); + if (wland_ota_partition_addr == 0) { + WLAND_DBG(ERROR,"OTA is not started\r\n"); + return -1; + } + core_util_critical_section_enter(); + spi_flash_flush_cache(); + //u32 crc32_check = crc32(wland_ota_partition_addr, wland_ota_partition_len, ~0U); + u32 crc32_check = bootrom_crc32((unsigned char *)wland_ota_partition_addr, wland_ota_partition_len); + core_util_critical_section_exit(); + WLAND_DBG(INFO, "rda5981_write_partition_end:0x%08x:0x%08x\r\n", wland_crc_result, crc32_check); + wland_ota_partition_addr = 0UL; + + if (crc32_check == wland_crc_result) { + return 0; + } else { + WLAND_DBG(ERROR,"check crc32 error\r\n"); + return -1; + } +} diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp new file mode 100644 index 0000000000..9305f0daeb --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp @@ -0,0 +1,293 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 +#include "cmsis_os.h" +#include "mbed_interface.h" +#include "mbed_assert.h" +#include "mbed_shared_queues.h" +#include "netsocket/nsapi_types.h" +#include "lwip/arch.h" +#include "lwip/pbuf.h" +#include "rda5991h_wland.h" +#include "rda5981x_emac_config.h" +#include "rda5981x_emac.h" +#include "rda_sys_wrapper.h" +#include "maclib_task.h" + +#define RDA_HWADDR_SIZE (6) +#define RDA_ETH_MTU_SIZE 1500 +#define RDA_ETH_IF_NAME "st" + +#define RX_PRIORITY (osPriorityNormal) +#define TX_PRIORITY (osPriorityNormal) +#define PHY_PRIORITY (osPriorityNormal) + +extern void *packet_rx_queue; + +RDA5981x_EMAC::RDA5981x_EMAC() +{ +} + +/** + * This function should do the actual transmission of the packet. The packet is + * contained in the memory buffer chain that is passed to the function. + * + * @param buf the MAC packet to send (e.g. IP packet including MAC addresses and type) + * @return true if the packet could be sent + * false value if the packet couldn't be sent + * + * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to + * strange results. You might consider waiting for space in the DMA queue + * to become availale since the stack doesn't retry to send a packet + * dropped because of memory failure (except for the TCP timers). + */ +bool RDA5981x_EMAC::link_out(emac_mem_buf_t *buf) +{ + emac_mem_buf_t *q, *p = buf; + + u32_t actual_txlen = 0; + u8_t **data = NULL; + u16_t retry = 400; + + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output enter, p:%08x\n", p)); + + while ((data == NULL) && (retry-- > 0)) { + data = (u8_t**)wland_get_databuf(); + osThreadYield(); + } + if (data == NULL) { + LWIP_DEBUGF(NETIF_DEBUG, ("rda91h_low_level_output, no PKT buf\r\n")); + memory_manager->free(buf); + return false; + } + + for (q = p; q != NULL; q = memory_manager->get_next(q)) { + /* Send the data from the pbuf to the interface, one pbuf at a + time. The size of the data in each pbuf is kept in the ->len + variable. */ + memcpy(&((*data)[actual_txlen+2]), memory_manager->get_ptr(q), memory_manager->get_len(q));//reserve wid header length + actual_txlen += memory_manager->get_len(q); + if (actual_txlen > 1514 || actual_txlen > memory_manager->get_total_len(p)) { + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output err, actual_txlen:%d, tot_len%d\n", actual_txlen, memory_manager->get_total_len(p))); + memory_manager->free(buf); + return false; + } + } + + /* Signal rda5996 that packet should be sent */ + if (actual_txlen == memory_manager->get_total_len(p)) { + wland_txip_data((void*)data, actual_txlen, 0); + memory_manager->free(buf); + return true; + } + + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_output pkt len mismatch, actual_txlen:%d, tot_len%d\n", + actual_txlen, memory_manager->get_total_len(p))); + + memory_manager->free(buf); + return false; +} + +/** + * Should allocate a contiguous memory buffer and transfer the bytes of the incoming + * packet to the buffer. + * + * @param buf If a frame was received and the memory buffer allocation was successful, a memory + * buffer filled with the received packet (including MAC header) + * @return negative value when no more frames, + * zero when frame is received + */ +emac_mem_buf_t * RDA5981x_EMAC::low_level_input(u8_t *data, int len) +{ + emac_mem_buf_t *p, *q; + u16_t index = 0; + + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input enter, rxlen:%d\n", len)); + + /* Obtain the size of the packet and put it into the "len" + variable. */ + if (!len) { + return NULL; + } + + /* We allocate a pbuf chain of pbufs from the pool. */ + p = memory_manager->alloc_pool(len, 0); + if (p != NULL) { + /* We iterate over the pbuf chain until we have read the entire + * packet into the pbuf. */ + for (q = p; q != NULL; q = memory_manager->get_next(q)) { + /* Read enough bytes to fill this pbuf in the chain. The + * available data in the pbuf is given by the q->len + * variable. + * This does not necessarily have to be a memcpy, you can also preallocate + * pbufs for a DMA-enabled MAC and after receiving truncate it to the + * actually received size. In this case, ensure the tot_len member of the + * pbuf is the sum of the chained pbuf len members. + */ + /* load rx data from 96 to local mem_pool */ + memcpy(memory_manager->get_ptr(q), &data[index], memory_manager->get_len(q)); + index += memory_manager->get_len(q); + + if (index >= len) { + break; + } + } + + } else { + /* Drop this packet */ + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input pbuf_alloc fail, rxlen:%d\n", len)); + + return NULL; + } + return p; +} + + +/** \brief Attempt to read a packet from the EMAC interface. + * + */ +void RDA5981x_EMAC::packet_rx() +{ + rda_msg msg; + packet_rx_queue = rda_mail_create(10, sizeof(unsigned int)*4); + /* move received packet into a new buf */ + while (1) { + emac_mem_buf_t *p = NULL; + rda_mail_get(packet_rx_queue, (void*)&msg, osWaitForever); + switch(msg.type) { + case 0: + p = low_level_input((unsigned char*)msg.arg1, msg.arg2); + if (p == NULL) { + rda_sem_release((void*)msg.arg3); + break; + } + rda_sem_release((void*)msg.arg3); + if (p) { + emac_link_input_cb(p); + } + break; + case 1: + emac_link_state_cb(msg.arg1); + break; + default: + break; + } + } +} + +void RDA5981x_EMAC::thread_function(void *pvParameters) +{ + static struct RDA5981x_EMAC *rda5981x_enet = static_cast(pvParameters); + rda5981x_enet->packet_rx(); +} + +bool RDA5981x_EMAC::power_up() +{ + /* Initialize the hardware */ + static int init_flag = 0; + if (init_flag == 0) { + wland_reg_func(); + rda_thread_new("maclib_thread", maclib_task, NULL, DEFAULT_THREAD_STACKSIZE*8, PHY_PRIORITY); + rda_thread_new("wland_thread", wland_task, NULL, DEFAULT_THREAD_STACKSIZE*5, PHY_PRIORITY); + rda_thread_new("packet_rx", RDA5981x_EMAC::thread_function, this, DEFAULT_THREAD_STACKSIZE*5, PHY_PRIORITY); + /* Allow the PHY task to detect the initial link state and set up the proper flags */ + osDelay(100); + wland_sta_init(); + init_flag = 1; + } + + return true; +} + +uint32_t RDA5981x_EMAC::get_mtu_size() const +{ + return RDA_ETH_MTU_SIZE; +} + +uint32_t RDA5981x_EMAC::get_align_preference() const +{ + return 0; +} + +void RDA5981x_EMAC::get_ifname(char *name, uint8_t size) const +{ + memcpy(name, RDA_ETH_IF_NAME, (size < sizeof(RDA_ETH_IF_NAME)) ? size : sizeof(RDA_ETH_IF_NAME)); +} + +uint8_t RDA5981x_EMAC::get_hwaddr_size() const +{ + return RDA_HWADDR_SIZE; +} + +bool RDA5981x_EMAC::get_hwaddr(uint8_t *addr) const +{ + mbed_mac_address((char *)addr); + return true; +} + +void RDA5981x_EMAC::set_hwaddr(const uint8_t *addr) +{ + /* No-op at this stage */ +} + +void RDA5981x_EMAC::set_link_input_cb(emac_link_input_cb_t input_cb) +{ + emac_link_input_cb = input_cb; +} + +void RDA5981x_EMAC::set_link_state_cb(emac_link_state_change_cb_t state_cb) +{ + emac_link_state_cb = state_cb; +} + +void RDA5981x_EMAC::add_multicast_group(const uint8_t *addr) +{ + /* No-op at this stage */ +} + +void RDA5981x_EMAC::remove_multicast_group(const uint8_t *addr) +{ + /* No-op at this stage */ +} + +void RDA5981x_EMAC::set_all_multicast(bool all) +{ + /* No-op at this stage */ +} + +void RDA5981x_EMAC::power_down() +{ + /* No-op at this stage */ +} + +void RDA5981x_EMAC::set_memory_manager(EMACMemoryManager &mem_mngr) +{ + memory_manager = &mem_mngr; +} + +RDA5981x_EMAC &RDA5981x_EMAC::get_instance() +{ + static RDA5981x_EMAC emac; + return emac; +} + +// Weak so a module can override +MBED_WEAK EMAC &EMAC::get_default_instance() +{ + return RDA5981x_EMAC::get_instance(); +} + diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.h new file mode 100644 index 0000000000..62fda7374d --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.h @@ -0,0 +1,161 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 STM32_EMAC_H_ +#define STM32_EMAC_H_ + +#include "EMAC.h" +#include "rtos/Semaphore.h" +#include "rtos/Mutex.h" + +class RDA5981x_EMAC : public EMAC { +public: + RDA5981x_EMAC(); + + static RDA5981x_EMAC &get_instance(); + + /** + * Return maximum transmission unit + * + * @return MTU in bytes + */ + virtual uint32_t get_mtu_size() const; + + /** + * Gets memory buffer alignment preference + * + * Gets preferred memory buffer alignment of the Emac device. IP stack may or may not + * align link out memory buffer chains using the alignment. + * + * @return Memory alignment requirement in bytes + */ + virtual uint32_t get_align_preference() const; + + /** + * Return interface name + * + * @param name Pointer to where the name should be written + * @param size Maximum number of character to copy + */ + virtual void get_ifname(char *name, uint8_t size) const; + + /** + * Returns size of the underlying interface HW address size. + * + * @return HW address size in bytes + */ + virtual uint8_t get_hwaddr_size() const; + + /** + * Return interface-supplied HW address + * + * Copies HW address to provided memory, @param addr has to be of correct size see @a get_hwaddr_size + * + * HW address need not be provided if this interface does not have its own HW + * address configuration; stack will choose address from central system + * configuration if the function returns false and does not write to addr. + * + * @param addr HW address for underlying interface + * @return true if HW address is available + */ + virtual bool get_hwaddr(uint8_t *addr) const; + + /** + * Set HW address for interface + * + * Provided address has to be of correct size, see @a get_hwaddr_size + * + * Called to set the MAC address to actually use - if @a get_hwaddr is provided + * the stack would normally use that, but it could be overridden, eg for test + * purposes. + * + * @param addr Address to be set + */ + virtual void set_hwaddr(const uint8_t *addr); + + /** + * Sends the packet over the link + * + * That can not be called from an interrupt context. + * + * @param buf Packet to be send + * @return True if the packet was send successfully, False otherwise + */ + virtual bool link_out(emac_mem_buf_t *buf); + + /** + * Initializes the HW + * + * @return True on success, False in case of an error. + */ + virtual bool power_up(); + + /** + * Deinitializes the HW + * + */ + virtual void power_down(); + + /** + * Sets a callback that needs to be called for packets received for that interface + * + * @param input_cb Function to be register as a callback + */ + virtual void set_link_input_cb(emac_link_input_cb_t input_cb); + + /** + * Sets a callback that needs to be called on link status changes for given interface + * + * @param state_cb Function to be register as a callback + */ + virtual void set_link_state_cb(emac_link_state_change_cb_t state_cb); + + /** Add device to a multicast group + * + * @param address A multicast group hardware address + */ + virtual void add_multicast_group(const uint8_t *address); + + /** Remove device from a multicast group + * + * @param address A multicast group hardware address + */ + virtual void remove_multicast_group(const uint8_t *address); + + /** Request reception of all multicast packets + * + * @param all True to receive all multicasts + * False to receive only multicasts addressed to specified groups + */ + virtual void set_all_multicast(bool all); + + /** Sets memory manager that is used to handle memory buffers + * + * @param mem_mngr Pointer to memory manager + */ + virtual void set_memory_manager(EMACMemoryManager &mem_mngr); + +private: + void packet_rx(); + emac_mem_buf_t * low_level_input(u8_t *data, int len); + static void thread_function(void *pvParameters); + emac_link_input_cb_t emac_link_input_cb; /**< Callback for incoming data */ + emac_link_state_change_cb_t emac_link_state_cb; /**< Link state change callback */ + EMACMemoryManager *memory_manager; /**< Memory manager */ + +}; + +#endif /* K64F_EMAC_H_ */ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac_config.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac_config.h new file mode 100644 index 0000000000..717d423bfe --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac_config.h @@ -0,0 +1,22 @@ +/* Copyright (c) 2019 Unisoc Communications Inc. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 STM32XX_EMAC_CONFIG_H__ +#define STM32XX_EMAC_CONFIG_H__ + +#define THREAD_STACKSIZE 512 + +#endif // #define STM32XX_EMAC_CONFIG_H__ diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/device/RDA5991H.h b/targets/TARGET_RDA/TARGET_UNO_91H/device/RDA5991H.h index 5427afc6a2..288faada83 100644 --- a/targets/TARGET_RDA/TARGET_UNO_91H/device/RDA5991H.h +++ b/targets/TARGET_RDA/TARGET_UNO_91H/device/RDA5991H.h @@ -1,27 +1,17 @@ -/****************************************************************************** - * @file RDA5991H.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File for - * RDA RDA5991H Device Series - * @version: V1.09 - * @date: 07. June 2018 +/* Copyright (c) 2019 Unisoc Communications Inc. * - * @note - * Copyright (C) 2009 ARM Limited. All rights reserved. + * 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 * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. + * http://www.apache.org/licenses/LICENSE-2.0 * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - + * 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 __RDA5991H_H__ #define __RDA5991H_H__ diff --git a/targets/TARGET_RDA/TARGET_UNO_91H/trng_api.c b/targets/TARGET_RDA/TARGET_UNO_91H/trng_api.c index 810531b86b..295db4a6bf 100644 --- a/targets/TARGET_RDA/TARGET_UNO_91H/trng_api.c +++ b/targets/TARGET_RDA/TARGET_UNO_91H/trng_api.c @@ -118,4 +118,14 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l return ret; } +int rda_trng_get_bytes(unsigned char *output, size_t len) +{ + size_t temp; + trng_t trng_obj; + trng_init(&trng_obj); + int ret = trng_get_bytes(&trng_obj, output, len, &temp); + trng_free(&trng_obj); + return ret; +} + #endif diff --git a/targets/targets.json b/targets/targets.json index 3e7450ffd5..d1286ffea5 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -8058,7 +8058,7 @@ "inherits": ["Target"], "core": "Cortex-M4F", "public": true, - "extra_labels": ["RDA", "UNO_91H", "FLASH_CMSIS_ALGO"], + "extra_labels": ["RDA", "UNO_91H", "FLASH_CMSIS_ALGO", "RDA_EMAC"], "supported_toolchains": ["ARM", "GCC_ARM", "IAR"], "macros": ["TWO_RAM_REGIONS", "CMSIS_NVIC_VIRTUAL", "CMSIS_NVIC_VIRTUAL_HEADER_FILE=\"RDA5981_nvic_virtual.h\""], "device_has": [ @@ -8067,6 +8067,7 @@ "PORTOUT", "PORTINOUT", "INTERRUPTIN", + "EMAC", "SERIAL", "STDIO_MESSAGES", "PWMOUT", @@ -8080,7 +8081,10 @@ }, "UNO_91H": { "inherits": ["RDA5981X"], - "detect_code": ["8001"] + "detect_code": ["8001"], + "overrides": { + "network-default-interface-type" : "WIFI" + } }, "GD32_Target": { "inherits": ["Target"], From c4e6275d7e12ea169a9f5499a4ddbb3f83a5a188 Mon Sep 17 00:00:00 2001 From: Hasnain Virk Date: Thu, 10 Jan 2019 12:01:30 +0200 Subject: [PATCH 036/109] Doxygen correction Adding to proper group so that the API doxygen appears into the class hierarchy group rather than data strutures. --- features/nfc/nfc/NFCController.h | 19 ++++++++----------- features/nfc/nfc/NFCEEPROM.h | 14 +++++--------- features/nfc/nfc/ndef/MessageBuilder.h | 13 +++++-------- features/nfc/nfc/ndef/MessageParser.h | 15 +++++---------- .../nfc/nfc/ndef/common/SimpleMessageParser.h | 14 ++++++-------- 5 files changed, 29 insertions(+), 46 deletions(-) diff --git a/features/nfc/nfc/NFCController.h b/features/nfc/nfc/NFCController.h index fffb5e1ab2..945d248811 100644 --- a/features/nfc/nfc/NFCController.h +++ b/features/nfc/nfc/NFCController.h @@ -1,4 +1,6 @@ -/* mbed Microcontroller Library +/** @file NFCController.h + * + * mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -31,15 +33,14 @@ namespace mbed { namespace nfc { +/** @addtogroup nfc + * @{ + */ + class NFCRemoteInitiator; class NFCRemoteTarget; class NFCControllerDriver; -/** - * @addtogroup nfc - * @{ - */ - /** * This class represents a NFC Controller. * @@ -178,11 +179,7 @@ private: bool _discovery_running; Span _ndef_buffer; }; - -/** - * @} - */ - +/** @}*/ } // namespace nfc } // namespace mbed diff --git a/features/nfc/nfc/NFCEEPROM.h b/features/nfc/nfc/NFCEEPROM.h index 1e940c745a..b06c2836a7 100644 --- a/features/nfc/nfc/NFCEEPROM.h +++ b/features/nfc/nfc/NFCEEPROM.h @@ -1,4 +1,6 @@ -/* mbed Microcontroller Library +/** @file NFCEEPROM.h + * + * mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,8 +29,7 @@ namespace mbed { namespace nfc { -/** - * @addtogroup nfc +/** @addtogroup nfc * @{ */ @@ -153,12 +154,7 @@ private: uint32_t _eeprom_address; nfc_err_t _operation_result; }; - -/** - * @} - */ - - +/** @}*/ } // namespace nfc } // namespace mbed diff --git a/features/nfc/nfc/ndef/MessageBuilder.h b/features/nfc/nfc/ndef/MessageBuilder.h index 0b2437108e..2564675897 100644 --- a/features/nfc/nfc/ndef/MessageBuilder.h +++ b/features/nfc/nfc/ndef/MessageBuilder.h @@ -1,4 +1,6 @@ -/* mbed Microcontroller Library +/** @file MessageBuilder.h + * + * mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,8 +29,7 @@ namespace mbed { namespace nfc { namespace ndef { -/** - * @addtogroup nfc +/** @addtogroup nfc * @{ */ @@ -189,11 +190,7 @@ private: bool _message_ended; bool _in_chunk; }; - -/** - * @} - */ - +/** @}*/ } // namespace ndef } // namespace nfc } // namespace mbed diff --git a/features/nfc/nfc/ndef/MessageParser.h b/features/nfc/nfc/ndef/MessageParser.h index 41c4a9e3a3..55a0e6e5fd 100644 --- a/features/nfc/nfc/ndef/MessageParser.h +++ b/features/nfc/nfc/ndef/MessageParser.h @@ -1,4 +1,6 @@ -/* mbed Microcontroller Library +/** @file MessageParser.h + * + * mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,19 +20,16 @@ #define NFC_NDEF_MESSAGEPARSER_H_ #include - #include "platform/Span.h" namespace mbed { namespace nfc { namespace ndef { -/** - * @addtogroup nfc +/** @addtogroup nfc * @{ */ - // Forward declaration class Record; @@ -165,11 +164,7 @@ private: Delegate *_delegate; }; - -/** - * @} - */ - +/** @}*/ } // namespace ndef } // namespace nfc } // namespace mbed diff --git a/features/nfc/nfc/ndef/common/SimpleMessageParser.h b/features/nfc/nfc/ndef/common/SimpleMessageParser.h index a4da0049f9..7ba7e9db91 100644 --- a/features/nfc/nfc/ndef/common/SimpleMessageParser.h +++ b/features/nfc/nfc/ndef/common/SimpleMessageParser.h @@ -1,4 +1,6 @@ -/* mbed Microcontroller Library +/** @file SimpleMessageParser.h + * + * mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -30,8 +32,7 @@ namespace nfc { namespace ndef { namespace common { -/** - * @addtogroup nfc +/** @addtogroup nfc * @{ */ @@ -161,14 +162,11 @@ private: MimeParser _mime_parser; Delegate *_delegate; }; - -/** - * @} - */ - +/** @}*/ } // namespace common } // namespace ndef } // namespace nfc } // namespace mbed #endif /* NFC_COMMON_SIMPLEMESSAGEPARSER_H_ */ + From 8fe844db2bd7621fab8098daadb06d0a3297ad20 Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Tue, 12 Feb 2019 16:20:25 -0600 Subject: [PATCH 037/109] platform: fix build warning in mbed_error Fix the following build warning Compile [ 83.4%]: mbed_error.c [Warning] mbed_error.c@71,21: 'compute_crc32' defined but not used [-Wunused-function] compute_crc32 usage is guraded with #define, but not the definition. Use the same #define around the definition of compute_crc32() --- platform/mbed_error.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/mbed_error.c b/platform/mbed_error.c index c1ee19d6fd..b34dfb23d7 100644 --- a/platform/mbed_error.c +++ b/platform/mbed_error.c @@ -49,15 +49,14 @@ static core_util_atomic_flag halt_in_progress = CORE_UTIL_ATOMIC_FLAG_INIT; static int error_count = 0; static mbed_error_ctx first_error_ctx = {0}; +static mbed_error_ctx last_error_ctx = {0}; +static mbed_error_hook_t error_hook = NULL; +static mbed_error_status_t handle_error(mbed_error_status_t error_status, unsigned int error_value, const char *filename, int line_number, void *caller); + #if MBED_CONF_PLATFORM_CRASH_CAPTURE_ENABLED //Global for populating the context in exception handler static mbed_error_ctx *const report_error_ctx = (mbed_error_ctx *)(ERROR_CONTEXT_LOCATION); static bool is_reboot_error_valid = false; -#endif - -static mbed_error_ctx last_error_ctx = {0}; -static mbed_error_hook_t error_hook = NULL; -static mbed_error_status_t handle_error(mbed_error_status_t error_status, unsigned int error_value, const char *filename, int line_number, void *caller); //Helper function to calculate CRC //NOTE: It would have been better to use MbedCRC implementation. But @@ -88,6 +87,7 @@ static unsigned int compute_crc32(const void *data, int datalen) return crc; } +#endif //Helper function to halt the system static MBED_NORETURN void mbed_halt_system(void) From 9891168c61f52d45b651483359a279907109cf69 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Tue, 12 Feb 2019 15:40:11 +0200 Subject: [PATCH 038/109] Greentea tests: set correct port to test against google.com --- TESTS/netsocket/tls/tlssocket_handshake_invalid.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TESTS/netsocket/tls/tlssocket_handshake_invalid.cpp b/TESTS/netsocket/tls/tlssocket_handshake_invalid.cpp index c5c1a187df..0417afb1c3 100644 --- a/TESTS/netsocket/tls/tlssocket_handshake_invalid.cpp +++ b/TESTS/netsocket/tls/tlssocket_handshake_invalid.cpp @@ -31,8 +31,8 @@ void TLSSOCKET_HANDSHAKE_INVALID() TLSSocket sock; TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.open(NetworkInterface::get_default_instance())); TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.set_root_ca_cert(tls_global::cert)); - TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, - sock.connect("google.com", MBED_CONF_APP_ECHO_SERVER_DISCARD_PORT_TLS)); + TEST_ASSERT_EQUAL(NSAPI_ERROR_AUTH_FAILURE, + sock.connect("google.com", 443)); // 443 is https port. TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.close()); } From 88c5b8da79a58747f2cf3b42c6748df7386e2bd4 Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Tue, 12 Feb 2019 15:38:42 -0600 Subject: [PATCH 039/109] target: UBLOX: Fix build warning in UBLOX_AT_CellularNetwork.cpp Fix this build warning seen when building with ARMCC Compile [ 13.7%]: UBLOX_AT_CellularNetwork.cpp [Warning] UBLOX_AT_CellularNetwork.cpp@65,0: #111-D: statement is unreachable --- .../framework/targets/UBLOX/AT/UBLOX_AT_CellularNetwork.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/features/cellular/framework/targets/UBLOX/AT/UBLOX_AT_CellularNetwork.cpp b/features/cellular/framework/targets/UBLOX/AT/UBLOX_AT_CellularNetwork.cpp index 1491deee60..24b6a19c72 100644 --- a/features/cellular/framework/targets/UBLOX/AT/UBLOX_AT_CellularNetwork.cpp +++ b/features/cellular/framework/targets/UBLOX/AT/UBLOX_AT_CellularNetwork.cpp @@ -38,6 +38,8 @@ AT_CellularNetwork::RegistrationMode UBLOX_AT_CellularNetwork::has_registration( nsapi_error_t UBLOX_AT_CellularNetwork::set_access_technology_impl(RadioAccessTechnology opRat) { + nsapi_error_t ret = NSAPI_ERROR_OK; + switch (opRat) { #if defined(TARGET_UBLOX_C030_U201) || defined(TARGET_UBLOX_C027) case RAT_GSM: @@ -63,9 +65,9 @@ nsapi_error_t UBLOX_AT_CellularNetwork::set_access_technology_impl(RadioAccessTe #endif default: { _op_act = RAT_UNKNOWN; - return NSAPI_ERROR_UNSUPPORTED; + ret = NSAPI_ERROR_UNSUPPORTED; } } - return NSAPI_ERROR_OK; + return(ret); } From 1b0f7afee91220fa957ab97117e24481d595c124 Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Tue, 12 Feb 2019 16:35:15 -0600 Subject: [PATCH 040/109] nanostack: icmpv6: fix build warning Fix the following build warning seen when building with GCC Compile [ 54.2%]: icmpv6.c [Warning] icmpv6.c@1091,16: this statement may fall through [-Wimplicit-fallthrough=] --- .../sal-stack-nanostack/source/Common_Protocols/icmpv6.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/nanostack/sal-stack-nanostack/source/Common_Protocols/icmpv6.c b/features/nanostack/sal-stack-nanostack/source/Common_Protocols/icmpv6.c index 2dd17b9143..3059e68265 100644 --- a/features/nanostack/sal-stack-nanostack/source/Common_Protocols/icmpv6.c +++ b/features/nanostack/sal-stack-nanostack/source/Common_Protocols/icmpv6.c @@ -1084,7 +1084,7 @@ buffer_t *icmpv6_up(buffer_t *buf) case ICMPV6_TYPE_INFO_ECHO_REPLY: ipv6_neighbour_reachability_confirmation(buf->src_sa.address, buf->interface->id); - /* fall through */ + /* fall through */ case ICMPV6_TYPE_ERROR_DESTINATION_UNREACH: #ifdef HAVE_RPL_ROOT @@ -1092,7 +1092,7 @@ buffer_t *icmpv6_up(buffer_t *buf) buf = rpl_control_source_route_error_handler(buf, cur); } #endif - /* no break */ + /* fall through */ default: if (buf) { From 8e843163d2d59e1a851e01cd8e11f77ee60b8245 Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Tue, 12 Feb 2019 16:57:35 -0600 Subject: [PATCH 041/109] features: nanostack: fix warning in thread_extension.h Fix the following build warning seen with GCC Compile [ 51.2%]: thread_bootstrap.c [Warning] thread_extension.h@88,44: statement with no effect [-Wunused-value] --- .../source/6LoWPAN/Thread/thread_extension.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/nanostack/sal-stack-nanostack/source/6LoWPAN/Thread/thread_extension.h b/features/nanostack/sal-stack-nanostack/source/6LoWPAN/Thread/thread_extension.h index b6f64d1e90..2e9fd3d41f 100644 --- a/features/nanostack/sal-stack-nanostack/source/6LoWPAN/Thread/thread_extension.h +++ b/features/nanostack/sal-stack-nanostack/source/6LoWPAN/Thread/thread_extension.h @@ -85,7 +85,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_ #define thread_extension_version_check(version) (false) #define thread_extension_discover_response_read(nwk_info, discover_response_tlv, data_ptr, data_len) ((void) 0) #define thread_extension_discover_response_tlv_write(data, version, securityPolicy) ((void) 0) -#define thread_extension_service_init(cur) (0) +#define thread_extension_service_init(cur) ((void) 0) #define thread_extension_joining_enabled(interface_id) (false) #define thread_extension_discover_response_len(cur) (0) #define thread_extension_discover_response_write(cur, ptr) (ptr) From 352585420dfe33a6ceb7233b001686708b5b192a Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Tue, 12 Feb 2019 15:26:31 -0600 Subject: [PATCH 042/109] btle: fix build warning about unused clockConfiguration Fix the following build warning seen with both GCC and ARM_CC [Warning] btle.cpp@115,0: #177-D: variable "clockConfiguration" was declared but never referenced --- .../TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp index a0ce8bbeb9..962ddef9b7 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp @@ -112,7 +112,6 @@ static uint32_t signalEvent() error_t btle_init(void) { - nrf_clock_lf_cfg_t clockConfiguration; ret_code_t err_code; // register softdevice handler vector @@ -122,6 +121,7 @@ error_t btle_init(void) err_code = nrf_sdh_enable_request(); ASSERT_STATUS(err_code); #else + nrf_clock_lf_cfg_t clockConfiguration; // Configure the LF clock according to values provided by btle_clock.h. // It is input from the chain of the yotta configuration system. clockConfiguration.source = LFCLK_CONF_SOURCE; From 1c88e0fa11a72f9bfcca3a6390c672e797db5149 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Thu, 7 Feb 2019 18:10:02 +0200 Subject: [PATCH 043/109] ESP8266: connect() can handle ESP's errors. ESP8266Interface::connect() checks the exact return value from the underlying ESP8266::connect() call. Increased timeout for network-wifi greentea tests to 6 minutes. --- TESTS/network/wifi/main.cpp | 2 +- .../wifi/esp8266-driver/ESP8266Interface.cpp | 18 +++++++++++------- .../wifi/esp8266-driver/ESP8266Interface.h | 1 + 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/TESTS/network/wifi/main.cpp b/TESTS/network/wifi/main.cpp index aeb139137a..10d5c4c4df 100644 --- a/TESTS/network/wifi/main.cpp +++ b/TESTS/network/wifi/main.cpp @@ -52,7 +52,7 @@ using namespace utest::v1; utest::v1::status_t test_setup(const size_t number_of_cases) { - GREENTEA_SETUP(240, "default_auto"); + GREENTEA_SETUP(360, "default_auto"); return verbose_test_setup_handler(number_of_cases); } diff --git a/components/wifi/esp8266-driver/ESP8266Interface.cpp b/components/wifi/esp8266-driver/ESP8266Interface.cpp index eea53d71a4..1f3ea4b592 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.cpp +++ b/components/wifi/esp8266-driver/ESP8266Interface.cpp @@ -58,6 +58,7 @@ ESP8266Interface::ESP8266Interface() _if_blocking(true), _if_connected(_cmutex), _initialized(false), + _connect_retval(NSAPI_ERROR_OK), _conn_stat(NSAPI_STATUS_DISCONNECTED), _conn_stat_cb(NULL), _global_event_queue(NULL), @@ -187,8 +188,12 @@ void ESP8266Interface::_connect_async() _cmutex.unlock(); return; } - - if (_esp.connect(ap_ssid, ap_pass) != NSAPI_ERROR_OK) { + _connect_retval = _esp.connect(ap_ssid, ap_pass); + if (_connect_retval == NSAPI_ERROR_OK || _connect_retval == NSAPI_ERROR_AUTH_FAILURE + || _connect_retval == NSAPI_ERROR_NO_SSID) { + _connect_event_id = 0; + _if_connected.notify_all(); + } else { // Postpone to give other stuff time to run _connect_event_id = _global_event_queue->call_in(ESP8266_CONNECT_TIMEOUT, callback(this, &ESP8266Interface::_connect_async)); @@ -196,9 +201,6 @@ void ESP8266Interface::_connect_async() MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER, MBED_ERROR_CODE_ENOMEM), \ "_connect_async(): unable to add event to queue"); } - } else { - _connect_event_id = 0; - _if_connected.notify_all(); } _cmutex.unlock(); } @@ -235,6 +237,7 @@ int ESP8266Interface::connect() _cmutex.lock(); + _connect_retval = NSAPI_ERROR_NO_CONNECTION; MBED_ASSERT(!_connect_event_id); _connect_event_id = _global_event_queue->call(callback(this, &ESP8266Interface::_connect_async)); @@ -243,13 +246,14 @@ int ESP8266Interface::connect() "connect(): unable to add event to queue"); } - while (_if_blocking && (_conn_status_to_error() != NSAPI_ERROR_IS_CONNECTED)) { + while (_if_blocking && (_conn_status_to_error() != NSAPI_ERROR_IS_CONNECTED) + && (_connect_retval == NSAPI_ERROR_NO_CONNECTION)) { _if_connected.wait(); } _cmutex.unlock(); - return NSAPI_ERROR_OK; + return _connect_retval; } int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security) diff --git a/components/wifi/esp8266-driver/ESP8266Interface.h b/components/wifi/esp8266-driver/ESP8266Interface.h index f123cf27cd..93d455120f 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.h +++ b/components/wifi/esp8266-driver/ESP8266Interface.h @@ -368,6 +368,7 @@ private: bool _get_firmware_ok(); nsapi_error_t _init(void); void _hw_reset(); + nsapi_error_t _connect_retval; //sigio struct { From c05fca23162e044939679c93f41766f6c0a77574 Mon Sep 17 00:00:00 2001 From: Steve Cartmell Date: Mon, 11 Feb 2019 18:46:49 +0000 Subject: [PATCH 044/109] revert: "Refactor sleep tracing driver identifier to be pointer to the driver filepath." This reverts commit 9a0e8797b9b9fc32f6ce8f5fc508a43ff76b42f8. --- platform/mbed_sleep_manager.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/platform/mbed_sleep_manager.c b/platform/mbed_sleep_manager.c index c1d4c9b510..c792c783de 100644 --- a/platform/mbed_sleep_manager.c +++ b/platform/mbed_sleep_manager.c @@ -73,11 +73,14 @@ us_timestamp_t mbed_time_deepsleep(void) #ifdef MBED_SLEEP_TRACING_ENABLED +// Length of the identifier extracted from the driver name to store for logging. +#define IDENTIFIER_WIDTH 15 + // Number of drivers that can be stored in the structure #define STATISTIC_COUNT 10 typedef struct sleep_statistic { - const char *identifier; + char identifier[IDENTIFIER_WIDTH]; uint8_t count; } sleep_statistic_t; @@ -85,8 +88,13 @@ static sleep_statistic_t sleep_stats[STATISTIC_COUNT]; static sleep_statistic_t *sleep_tracker_find(const char *const filename) { + char temp[IDENTIFIER_WIDTH]; + strncpy(temp, filename, IDENTIFIER_WIDTH); + temp[IDENTIFIER_WIDTH - 1] = '\0'; + + // Search for the a driver matching the current name and return it's index for (int i = 0; i < STATISTIC_COUNT; ++i) { - if (sleep_stats[i].identifier == filename) { + if (strcmp(sleep_stats[i].identifier, temp) == 0) { return &sleep_stats[i]; } } @@ -96,9 +104,15 @@ static sleep_statistic_t *sleep_tracker_find(const char *const filename) static sleep_statistic_t *sleep_tracker_add(const char *const filename) { + char temp[IDENTIFIER_WIDTH]; + strncpy(temp, filename, IDENTIFIER_WIDTH); + temp[IDENTIFIER_WIDTH - 1] = '\0'; + for (int i = 0; i < STATISTIC_COUNT; ++i) { - if (sleep_stats[i].identifier == NULL) { - sleep_stats[i].identifier = filename; + if (sleep_stats[i].identifier[0] == '\0') { + core_util_critical_section_enter(); + strncpy(sleep_stats[i].identifier, temp, sizeof(temp)); + core_util_critical_section_exit(); return &sleep_stats[i]; } @@ -117,7 +131,7 @@ static void sleep_tracker_print_stats(void) continue; } - if (sleep_stats[i].identifier == NULL) { + if (sleep_stats[i].identifier[0] == '\0') { return; } From 14061854f1d444b57d62fe01f8220ac763e6a489 Mon Sep 17 00:00:00 2001 From: Oren Cohen Date: Wed, 13 Feb 2019 21:09:33 +0200 Subject: [PATCH 045/109] Add release notes section to PR template --- .github/pull_request_template.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e3ecdd70b2..289c5740a3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,15 +1,15 @@ ### Description - ### Pull request type - +### Release Notes + + From d17a5c8b5d819b0a6fca939dfe4795452971650d Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Wed, 6 Feb 2019 14:32:14 -0600 Subject: [PATCH 046/109] Do not provide a default Pelion host address. This moves the default pelion host address to be assigned by the cloud sdk. It also cleans up the logic a bit to be shorter. --- tools/device_management.py | 47 ++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/tools/device_management.py b/tools/device_management.py index 74a6c22edc..2ad7d26416 100644 --- a/tools/device_management.py +++ b/tools/device_management.py @@ -23,7 +23,6 @@ import logging import sys import argparse from os.path import join, abspath, dirname, basename -from os import getenv from manifesttool import create, parse, verify, cert, init, update from manifesttool.argparser import MainArgumentParser @@ -31,9 +30,6 @@ from mbed_cloud import AccountManagementAPI, CertificatesAPI import colorama colorama.init() -from utils import (generate_update_filename) - - LOG = logging.getLogger(__name__) LOG_FORMAT = '[%(levelname)s] %(asctime)s - %(name)s - %(message)s' @@ -43,6 +39,7 @@ sys.path.insert(0, ROOT) from tools.config import Config from tools.options import extract_mcus +from tools.utils import generate_update_filename class MbedExtendedArgs(MainArgumentParser): @@ -91,24 +88,30 @@ def wrap_payload(func): def wrap_init(func): def inner(options): - if getattr(options, 'api_key', None): - api_key = options.api_key - else: - api_key = getenv("MBED_CLOUD_SDK_API_KEY") - if getattr(options, 'server_address', None): - host_addr = options.server_address - else: - host_addr = getenv("MBED_CLOUD_SDK_HOST", - "https://api.us-east-1.mbedcloud.com/") - config = { - "api_key": api_key, - "host": host_addr, - } - accounts = AccountManagementAPI(config) - certs = CertificatesAPI(config) - api_key = accounts.list_api_keys(filter={ - 'key': api_key - }).next() + config = {} + if getattr(options, 'api_key'): + config["api_key"] = options.api_key + if getattr(options, 'server_address'): + config["host"] = options.server_address + + try: + accounts = AccountManagementAPI(config) + certs = CertificatesAPI(config) + except Exception as e: + LOG.error( + 'Missing api key. Set it with ' + '"mbed config -G CLOUD_SDK_API_KEY "' + ) + exit(1) + + # Get the currently in-use API key (may come from environment or + # configuration files, which is handled by the cloud SDK) + api_key_value = accounts.config.get("api_key") + api_key = accounts.list_api_keys( + filter={ + "key": api_key_value + } + ).next() certificates_owned = list(certs.list_certificates()) dev_cert_info = None for certif in certificates_owned: From bb2e41314658077f0e0c563700487252d2175edb Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Wed, 13 Feb 2019 17:56:09 -0600 Subject: [PATCH 047/109] Add .inc as a header file type. Currently, if you were to add a directory that only contained .inc files, this file would not be passed as an include path to the compiler. This ensures that .inc files are also considered header files. --- tools/resources/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/resources/__init__.py b/tools/resources/__init__.py index 243b6c0c5d..5da087fa7d 100644 --- a/tools/resources/__init__.py +++ b/tools/resources/__init__.py @@ -418,6 +418,7 @@ class Resources(object): ".h": FileType.HEADER, ".hh": FileType.HEADER, ".hpp": FileType.HEADER, + ".inc": FileType.HEADER, ".o": FileType.OBJECT, ".hex": FileType.HEX, ".bin": FileType.BIN, From ec3093b3dbcba8fbb0377563a75224f83f604d9d Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Thu, 14 Feb 2019 10:17:59 -0600 Subject: [PATCH 048/109] tools/utils: ensure default build profiles are processed first The command-line argument '--profile' looks for build profiles provided in mbed-os/tools/profiles/. If a directory name exists in the root folder with the same name as one of the profile names provided by default [e.g debug/develop/release], that directory is processed instead resulting in incorrect behavior. Fix this behavior by processing the default profiles first. --- tools/utils.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/utils.py b/tools/utils.py index ad5db06fdf..37d6c885f7 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -495,10 +495,12 @@ def argparse_profile_filestring_type(string): absolute path or a file name (expanded to mbed-os/tools/profiles/.json) of a existing file""" fpath = join(dirname(__file__), "profiles/{}.json".format(string)) - if exists(string): - return string - elif exists(fpath): + + # default profiles are searched first, local ones next. + if exists(fpath): return fpath + elif exists(string): + return string else: raise argparse.ArgumentTypeError( "{0} does not exist in the filesystem.".format(string)) From f14828e8c6bcd3c9017b2e3801e0c5b0d93daa3f Mon Sep 17 00:00:00 2001 From: Amir Cohen Date: Thu, 14 Feb 2019 17:30:51 +0200 Subject: [PATCH 049/109] Add flash sum check Check that flash size sum up to all sectors combined --- TESTS/mbed_drivers/flashiap/main.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/TESTS/mbed_drivers/flashiap/main.cpp b/TESTS/mbed_drivers/flashiap/main.cpp index 9cd3cd861b..28249eeaf2 100644 --- a/TESTS/mbed_drivers/flashiap/main.cpp +++ b/TESTS/mbed_drivers/flashiap/main.cpp @@ -29,6 +29,17 @@ #include "mbed.h" +// Debug available +#ifndef FLASHIAP_DEBUG +#define FLASHIAP_DEBUG 0 +#endif + +#if FLASHIAP_DEBUG +#define DEBUG_PRINTF(...) printf(__VA_ARGS__) +#else +#define DEBUG_PRINTF(...) +#endif + using namespace utest::v1; @@ -37,6 +48,21 @@ void flashiap_init_test() FlashIAP flash_device; uint32_t ret = flash_device.init(); TEST_ASSERT_EQUAL_INT32(0, ret); + + uint32_t flash_start = flash_device.get_flash_start(); + uint32_t flash_size = flash_device.get_flash_size(); + utest_printf("Flash address: 0x%08x, size: %d\n", flash_start, flash_size); + uint32_t address = flash_start; + int num = 0; + while (flash_size) { + uint32_t sector_size = flash_device.get_sector_size(address); + // Make sure all sectors sum up to the total flash size + TEST_ASSERT(flash_size >= sector_size); + DEBUG_PRINTF("\tsector %3d: address 0x%08x, size %8d\n", num++, address, sector_size); + flash_size -= sector_size; + address += sector_size; + } + ret = flash_device.deinit(); TEST_ASSERT_EQUAL_INT32(0, ret); } From 9c519c2fa3cc13e0af846a97c2bd2ef3a7b4ddeb Mon Sep 17 00:00:00 2001 From: Hasnain Virk Date: Mon, 4 Feb 2019 14:58:21 +0200 Subject: [PATCH 050/109] Including CTest explicitly enable_test() seems to include CTest framework in the CMakeLists.txt but that would result in inconsistencies and CTest framework will not be able to find DartConfiguration file or MemCheck tool. Including CTest framework explicitely in the CMakeLists.txt seems to solve the issue. --- UNITTESTS/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UNITTESTS/CMakeLists.txt b/UNITTESTS/CMakeLists.txt index 7e93bf5c68..112aa373ea 100644 --- a/UNITTESTS/CMakeLists.txt +++ b/UNITTESTS/CMakeLists.txt @@ -59,7 +59,7 @@ target_include_directories(gmock_main SYSTEM BEFORE INTERFACE # TESTING #################### -enable_testing() +include(CTest) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_BINARY_DIR}/Testing" From c433a144e7ae6ed7def8f150e3583742c46625bc Mon Sep 17 00:00:00 2001 From: Hasnain Virk Date: Mon, 4 Feb 2019 15:01:35 +0200 Subject: [PATCH 051/109] Proper size checking for link ADR commands In a specific branch path 'adr_settings' in link_adr_request() API, the structure adr_settings of type link_adr_params_t will be rendered uninitialized. To prevent this we initialize the construct as zero. In addition to that, to handle the case properly we should check for the command identifier and the command payload length anticipating contiguous blocks of adr commands. If we find a discrepency in size, we should abort. --- .../lorawan/lorastack/mac/LoRaMacCommand.cpp | 15 +++++++++++---- features/lorawan/lorastack/phy/LoRaPHY.cpp | 16 +++++++++++++--- features/lorawan/lorastack/phy/LoRaPHY.h | 3 ++- features/lorawan/lorastack/phy/LoRaPHYAU915.cpp | 13 +++++++++++-- features/lorawan/lorastack/phy/LoRaPHYCN470.cpp | 16 +++++++++++++--- features/lorawan/lorastack/phy/LoRaPHYUS915.cpp | 13 +++++++++++-- 6 files changed, 61 insertions(+), 15 deletions(-) diff --git a/features/lorawan/lorastack/mac/LoRaMacCommand.cpp b/features/lorawan/lorastack/mac/LoRaMacCommand.cpp index b3447cde7f..d2ebf397ff 100644 --- a/features/lorawan/lorastack/mac/LoRaMacCommand.cpp +++ b/features/lorawan/lorastack/mac/LoRaMacCommand.cpp @@ -149,7 +149,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(const uint8_t *payload, ui int8_t link_adr_dr = DR_0; int8_t link_adr_txpower = TX_POWER_0; uint8_t link_adr_nbtrans = 0; - uint8_t link_adr_nb_bytes_pasred = 0; + uint8_t link_adr_nb_bytes_parsed = 0; // Fill parameter structure link_adr_req.payload = &payload[mac_index - 1]; @@ -165,7 +165,14 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(const uint8_t *payload, ui &link_adr_dr, &link_adr_txpower, &link_adr_nbtrans, - &link_adr_nb_bytes_pasred); + &link_adr_nb_bytes_parsed); + + // If nothing was consumed, we have a malformed packet at our hand + // we bin everything and return. link_adr_nb_bytes_parsed being 0 is + // a magic identifier letting us know that there are payload inconsistencies + if (link_adr_nb_bytes_parsed == 0) { + return LORAWAN_STATUS_UNSUPPORTED; + } if ((status & 0x07) == 0x07) { mac_sys_params.channel_data_rate = link_adr_dr; @@ -174,11 +181,11 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(const uint8_t *payload, ui } // Add the answers to the buffer - for (uint8_t i = 0; i < (link_adr_nb_bytes_pasred / 5); i++) { + for (uint8_t i = 0; i < (link_adr_nb_bytes_parsed / 5); i++) { ret_value = add_link_adr_ans(status); } // Update MAC index - mac_index += link_adr_nb_bytes_pasred - 1; + mac_index += link_adr_nb_bytes_parsed - 1; } break; case SRV_MAC_DUTY_CYCLE_REQ: diff --git a/features/lorawan/lorastack/phy/LoRaPHY.cpp b/features/lorawan/lorastack/phy/LoRaPHY.cpp index 1e6cc64169..dd3cba9217 100644 --- a/features/lorawan/lorastack/phy/LoRaPHY.cpp +++ b/features/lorawan/lorastack/phy/LoRaPHY.cpp @@ -309,11 +309,12 @@ lorawan_time_t LoRaPHY::update_band_timeoff(bool joined, bool duty_cycle, } uint8_t LoRaPHY::parse_link_ADR_req(const uint8_t *payload, + uint8_t payload_size, link_adr_params_t *params) { uint8_t ret_index = 0; - if (payload[0] == SRV_MAC_LINK_ADR_REQ) { + if (payload_size >= 5) { // Parse datarate and tx power params->datarate = payload[1]; @@ -973,13 +974,17 @@ uint8_t LoRaPHY::link_ADR_request(adr_req_params_t *link_adr_req, verify_adr_params_t verify_params; - while (bytes_processed < link_adr_req->payload_size) { + while (bytes_processed < link_adr_req->payload_size && + link_adr_req->payload[bytes_processed] == SRV_MAC_LINK_ADR_REQ) { // Get ADR request parameters next_index = parse_link_ADR_req(&(link_adr_req->payload[bytes_processed]), + link_adr_req->payload_size - bytes_processed, &adr_settings); if (next_index == 0) { - break; // break loop, since no more request has been found + bytes_processed = 0; + // break loop, malformed packet + break; } // Update bytes processed @@ -1024,6 +1029,11 @@ uint8_t LoRaPHY::link_ADR_request(adr_req_params_t *link_adr_req, } } + if (bytes_processed == 0) { + *nb_bytes_processed = 0; + return status; + } + if (is_datarate_supported(adr_settings.datarate)) { verify_params.status = status; diff --git a/features/lorawan/lorastack/phy/LoRaPHY.h b/features/lorawan/lorastack/phy/LoRaPHY.h index d6be36b1dc..f68f646726 100644 --- a/features/lorawan/lorastack/phy/LoRaPHY.h +++ b/features/lorawan/lorastack/phy/LoRaPHY.h @@ -608,7 +608,8 @@ protected: /** * Parses the parameter of an LinkAdrRequest. */ - uint8_t parse_link_ADR_req(const uint8_t *payload, link_adr_params_t *adr_params); + uint8_t parse_link_ADR_req(const uint8_t *payload, uint8_t payload_size, + link_adr_params_t *adr_params); /** * Verifies and updates the datarate, the TX power and the number of repetitions diff --git a/features/lorawan/lorastack/phy/LoRaPHYAU915.cpp b/features/lorawan/lorastack/phy/LoRaPHYAU915.cpp index 46ea344860..b41091e8e8 100644 --- a/features/lorawan/lorastack/phy/LoRaPHYAU915.cpp +++ b/features/lorawan/lorastack/phy/LoRaPHYAU915.cpp @@ -435,12 +435,16 @@ uint8_t LoRaPHYAU915::link_ADR_request(adr_req_params_t *params, // Initialize local copy of channels mask copy_channel_mask(temp_channel_masks, channel_mask, AU915_CHANNEL_MASK_SIZE); - while (bytes_processed < params->payload_size) { + while (bytes_processed < params->payload_size && + params->payload[bytes_processed] == SRV_MAC_LINK_ADR_REQ) { next_index = parse_link_ADR_req(&(params->payload[bytes_processed]), + params->payload_size, &adr_settings); if (next_index == 0) { - break; // break loop, since no more request has been found + bytes_processed = 0; + // break loop, malformed packet + break; } // Update bytes processed @@ -471,6 +475,11 @@ uint8_t LoRaPHYAU915::link_ADR_request(adr_req_params_t *params, } } + if (bytes_processed == 0) { + *nb_bytes_parsed = 0; + return status; + } + // FCC 15.247 paragraph F mandates to hop on at least 2 125 kHz channels if ((adr_settings.datarate < DR_6) && (num_active_channels(temp_channel_masks, 0, 4) < 2)) { diff --git a/features/lorawan/lorastack/phy/LoRaPHYCN470.cpp b/features/lorawan/lorastack/phy/LoRaPHYCN470.cpp index 01614e34f5..da46aea6bf 100644 --- a/features/lorawan/lorastack/phy/LoRaPHYCN470.cpp +++ b/features/lorawan/lorastack/phy/LoRaPHYCN470.cpp @@ -460,13 +460,18 @@ uint8_t LoRaPHYCN470::link_ADR_request(adr_req_params_t *params, // Initialize local copy of channels mask copy_channel_mask(temp_channel_masks, channel_mask, CN470_CHANNEL_MASK_SIZE); - while (bytes_processed < params->payload_size) { + while (bytes_processed < params->payload_size && + params->payload[bytes_processed] == SRV_MAC_LINK_ADR_REQ) { // Get ADR request parameters - next_index = parse_link_ADR_req(&(params->payload[bytes_processed]), &adr_settings); + next_index = parse_link_ADR_req(&(params->payload[bytes_processed]), + params->payload_size, + &adr_settings); if (next_index == 0) { - break; // break loop, since no more request has been found + bytes_processed = 0; + // break loop, malformed packet + break; } // Update bytes processed @@ -501,6 +506,11 @@ uint8_t LoRaPHYCN470::link_ADR_request(adr_req_params_t *params, } } + if (bytes_processed == 0) { + *nb_bytes_parsed = 0; + return status; + } + verify_params.status = status; verify_params.adr_enabled = params->adr_enabled; verify_params.datarate = adr_settings.datarate; diff --git a/features/lorawan/lorastack/phy/LoRaPHYUS915.cpp b/features/lorawan/lorastack/phy/LoRaPHYUS915.cpp index abc496be13..d454fb24e4 100644 --- a/features/lorawan/lorastack/phy/LoRaPHYUS915.cpp +++ b/features/lorawan/lorastack/phy/LoRaPHYUS915.cpp @@ -460,12 +460,16 @@ uint8_t LoRaPHYUS915::link_ADR_request(adr_req_params_t *params, // Initialize local copy of channels mask copy_channel_mask(temp_channel_masks, channel_mask, US915_CHANNEL_MASK_SIZE); - while (bytes_processed < params->payload_size) { + while (bytes_processed < params->payload_size && + params->payload[bytes_processed] == SRV_MAC_LINK_ADR_REQ) { next_idx = parse_link_ADR_req(&(params->payload[bytes_processed]), + params->payload_size - bytes_processed, &adr_settings); if (next_idx == 0) { - break; // break loop, since no more request has been found + bytes_processed = 0; + // break loop, malformed packet + break; } // Update bytes processed @@ -501,6 +505,11 @@ uint8_t LoRaPHYUS915::link_ADR_request(adr_req_params_t *params, } } + if (bytes_processed == 0) { + *nb_bytes_parsed = 0; + return status; + } + // FCC 15.247 paragraph F mandates to hop on at least 2 125 kHz channels if ((adr_settings.datarate < DR_4) && (num_active_channels(temp_channel_masks, 0, 4) < 2)) { From 523a8cebe0fb182116ef53d6c308cd81c356c755 Mon Sep 17 00:00:00 2001 From: Hasnain Virk Date: Mon, 4 Feb 2019 16:57:53 +0200 Subject: [PATCH 052/109] Updating unit tests Updating unit test in response to the change in the link ADR related APIs. --- .../features/lorawan/loraphyau915/Test_LoRaPHYAU915.cpp | 4 ++++ .../features/lorawan/loraphycn470/Test_LoRaPHYCN470.cpp | 4 ++++ .../features/lorawan/loraphyus915/Test_LoRaPHYUS915.cpp | 9 ++++++++- .../features/lorawan/lorawanstack/Test_LoRaWANStack.cpp | 4 ++++ UNITTESTS/stubs/LoRaPHY_stub.cpp | 3 +++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/UNITTESTS/features/lorawan/loraphyau915/Test_LoRaPHYAU915.cpp b/UNITTESTS/features/lorawan/loraphyau915/Test_LoRaPHYAU915.cpp index 11a27e9d20..93ff3d29e0 100644 --- a/UNITTESTS/features/lorawan/loraphyau915/Test_LoRaPHYAU915.cpp +++ b/UNITTESTS/features/lorawan/loraphyau915/Test_LoRaPHYAU915.cpp @@ -181,6 +181,10 @@ TEST_F(Test_LoRaPHYAU915, link_ADR_request) uint8_t nb_rep_out = 0; uint8_t nb_bytes_parsed = 0; + uint8_t payload [] = {SRV_MAC_LINK_ADR_REQ, 1, 2, 3, 4}; + params.payload = payload; + params.payload_size = 5; + LoRaPHY_stub::uint8_value = 1; LoRaPHY_stub::ch_mask_value = 6; LoRaPHY_stub::adr_parse_count = 2; diff --git a/UNITTESTS/features/lorawan/loraphycn470/Test_LoRaPHYCN470.cpp b/UNITTESTS/features/lorawan/loraphycn470/Test_LoRaPHYCN470.cpp index abeefd52d6..20e8fc3be2 100644 --- a/UNITTESTS/features/lorawan/loraphycn470/Test_LoRaPHYCN470.cpp +++ b/UNITTESTS/features/lorawan/loraphycn470/Test_LoRaPHYCN470.cpp @@ -206,6 +206,10 @@ TEST_F(Test_LoRaPHYCN470, link_ADR_request) uint8_t nb_rep_out = 0; uint8_t nb_bytes_parsed = 0; + uint8_t payload [] = {SRV_MAC_LINK_ADR_REQ, 1, 2, 3, 4}; + params.payload = payload; + params.payload_size = 5; + LoRaPHY_stub::uint8_value = 1; LoRaPHY_stub::ch_mask_value = 6; LoRaPHY_stub::adr_parse_count = 2; diff --git a/UNITTESTS/features/lorawan/loraphyus915/Test_LoRaPHYUS915.cpp b/UNITTESTS/features/lorawan/loraphyus915/Test_LoRaPHYUS915.cpp index b3d921bac9..36e3a15e78 100644 --- a/UNITTESTS/features/lorawan/loraphyus915/Test_LoRaPHYUS915.cpp +++ b/UNITTESTS/features/lorawan/loraphyus915/Test_LoRaPHYUS915.cpp @@ -177,6 +177,7 @@ TEST_F(Test_LoRaPHYUS915, tx_config) TEST_F(Test_LoRaPHYUS915, link_ADR_request) { + uint8_t payload [] = {SRV_MAC_LINK_ADR_REQ, 1, 2, 3, 4}; adr_req_params_t params; memset(¶ms, 0, sizeof(params)); int8_t dr_out = 0; @@ -184,8 +185,14 @@ TEST_F(Test_LoRaPHYUS915, link_ADR_request) uint8_t nb_rep_out = 0; uint8_t nb_bytes_parsed = 0; - EXPECT_TRUE(0 == object->link_ADR_request(¶ms, &dr_out, &tx_power_out, &nb_rep_out, &nb_bytes_parsed)); + params.payload = payload; + params.payload_size = 4; + uint8_t status = object->link_ADR_request(¶ms, &dr_out, &tx_power_out, &nb_rep_out, &nb_bytes_parsed); + + EXPECT_TRUE(0 == nb_bytes_parsed); + + params.payload_size = 5; LoRaPHY_stub::uint8_value = 1; LoRaPHY_stub::ch_mask_value = 6; LoRaPHY_stub::adr_parse_count = 2; diff --git a/UNITTESTS/features/lorawan/lorawanstack/Test_LoRaWANStack.cpp b/UNITTESTS/features/lorawan/lorawanstack/Test_LoRaWANStack.cpp index 15a2942001..e91f842055 100644 --- a/UNITTESTS/features/lorawan/lorawanstack/Test_LoRaWANStack.cpp +++ b/UNITTESTS/features/lorawan/lorawanstack/Test_LoRaWANStack.cpp @@ -494,6 +494,10 @@ TEST_F(Test_LoRaWANStack, handle_rx) ind.buffer = ind_buf; ind.buffer_size = 150; ind.type = MCPS_UNCONFIRMED; + ind.port = 15; + ind.is_data_recvd = true; + ind.fpending_status = false; + LoRaMac_stub::dev_class_value = CLASS_A; radio._ev->rx_done(NULL, 0, 0, 0); //data == NULL || LENGTH == 0 (2 cases) diff --git a/UNITTESTS/stubs/LoRaPHY_stub.cpp b/UNITTESTS/stubs/LoRaPHY_stub.cpp index 01b7312b7c..53dce9fe4f 100644 --- a/UNITTESTS/stubs/LoRaPHY_stub.cpp +++ b/UNITTESTS/stubs/LoRaPHY_stub.cpp @@ -151,9 +151,12 @@ lorawan_time_t LoRaPHY::update_band_timeoff(bool joined, bool duty_cycle, } uint8_t LoRaPHY::parse_link_ADR_req(const uint8_t *payload, + uint8_t payload_size, link_adr_params_t *params) { params->ch_mask_ctrl = LoRaPHY_stub::ch_mask_value; + params->channel_mask = 0; + params->datarate = 0; if (LoRaPHY_stub::adr_parse_count) { return --LoRaPHY_stub::adr_parse_count; From b96ec171b5efe7476854c56305d564a7016687e9 Mon Sep 17 00:00:00 2001 From: Antti Yli-Tokola Date: Mon, 11 Feb 2019 10:37:43 +0200 Subject: [PATCH 053/109] Update mbed-coap to version 4.7.4 - Remove dependency to yotta tool - Do not remove stored (GET) blockwise message when EMPTY ACK received. When non piggybacked response mode is used original GET request must not be removed from the stored message list.Message is needed for building the next (GET) blockwise message. - Move definitions to sn_config.h --- features/frameworks/mbed-coap/.yotta_ignore | 5 - features/frameworks/mbed-coap/CHANGELOG.md | 10 ++ features/frameworks/mbed-coap/Makefile.test | 24 +++- .../mbed-coap/mbed-coap/sn_config.h | 104 +++++++++++++---- .../frameworks/mbed-coap/run_unit_tests.sh | 3 +- .../include/sn_coap_protocol_internal.h | 107 +----------------- .../mbed-coap/source/sn_coap_protocol.c | 5 +- 7 files changed, 122 insertions(+), 136 deletions(-) delete mode 100644 features/frameworks/mbed-coap/.yotta_ignore diff --git a/features/frameworks/mbed-coap/.yotta_ignore b/features/frameworks/mbed-coap/.yotta_ignore deleted file mode 100644 index 6cd3f5174f..0000000000 --- a/features/frameworks/mbed-coap/.yotta_ignore +++ /dev/null @@ -1,5 +0,0 @@ -# need unity.h: -unittest/* -test/* -doxygen/* - diff --git a/features/frameworks/mbed-coap/CHANGELOG.md b/features/frameworks/mbed-coap/CHANGELOG.md index 7da355071f..4e0355bf70 100644 --- a/features/frameworks/mbed-coap/CHANGELOG.md +++ b/features/frameworks/mbed-coap/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## [v4.7.4](https://github.com/ARMmbed/mbed-coap/releases/tag/v4.7.4) + +- Remove dependency to yotta tool +- Do not remove stored (GET) blockwise message when EMPTY ACK received + When non piggybacked response mode is used original GET request must not be removed from the stored message list. + Message is needed for building the next (GET) blockwise message. +- Move definitions to sn_config.h + +-[Full Changelog](https://github.com/ARMmbed/mbed-coap/compare/v4.7.3...v4.7.4) + ## [v4.7.3](https://github.com/ARMmbed/mbed-coap/releases/tag/v4.7.3) - Do not store EMPTY response to blockwise list diff --git a/features/frameworks/mbed-coap/Makefile.test b/features/frameworks/mbed-coap/Makefile.test index 4cc7296c5f..78cf60fbbc 100644 --- a/features/frameworks/mbed-coap/Makefile.test +++ b/features/frameworks/mbed-coap/Makefile.test @@ -11,6 +11,28 @@ TESTDIRS := $(UNITTESTS:%=build-%) CLEANTESTDIRS := $(UNITTESTS:%=clean-%) COVERAGEFILE := ./lcov/coverage.info +TEST_MODULES = ./test_modules +TEST_MODULE_MBED_TRACE = $(TEST_MODULES)/mbed-trace +TEST_MODULE_NANOSTACK = $(TEST_MODULES)/nanostack-libservice +TEST_MODULE_RANDLIB = $(TEST_MODULES)/mbed-client-randlib + +.PHONY: clone +clone: + if [ ! -d $(TEST_MODULES) ]; \ + then mkdir $(TEST_MODULES); \ + fi; + + if [ ! -d $(TEST_MODULE_MBED_TRACE) ]; \ + then git clone --depth 1 git@github.com:ARMmbed/mbed-trace.git $(TEST_MODULE_MBED_TRACE); \ + fi; + + if [ ! -d $(TEST_MODULE_NANOSTACK) ]; \ + then git clone --depth 1 git@github.com:ARMmbed/nanostack-libservice.git $(TEST_MODULE_NANOSTACK); \ + fi; + + if [ ! -d $(TEST_MODULE_RANDLIB) ]; \ + then git clone --depth 1 git@github.com:ARMmbed/mbed-client-randlib.git $(TEST_MODULE_RANDLIB); \ + fi; .PHONY: test test: $(TESTDIRS) @rm -rf ./lcov @@ -27,7 +49,7 @@ test: $(TESTDIRS) @rm -f lcov/index.xml @find ./ -name '*.gcno' | xargs cp --backup=numbered -t ./coverage/ @find ./ -name '*.gcda' | xargs cp --backup=numbered -t ./coverage/ - @gcovr --object-directory ./coverage --exclude-unreachable-branches -e '.*/builds/.*' -e '.*/test/.*' -e '.*/yotta_modules/.*' -e '.*/stubs/.*' -e '.*/mbed-coap/.*' -x -o ./lcov/gcovr.xml + @gcovr --object-directory ./coverage --exclude-unreachable-branches -e '.*/builds/.*' -e '.*/test/.*' -e '.*/stubs/.*' -e '.*/mbed-coap/.*' -x -o ./lcov/gcovr.xml @lcov -d test/. -c -o $(COVERAGEFILE) @lcov -q -r $(COVERAGEFILE) "/usr*" -o $(COVERAGEFILE) @lcov -q -r $(COVERAGEFILE) "/test*" -o $(COVERAGEFILE) diff --git a/features/frameworks/mbed-coap/mbed-coap/sn_config.h b/features/frameworks/mbed-coap/mbed-coap/sn_config.h index 5794af5cbc..63652826ed 100644 --- a/features/frameworks/mbed-coap/mbed-coap/sn_config.h +++ b/features/frameworks/mbed-coap/mbed-coap/sn_config.h @@ -17,6 +17,10 @@ #ifndef SN_CONFIG_H #define SN_CONFIG_H +#ifdef MBED_CLIENT_USER_CONFIG_FILE +#include MBED_CLIENT_USER_CONFIG_FILE +#endif + /** * \brief Configuration options (set of defines and values) * @@ -30,9 +34,15 @@ * \brief For Message duplication detection * Init value for the maximum count of messages to be stored for duplication detection * Setting of this value to 0 will disable duplication check, also reduce use of ROM memory - * Default is set to 1. + * Default is set to 0. */ -#undef SN_COAP_DUPLICATION_MAX_MSGS_COUNT /* 1 */ +#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_DUPLICATION_MAX_MSGS_COUNT +#define SN_COAP_DUPLICATION_MAX_MSGS_COUNT MBED_CONF_MBED_CLIENT_SN_COAP_DUPLICATION_MAX_MSGS_COUNT +#endif + +#ifndef SN_COAP_DUPLICATION_MAX_MSGS_COUNT +#define SN_COAP_DUPLICATION_MAX_MSGS_COUNT 0 +#endif /** * \def SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE @@ -42,7 +52,13 @@ * also reduce use of ROM memory. * Note: This define is common for both received and sent Blockwise messages */ -#undef SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE /* 0 */ // < Must be 2^x and x is at least 4. Suitable values: 0, 16, 32, 64, 128, 256, 512 and 1024 +#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE +#define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE MBED_CONF_MBED_CLIENT_SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE +#endif + +#ifndef SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE +#define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE 0 /**< Must be 2^x and x is at least 4. Suitable values: 0, 16, 32, 64, 128, 256, 512 and 1024 */ +#endif /** * \def SN_COAP_DISABLE_RESENDINGS @@ -50,21 +66,33 @@ * when using CoAP with TCP transport for example. By default resendings are * enabled. Set to 1 to disable. */ -#undef SN_COAP_DISABLE_RESENDINGS /* 0 */ // < Default re-sending are not disabled. Set to 1 to disable re-sendings +#ifdef SN_COAP_DISABLE_RESENDINGS +#define ENABLE_RESENDINGS 0 /** Disable resendings **/ +#else +#define ENABLE_RESENDINGS 1 /**< Enable / Disable resending from library in building */ +#endif /** * \def SN_COAP_RESENDING_QUEUE_SIZE_MSGS * \brief Sets the number of messages stored * in the resending queue. Default is 2 */ -#undef SN_COAP_RESENDING_QUEUE_SIZE_MSGS /* 2 */ // < Default re-sending queue size - defines how many messages can be stored. Setting this to 0 disables feature +#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_MSGS +#define SN_COAP_RESENDING_QUEUE_SIZE_MSGS MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_MSGS +#endif + +#ifndef SN_COAP_RESENDING_QUEUE_SIZE_MSGS +#define SN_COAP_RESENDING_QUEUE_SIZE_MSGS 2 /**< Default re-sending queue size - defines how many messages can be stored. Setting this to 0 disables feature */ +#endif /** * \def DEFAULT_RESPONSE_TIMEOUT * \brief Sets the CoAP re-send interval in seconds. * By default is 10 seconds. */ -#undef DEFAULT_RESPONSE_TIMEOUT +#ifndef DEFAULT_RESPONSE_TIMEOUT +#define DEFAULT_RESPONSE_TIMEOUT 10 /**< Default re-sending timeout as seconds */ +#endif /** * \def SN_COAP_RESENDING_QUEUE_SIZE_BYTES @@ -72,7 +100,13 @@ * Setting this to 0 disables this feature. * By default, this feature is disabled. */ -#undef SN_COAP_RESENDING_QUEUE_SIZE_BYTES /* 0 */ // Default re-sending queue size - defines size of the re-sending buffer. Setting this to 0 disables feature +#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_BYTES +#define SN_COAP_RESENDING_QUEUE_SIZE_BYTES MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_BYTES +#endif + +#ifndef SN_COAP_RESENDING_QUEUE_SIZE_BYTES +#define SN_COAP_RESENDING_QUEUE_SIZE_BYTES 0 /**< Default re-sending queue size - defines size of the re-sending buffer. Setting this to 0 disables feature */ +#endif /** * \def SN_COAP_MAX_INCOMING_MESSAGE_SIZE @@ -83,7 +117,9 @@ * available storage capability. * By default, maximum size is UINT16_MAX, 65535 bytes. */ -#undef SN_COAP_MAX_INCOMING_MESSAGE_SIZE /* UINT16_MAX */ +#ifndef SN_COAP_MAX_INCOMING_MESSAGE_SIZE +#define SN_COAP_MAX_INCOMING_MESSAGE_SIZE UINT16_MAX +#endif /** * \def SN_COAP_MAX_NONBLOCKWISE_PAYLOAD_SIZE @@ -98,21 +134,27 @@ * Note that value should be less than transport layer maximum fragment size. * Note that value has no effect if blockwise transfer is disabled. */ -#undef SN_COAP_MAX_NONBLOCKWISE_PAYLOAD_SIZE /* 0 */ +#ifndef SN_COAP_MAX_NONBLOCKWISE_PAYLOAD_SIZE +#define SN_COAP_MAX_NONBLOCKWISE_PAYLOAD_SIZE 0 +#endif /** * \def SN_COAP_BLOCKWISE_ENABLED * \brief Enables the blockwise functionality in CoAP library also when blockwise payload * size is set to '0' in SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE. */ -#undef SN_COAP_BLOCKWISE_ENABLED /* 0 */ +#ifndef SN_COAP_BLOCKWISE_ENABLED +#define SN_COAP_BLOCKWISE_ENABLED 0 /**< Enable blockwise */ +#endif /** * \def SN_COAP_RESENDING_MAX_COUNT * \brief Defines how many times CoAP library tries to re-send the CoAP packet. * By default value is 3. */ -#undef SN_COAP_RESENDING_MAX_COUNT /* 3 */ +#ifndef SN_COAP_RESENDING_MAX_COUNT +#define SN_COAP_RESENDING_MAX_COUNT 3 +#endif /** * \def SN_COAP_MAX_ALLOWED_RESENDING_COUNT @@ -120,7 +162,9 @@ * 'sn_coap_protocol_set_retransmission_parameters()' API. * By default value is 6. */ -#undef SN_COAP_MAX_ALLOWED_RESENDING_COUNT /* 6 */ +#ifndef SN_COAP_MAX_ALLOWED_RESENDING_COUNT +#define SN_COAP_MAX_ALLOWED_RESENDING_COUNT 6 /**< Maximum allowed count of re-sending */ +#endif /** * \def SN_COAP_MAX_ALLOWED_RESPONSE_TIMEOUT @@ -128,7 +172,9 @@ * 'sn_coap_protocol_set_retransmission_parameters()' API. * By default value is 40. */ -#undef SN_COAP_MAX_ALLOWED_RESPONSE_TIMEOUT /* 40 */ +#ifndef SN_COAP_MAX_ALLOWED_RESPONSE_TIMEOUT +#define SN_COAP_MAX_ALLOWED_RESPONSE_TIMEOUT 40 /**< Maximum allowed re-sending timeout */ +#endif /** * \def SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_MSGS @@ -136,7 +182,9 @@ * 'sn_coap_protocol_set_retransmission_buffer()' API. * By default value is 6. */ -#undef SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_MSGS /* 6 */ +#ifndef SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_MSGS +#define SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_MSGS 6 /**< Maximum allowed number of saved re-sending messages */ +#endif /** * \def SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_BYTES @@ -144,7 +192,9 @@ * 'sn_coap_protocol_set_retransmission_buffer()' API. * By default value is 512. */ -#undef SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_BYTES /* 512 */ +#ifndef SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_BYTES +#define SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_BYTES 512 /**< Maximum allowed size of re-sending buffer */ +#endif /** * \def SN_COAP_MAX_ALLOWED_DUPLICATION_MESSAGE_COUNT @@ -152,14 +202,18 @@ * that can be set via 'sn_coap_protocol_set_duplicate_buffer_size' API. * By default value is 6. */ -#undef SN_COAP_MAX_ALLOWED_DUPLICATION_MESSAGE_COUNT +#ifndef SN_COAP_MAX_ALLOWED_DUPLICATION_MESSAGE_COUNT +#define SN_COAP_MAX_ALLOWED_DUPLICATION_MESSAGE_COUNT 6 +#endif /** * \def SN_COAP_DUPLICATION_MAX_TIME_MSGS_STORED * \brief Maximum time in seconds howe long message is kept for duplicate detection. * By default 60 seconds. */ -#undef SN_COAP_DUPLICATION_MAX_TIME_MSGS_STORED +#ifndef SN_COAP_DUPLICATION_MAX_TIME_MSGS_STORED +#define SN_COAP_DUPLICATION_MAX_TIME_MSGS_STORED 60 /** RESPONSE_TIMEOUT * RESPONSE_RANDOM_FACTOR * (2 ^ MAX_RETRANSMIT - 1) + the expected maximum round trip time **/ +#endif /** * \def SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED @@ -167,17 +221,25 @@ * Longer time will increase the memory consumption in lossy networks. * By default 60 seconds. */ -#undef SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED +#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED +#define SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED MBED_CONF_MBED_CLIENT_SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED +#endif + +#ifndef SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED +#define SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED 60 /**< Maximum time in seconds of data (messages and payload) to be stored for blockwising */ +#endif /** * \def SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE * \brief Maximum size of blockwise message that can be received. * By default 65535 bytes. */ -#undef SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE +#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_MAX_INCOMING_MESSAGE_SIZE +#define SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE MBED_CONF_MBED_CLIENT_SN_COAP_MAX_INCOMING_MESSAGE_SIZE +#endif -#ifdef MBED_CLIENT_USER_CONFIG_FILE -#include MBED_CLIENT_USER_CONFIG_FILE +#ifndef SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE +#define SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE UINT16_MAX #endif #endif // SN_CONFIG_H diff --git a/features/frameworks/mbed-coap/run_unit_tests.sh b/features/frameworks/mbed-coap/run_unit_tests.sh index 797ca2c6ce..de190fe139 100755 --- a/features/frameworks/mbed-coap/run_unit_tests.sh +++ b/features/frameworks/mbed-coap/run_unit_tests.sh @@ -17,7 +17,6 @@ echo echo "Build mbed-coap C unit tests" echo -yt target x86-linux-native -yt up +make -f Makefile.test clone make -f Makefile.test test #make -f Makefile.test test clean diff --git a/features/frameworks/mbed-coap/source/include/sn_coap_protocol_internal.h b/features/frameworks/mbed-coap/source/include/sn_coap_protocol_internal.h index 0eff138331..3654684517 100644 --- a/features/frameworks/mbed-coap/source/include/sn_coap_protocol_internal.h +++ b/features/frameworks/mbed-coap/source/include/sn_coap_protocol_internal.h @@ -34,118 +34,13 @@ extern "C" { struct sn_coap_hdr_; -/* * * * * * * * * * * */ -/* * * * DEFINES * * * */ -/* * * * * * * * * * * */ - -/* * For Message resending * */ -#ifdef SN_COAP_DISABLE_RESENDINGS -#define ENABLE_RESENDINGS 0 /* Disable resendings */ -#else -#define ENABLE_RESENDINGS 1 /**< Enable / Disable resending from library in building */ -#endif - -#define SN_COAP_RESENDING_MAX_COUNT 3 /**< Default number of re-sendings */ - -#ifdef YOTTA_CFG_COAP_RESENDING_QUEUE_SIZE_MSGS -#define SN_COAP_RESENDING_QUEUE_SIZE_MSGS YOTTA_CFG_COAP_RESENDING_QUEUE_SIZE_MSGS -#elif defined MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_MSGS -#define SN_COAP_RESENDING_QUEUE_SIZE_MSGS MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_MSGS -#endif - -#ifndef SN_COAP_RESENDING_QUEUE_SIZE_MSGS -#define SN_COAP_RESENDING_QUEUE_SIZE_MSGS 2 /**< Default re-sending queue size - defines how many messages can be stored. Setting this to 0 disables feature */ -#endif - -#ifdef YOTTA_CFG_COAP_RESENDING_QUEUE_SIZE_BYTES -#define SN_COAP_RESENDING_QUEUE_SIZE_BYTES YOTTA_CFG_COAP_RESENDING_QUEUE_SIZE_BYTES -#elif defined MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_BYTES -#define SN_COAP_RESENDING_QUEUE_SIZE_BYTES MBED_CONF_MBED_CLIENT_SN_COAP_RESENDING_QUEUE_SIZE_BYTES -#endif - -#ifndef SN_COAP_RESENDING_QUEUE_SIZE_BYTES -#define SN_COAP_RESENDING_QUEUE_SIZE_BYTES 0 /**< Default re-sending queue size - defines size of the re-sending buffer. Setting this to 0 disables feature */ -#endif - -#define DEFAULT_RESPONSE_TIMEOUT 10 /**< Default re-sending timeout as seconds */ - -/* These parameters sets maximum values application can set with API */ -#define SN_COAP_MAX_ALLOWED_RESENDING_COUNT 6 /**< Maximum allowed count of re-sending */ -#define SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_MSGS 6 /**< Maximum allowed number of saved re-sending messages */ -#define SN_COAP_MAX_ALLOWED_RESENDING_BUFF_SIZE_BYTES 512 /**< Maximum allowed size of re-sending buffer */ -#define SN_COAP_MAX_ALLOWED_RESPONSE_TIMEOUT 40 /**< Maximum allowed re-sending timeout */ - -#define RESPONSE_RANDOM_FACTOR 1.5 /**< Resending random factor, value is specified in IETF CoAP specification */ - -/* * For Message duplication detecting * */ - -/* Init value for the maximum count of messages to be stored for duplication detection */ -/* Setting of this value to 0 will disable duplication check, also reduce use of ROM memory */ -#ifdef YOTTA_CFG_COAP_DUPLICATION_MAX_MSGS_COUNT -#define SN_COAP_DUPLICATION_MAX_MSGS_COUNT YOTTA_CFG_COAP_DUPLICATION_MAX_MSGS_COUNT -#elif defined MBED_CONF_MBED_CLIENT_SN_COAP_DUPLICATION_MAX_MSGS_COUNT -#define SN_COAP_DUPLICATION_MAX_MSGS_COUNT MBED_CONF_MBED_CLIENT_SN_COAP_DUPLICATION_MAX_MSGS_COUNT -#endif - -// Keep the old flag to maintain backward compatibility -#ifndef SN_COAP_DUPLICATION_MAX_MSGS_COUNT -#define SN_COAP_DUPLICATION_MAX_MSGS_COUNT 0 -#endif - -/* Maximum allowed number of saved messages for duplicate searching */ -#define SN_COAP_MAX_ALLOWED_DUPLICATION_MESSAGE_COUNT 6 - -/* Maximum time in seconds of messages to be stored for duplication detection */ -#define SN_COAP_DUPLICATION_MAX_TIME_MSGS_STORED 60 /* RESPONSE_TIMEOUT * RESPONSE_RANDOM_FACTOR * (2 ^ MAX_RETRANSMIT - 1) + the expected maximum round trip time */ - -/* * For Message blockwising * */ - -/* Init value for the maximum payload size to be sent and received at one blockwise message */ -/* Setting of this value to 0 will disable this feature, and also reduce use of ROM memory */ -/* Note: This define is common for both received and sent Blockwise messages */ - -#ifdef YOTTA_CFG_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE -#define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE YOTTA_CFG_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE -#elif defined MBED_CONF_MBED_CLIENT_SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE -#define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE MBED_CONF_MBED_CLIENT_SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE -#endif - -#ifndef SN_COAP_BLOCKWISE_ENABLED -#define SN_COAP_BLOCKWISE_ENABLED 0 /**< Enable blockwise */ -#endif - -#ifndef SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE -#define SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE 0 /**< Must be 2^x and x is at least 4. Suitable values: 0, 16, 32, 64, 128, 256, 512 and 1024 */ -#endif - -#ifndef SN_COAP_MAX_NONBLOCKWISE_PAYLOAD_SIZE -#define SN_COAP_MAX_NONBLOCKWISE_PAYLOAD_SIZE 0 -#endif - -#ifdef MBED_CONF_MBED_CLIENT_SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED -#define SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED MBED_CONF_MBED_CLIENT_SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED -#endif - -#ifndef SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED -#define SN_COAP_BLOCKWISE_MAX_TIME_DATA_STORED 60 /**< Maximum time in seconds of data (messages and payload) to be stored for blockwising */ -#endif - -#ifdef YOTTA_CFG_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE -#define SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE YOTTA_CFG_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE -#elif defined MBED_CONF_MBED_CLIENT_SN_COAP_MAX_INCOMING_MESSAGE_SIZE -#define SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE MBED_CONF_MBED_CLIENT_SN_COAP_MAX_INCOMING_MESSAGE_SIZE -#endif - -#ifndef SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE -#define SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE UINT16_MAX -#endif +#define RESPONSE_RANDOM_FACTOR 1.5 /**< Resending random factor, value is specified in IETF CoAP specification */ /* * For Option handling * */ #define COAP_OPTION_MAX_AGE_DEFAULT 60 /**< Default value of Max-Age if option not present */ #define COAP_OPTION_URI_PORT_NONE (-1) /**< Internal value to represent no Uri-Port option */ #define COAP_OPTION_BLOCK_NONE (-1) /**< Internal value to represent no Block1/2 option */ - int8_t prepare_blockwise_message(struct coap_s *handle, struct sn_coap_hdr_ *coap_hdr_ptr); /* Structure which is stored to Linked list for message sending purposes */ diff --git a/features/frameworks/mbed-coap/source/sn_coap_protocol.c b/features/frameworks/mbed-coap/source/sn_coap_protocol.c index 0a87eb3f1a..773216bf29 100644 --- a/features/frameworks/mbed-coap/source/sn_coap_protocol.c +++ b/features/frameworks/mbed-coap/source/sn_coap_protocol.c @@ -738,7 +738,10 @@ sn_coap_hdr_s *sn_coap_protocol_parse(struct coap_s *handle, sn_nsdl_addr_s *src (returned_dst_coap_msg_ptr->options_list_ptr->block1 != COAP_OPTION_BLOCK_NONE || returned_dst_coap_msg_ptr->options_list_ptr->block2 != COAP_OPTION_BLOCK_NONE)) { returned_dst_coap_msg_ptr = sn_coap_handle_blockwise_message(handle, src_addr_ptr, returned_dst_coap_msg_ptr, param); - } else { + } else if (returned_dst_coap_msg_ptr->msg_code != COAP_MSG_CODE_EMPTY) { + // Do not clean stored blockwise message when empty ack is received. + // Stored message is mandatory when building a next (GET) blockwise message. + // This will happen when non piggybacked response mode is selected. /* Get ... */ coap_blockwise_msg_s *stored_blockwise_msg_temp_ptr = NULL; From de35a15b058784bfba975c5a0e461454074dfdc6 Mon Sep 17 00:00:00 2001 From: Hasnain Virk Date: Wed, 13 Feb 2019 16:56:29 +0200 Subject: [PATCH 054/109] Reverting to original doxy configuration This commit essentially brings back old code. We did an attempt to resolve doxy issues with nfc durint docathlon, but it introduced more issues and yak shaving rather than being a useful exercise. Unfortunately the previous attempt got merged. This commit attempts to restore the style maintained by original developers. From here they can take over. --- features/nfc/nfc/NFCController.h | 4 +--- features/nfc/nfc/NFCEEPROM.h | 4 +--- features/nfc/nfc/ndef/MessageBuilder.h | 4 +--- features/nfc/nfc/ndef/MessageParser.h | 4 +--- features/nfc/nfc/ndef/common/SimpleMessageParser.h | 4 +--- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/features/nfc/nfc/NFCController.h b/features/nfc/nfc/NFCController.h index 945d248811..df55292f13 100644 --- a/features/nfc/nfc/NFCController.h +++ b/features/nfc/nfc/NFCController.h @@ -1,6 +1,4 @@ -/** @file NFCController.h - * - * mbed Microcontroller Library +/* mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/nfc/nfc/NFCEEPROM.h b/features/nfc/nfc/NFCEEPROM.h index b06c2836a7..ed0deb301d 100644 --- a/features/nfc/nfc/NFCEEPROM.h +++ b/features/nfc/nfc/NFCEEPROM.h @@ -1,6 +1,4 @@ -/** @file NFCEEPROM.h - * - * mbed Microcontroller Library +/* mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/nfc/nfc/ndef/MessageBuilder.h b/features/nfc/nfc/ndef/MessageBuilder.h index 2564675897..1b4e38e0d4 100644 --- a/features/nfc/nfc/ndef/MessageBuilder.h +++ b/features/nfc/nfc/ndef/MessageBuilder.h @@ -1,6 +1,4 @@ -/** @file MessageBuilder.h - * - * mbed Microcontroller Library +/* mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/nfc/nfc/ndef/MessageParser.h b/features/nfc/nfc/ndef/MessageParser.h index 55a0e6e5fd..a0ac9391ed 100644 --- a/features/nfc/nfc/ndef/MessageParser.h +++ b/features/nfc/nfc/ndef/MessageParser.h @@ -1,6 +1,4 @@ -/** @file MessageParser.h - * - * mbed Microcontroller Library +/* mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/features/nfc/nfc/ndef/common/SimpleMessageParser.h b/features/nfc/nfc/ndef/common/SimpleMessageParser.h index 7ba7e9db91..2f7bbbc274 100644 --- a/features/nfc/nfc/ndef/common/SimpleMessageParser.h +++ b/features/nfc/nfc/ndef/common/SimpleMessageParser.h @@ -1,6 +1,4 @@ -/** @file SimpleMessageParser.h - * - * mbed Microcontroller Library +/* mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); From c71f1d46248115d2203f5109a56c6bbdd2e346a2 Mon Sep 17 00:00:00 2001 From: Nicolas Graziano Date: Sat, 9 Feb 2019 19:23:56 +0100 Subject: [PATCH 055/109] Fix IntelliSense in VSCode export Allow to use default intelliSenseEngine in visual studio code. Add of compilerPath and forcedInclude of mbed_config header in the created c_cpp_properties.json file. --- tools/export/vscode/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/export/vscode/__init__.py b/tools/export/vscode/__init__.py index 9cfa1f4836..0ea77e79b5 100644 --- a/tools/export/vscode/__init__.py +++ b/tools/export/vscode/__init__.py @@ -67,16 +67,29 @@ class VSCode(Makefile): "configurations": [ { "name": "Windows", + "forcedInclude": [ + "${workspaceRoot}\\mbed_config.h" + ], + "compilerPath": self.toolchain.cppc[0], + "intelliSenseMode": "gcc-x64", "includePath": [x.replace("/", "\\") for x in all_directories], "defines": [symbol for symbol in self.toolchain.get_symbols()] }, { "name": "Mac", + "forcedInclude": [ + "${workspaceRoot}\\mbed_config.h" + ], + "compilerPath": self.toolchain.cppc[0], "includePath": all_directories, "defines": [symbol for symbol in self.toolchain.get_symbols()] }, { "name": "Linux", + "forcedInclude": [ + "${workspaceRoot}\\mbed_config.h" + ], + "compilerPath": self.toolchain.cppc[0], "includePath": all_directories, "defines": [symbol for symbol in self.toolchain.get_symbols()] } From a47683069d71e32b12f1e05b9d575c4e3f5a19e8 Mon Sep 17 00:00:00 2001 From: Nicolas Graziano Date: Mon, 11 Feb 2019 14:45:34 +0100 Subject: [PATCH 056/109] Vscode export: remove path separator conversion VSCode handle "/" and it is easier to read. --- tools/export/vscode/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/export/vscode/__init__.py b/tools/export/vscode/__init__.py index 0ea77e79b5..efa92b3c9a 100644 --- a/tools/export/vscode/__init__.py +++ b/tools/export/vscode/__init__.py @@ -68,17 +68,17 @@ class VSCode(Makefile): { "name": "Windows", "forcedInclude": [ - "${workspaceRoot}\\mbed_config.h" + "${workspaceRoot}/mbed_config.h" ], "compilerPath": self.toolchain.cppc[0], "intelliSenseMode": "gcc-x64", - "includePath": [x.replace("/", "\\") for x in all_directories], + "includePath": all_directories, "defines": [symbol for symbol in self.toolchain.get_symbols()] }, { "name": "Mac", "forcedInclude": [ - "${workspaceRoot}\\mbed_config.h" + "${workspaceRoot}/mbed_config.h" ], "compilerPath": self.toolchain.cppc[0], "includePath": all_directories, @@ -87,7 +87,7 @@ class VSCode(Makefile): { "name": "Linux", "forcedInclude": [ - "${workspaceRoot}\\mbed_config.h" + "${workspaceRoot}/mbed_config.h" ], "compilerPath": self.toolchain.cppc[0], "includePath": all_directories, From a245a177030f94959a8a8ae7fe9096ef9f3c6a0e Mon Sep 17 00:00:00 2001 From: Nicolas Graziano Date: Mon, 11 Feb 2019 14:52:02 +0100 Subject: [PATCH 057/109] Vscode export: replace obsolete ${workspaceRoot} Replace with ${workspaceFolder} --- tools/export/vscode/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/export/vscode/__init__.py b/tools/export/vscode/__init__.py index efa92b3c9a..5765adbb95 100644 --- a/tools/export/vscode/__init__.py +++ b/tools/export/vscode/__init__.py @@ -59,16 +59,16 @@ class VSCode(Makefile): continue if directory == ".": - all_directories.append("${workspaceRoot}/*") + all_directories.append("${workspaceFolder}/*") else: - all_directories.append(directory.replace("./", "${workspaceRoot}/") + "/*") + all_directories.append(directory.replace("./", "${workspaceFolder}/") + "/*") cpp_props = { "configurations": [ { "name": "Windows", "forcedInclude": [ - "${workspaceRoot}/mbed_config.h" + "${workspaceFolder}/mbed_config.h" ], "compilerPath": self.toolchain.cppc[0], "intelliSenseMode": "gcc-x64", @@ -78,7 +78,7 @@ class VSCode(Makefile): { "name": "Mac", "forcedInclude": [ - "${workspaceRoot}/mbed_config.h" + "${workspaceFolder}/mbed_config.h" ], "compilerPath": self.toolchain.cppc[0], "includePath": all_directories, @@ -87,7 +87,7 @@ class VSCode(Makefile): { "name": "Linux", "forcedInclude": [ - "${workspaceRoot}/mbed_config.h" + "${workspaceFolder}/mbed_config.h" ], "compilerPath": self.toolchain.cppc[0], "includePath": all_directories, From 0b8bcb05d539be3b3a4e82b59f9e7922680bba84 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Thu, 24 Jan 2019 18:22:32 +0000 Subject: [PATCH 058/109] readme: add list of licenses - not Apache 2.0 Name all folders containing different liceses. Any new file not Apache 2.0 should be captured here. --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 59d8fcc7e3..075350c5fb 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,28 @@ The software is provided under [Apache-2.0 license](LICENSE). Contributions to t This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html) +Folders containing files not under Apache 2.0 as listed above. The original license text is included in those source files. + +- cmsis - MIT/BSD-3-Clause +- components/802.15.4_RF/mcr20a-rf-driver - BSD-3-Clause +- features/cryptocell/FEATURE_CRYPTOCELL310 - BSD-style +- features/FEATURE_BOOTLOADER - PBL +- features/FEATURE_BLE/targets - BSD-style/PBL/MIT +- features/lorawan - Revised BSD +- features/lwipstack - BSD-3-Clause/MIT +- features/nanostack/sal-stack-nanostack - BSD-3-Clause +- features/storage/FEATURE_STORAGE - BSD-style +- features/storage/blockdevice - MIT +- features/storage/filesystem/littlefs - BSD-3-Clause +- features/storage/filesystem/fat - MIT/BSD-style +- features/netsocket/emac-drivers - BSD-3-Clause +- features/frameworks/unity/unity - MIT +- rtos - MIT +- drivers - MIT +- TESTS/mbed_hal/trng/pithy - BSD-3-Clause +- tools/data/rpc - MIT +- targets - PBL/BSD-style/MIT/Zlib + ## Getting started for developers We have a [developer website](https://os.mbed.com) for asking questions, engaging with others, finding information on boards and components, using an online IDE and compiler, reading the documentation and learning about what's new and what's coming next in Mbed OS. From fabf99f7a743636bef02626c3554900583f55ed2 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Tue, 12 Feb 2019 10:13:32 +0000 Subject: [PATCH 059/109] readme: license update Fix licenses based on latest Fossology scan. Using -style licenses for specific type licenses Add paths to the readme. --- README.md | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 075350c5fb..da335abb13 100644 --- a/README.md +++ b/README.md @@ -33,27 +33,28 @@ The software is provided under [Apache-2.0 license](LICENSE). Contributions to t This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html) -Folders containing files not under Apache 2.0 as listed above. The original license text is included in those source files. +Folders containing files not under Apache 2.0 as listed above (each folder should contain own README file with license specified for its files). The original license text is included in those source files. -- cmsis - MIT/BSD-3-Clause -- components/802.15.4_RF/mcr20a-rf-driver - BSD-3-Clause -- features/cryptocell/FEATURE_CRYPTOCELL310 - BSD-style -- features/FEATURE_BOOTLOADER - PBL -- features/FEATURE_BLE/targets - BSD-style/PBL/MIT -- features/lorawan - Revised BSD -- features/lwipstack - BSD-3-Clause/MIT -- features/nanostack/sal-stack-nanostack - BSD-3-Clause -- features/storage/FEATURE_STORAGE - BSD-style -- features/storage/blockdevice - MIT -- features/storage/filesystem/littlefs - BSD-3-Clause -- features/storage/filesystem/fat - MIT/BSD-style -- features/netsocket/emac-drivers - BSD-3-Clause -- features/frameworks/unity/unity - MIT -- rtos - MIT -- drivers - MIT -- TESTS/mbed_hal/trng/pithy - BSD-3-Clause -- tools/data/rpc - MIT -- targets - PBL/BSD-style/MIT/Zlib +- [cmsis](./cmsis) - MIT, BSD-3-Clause +- [components/802.15.4_RF/mcr20a-rf-driver](./components/802.15.4_RF/mcr20a-rf-driver) - BSD-3-Clause +- [features/cryptocell/FEATURE_CRYPTOCELL310](./features/cryptocell/FEATURE_CRYPTOCELL310) - ARM Object Code and Header Files License +- [features/FEATURE_BOOTLOADER](./features/FEATURE_BOOTLOADER) - PBL +- [features/FEATURE_BLE/targets](./features/FEATURE_BLE/targets) - BSD-style, PBL, MIT-style +- [features/lorawan](./features/lorawan) - Revised BSD +- [features/lwipstack](./features/lwipstack) - BSD-style, MIT-style +- [features/nanostack/sal-stack-nanostack](./features/nanostack/sal-stack-nanostack) - BSD-3-Clause +- [features/storage/FEATURE_STORAGE](./features/storage/FEATURE_STORAGE) - BSD-style +- [features/storage/blockdevice](./features/storage/blockdevice) - MIT +- [features/storage/filesystem/littlefs](./features/storage/filesystem/littlefs) - BSD-3-Clause +- [features/storage/filesystem/fat](./features/storage/filesystem/fat) - MIT, BSD-style +- [features/netsocket/emac-drivers](./features/netsocket/emac-drivers) - BSD-style +- [features/frameworks/unity/unity](./features/frameworks/unity/unity) - MIT +- [features/unsupported](./features/unsupported) - MIT-style, BSD-style +- [rtos](./rtos) - MIT +- [drivers](./drivers) - MIT +- [TESTS/mbed_hal/trng/pithy](./TESTS/mbed_hal/trng/pithy) - BSD-3-Clause +- [tools/data/rpc](./tools/data/rpc) - MIT +- [targets](./targets) - PBL, BSD-style, MIT-style, Zlib-style, Public-domain ## Getting started for developers From f2897a99ca0b949aa8791a62dab3e4386c76bef3 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Tue, 12 Feb 2019 10:21:55 +0000 Subject: [PATCH 060/109] readme: storage license under one folder --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index da335abb13..13b277e6d6 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,7 @@ Folders containing files not under Apache 2.0 as listed above (each folder shoul - [features/lorawan](./features/lorawan) - Revised BSD - [features/lwipstack](./features/lwipstack) - BSD-style, MIT-style - [features/nanostack/sal-stack-nanostack](./features/nanostack/sal-stack-nanostack) - BSD-3-Clause -- [features/storage/FEATURE_STORAGE](./features/storage/FEATURE_STORAGE) - BSD-style -- [features/storage/blockdevice](./features/storage/blockdevice) - MIT -- [features/storage/filesystem/littlefs](./features/storage/filesystem/littlefs) - BSD-3-Clause -- [features/storage/filesystem/fat](./features/storage/filesystem/fat) - MIT, BSD-style +- [features/storage](./features/storage) - BSD-style, MIT - [features/netsocket/emac-drivers](./features/netsocket/emac-drivers) - BSD-style - [features/frameworks/unity/unity](./features/frameworks/unity/unity) - MIT - [features/unsupported](./features/unsupported) - MIT-style, BSD-style From 656ab6e89c3b3e017d794ea1b12bcc77fc007189 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Wed, 13 Feb 2019 11:25:59 +0000 Subject: [PATCH 061/109] license: rename to apache 2.0 txt file --- LICENSE => LICENSE-apache-2.0.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE-apache-2.0.txt (100%) diff --git a/LICENSE b/LICENSE-apache-2.0.txt similarity index 100% rename from LICENSE rename to LICENSE-apache-2.0.txt From 0c104f2155232ad1cafc584dec70ebabd0669b54 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Wed, 13 Feb 2019 11:29:46 +0000 Subject: [PATCH 062/109] license: add license file containing folders with non apache license --- LICENSE | 22 ++++++++++++++++++++++ README.md | 22 ++-------------------- 2 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..efda07b093 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +Unless specifically indicated otherwise in a file, files are licensed under the Apache 2.0 license, +as can be found in: LICENSE-apache-2.0.txt + +Folders containing files under different permissive license than Apache 2.0 are listed below. Eeach folder should contain own README file with license specified for its files. The original license text is included in those source files. + +- [cmsis](./cmsis) - MIT, BSD-3-Clause +- [components/802.15.4_RF/mcr20a-rf-driver](./components/802.15.4_RF/mcr20a-rf-driver) - BSD-3-Clause +- [features/cryptocell/FEATURE_CRYPTOCELL310](./features/cryptocell/FEATURE_CRYPTOCELL310) - ARM Object Code and Header Files License +- [features/FEATURE_BOOTLOADER](./features/FEATURE_BOOTLOADER) - PBL +- [features/FEATURE_BLE/targets](./features/FEATURE_BLE/targets) - BSD-style, PBL, MIT-style +- [features/lorawan](./features/lorawan) - Revised BSD +- [features/lwipstack](./features/lwipstack) - BSD-style, MIT-style +- [features/nanostack/sal-stack-nanostack](./features/nanostack/sal-stack-nanostack) - BSD-3-Clause +- [features/storage](./features/storage) - BSD-style, MIT +- [features/netsocket/emac-drivers](./features/netsocket/emac-drivers) - BSD-style +- [features/frameworks/unity/unity](./features/frameworks/unity/unity) - MIT +- [features/unsupported](./features/unsupported) - MIT-style, BSD-style +- [rtos](./rtos) - MIT +- [drivers](./drivers) - MIT +- [TESTS/mbed_hal/trng/pithy](./TESTS/mbed_hal/trng/pithy) - BSD-3-Clause +- [tools/data/rpc](./tools/data/rpc) - MIT +- [targets](./targets) - PBL, BSD-style, MIT-style, Zlib-style, Public-domain diff --git a/README.md b/README.md index 13b277e6d6..308b66860e 100644 --- a/README.md +++ b/README.md @@ -29,29 +29,11 @@ The [release notes](https://os.mbed.com/releases) detail the current release. Yo ## License and contributions -The software is provided under [Apache-2.0 license](LICENSE). Contributions to this project are accepted under the same license. Please see [contributing.md](CONTRIBUTING.md) for more info. +The software is provided under [Apache-2.0 license](LICENSE-apache-2.0.txt). Contributions to this project are accepted under the same license. Please see [contributing.md](CONTRIBUTING.md) for more info. This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html) -Folders containing files not under Apache 2.0 as listed above (each folder should contain own README file with license specified for its files). The original license text is included in those source files. - -- [cmsis](./cmsis) - MIT, BSD-3-Clause -- [components/802.15.4_RF/mcr20a-rf-driver](./components/802.15.4_RF/mcr20a-rf-driver) - BSD-3-Clause -- [features/cryptocell/FEATURE_CRYPTOCELL310](./features/cryptocell/FEATURE_CRYPTOCELL310) - ARM Object Code and Header Files License -- [features/FEATURE_BOOTLOADER](./features/FEATURE_BOOTLOADER) - PBL -- [features/FEATURE_BLE/targets](./features/FEATURE_BLE/targets) - BSD-style, PBL, MIT-style -- [features/lorawan](./features/lorawan) - Revised BSD -- [features/lwipstack](./features/lwipstack) - BSD-style, MIT-style -- [features/nanostack/sal-stack-nanostack](./features/nanostack/sal-stack-nanostack) - BSD-3-Clause -- [features/storage](./features/storage) - BSD-style, MIT -- [features/netsocket/emac-drivers](./features/netsocket/emac-drivers) - BSD-style -- [features/frameworks/unity/unity](./features/frameworks/unity/unity) - MIT -- [features/unsupported](./features/unsupported) - MIT-style, BSD-style -- [rtos](./rtos) - MIT -- [drivers](./drivers) - MIT -- [TESTS/mbed_hal/trng/pithy](./TESTS/mbed_hal/trng/pithy) - BSD-3-Clause -- [tools/data/rpc](./tools/data/rpc) - MIT -- [targets](./targets) - PBL, BSD-style, MIT-style, Zlib-style, Public-domain +Folders containing files under different permissive license than Apache 2.0 are listed in LICENSE file. ## Getting started for developers From f68aa8cd474b75f1452621cf5b0b084c8b6ff798 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Wed, 13 Feb 2019 14:06:49 +0000 Subject: [PATCH 063/109] readme: license file reference fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 308b66860e..970aeb1331 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The software is provided under [Apache-2.0 license](LICENSE-apache-2.0.txt). Con This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html) -Folders containing files under different permissive license than Apache 2.0 are listed in LICENSE file. +Folders containing files under different permissive license than Apache 2.0 are listed in [LICENSE](LICENSE) file. ## Getting started for developers From 22a288d489b184d0816154e15833e5fcda0540f8 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Thu, 14 Feb 2019 10:39:14 +0000 Subject: [PATCH 064/109] readme: fix space and . in license --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 970aeb1331..3e3d985518 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,9 @@ The [release notes](https://os.mbed.com/releases) detail the current release. Yo ## License and contributions -The software is provided under [Apache-2.0 license](LICENSE-apache-2.0.txt). Contributions to this project are accepted under the same license. Please see [contributing.md](CONTRIBUTING.md) for more info. +The software is provided under [Apache-2.0 license](LICENSE-apache-2.0.txt). Contributions to this project are accepted under the same license. Please see [contributing.md](CONTRIBUTING.md) for more info. -This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html) +This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html). Folders containing files under different permissive license than Apache 2.0 are listed in [LICENSE](LICENSE) file. From 38fa21d9d65b3c74cdf29d5e10c0156f21e0465b Mon Sep 17 00:00:00 2001 From: Amanda Butler Date: Fri, 15 Feb 2019 13:58:14 -0600 Subject: [PATCH 065/109] Fix typo in LICENSE Fix typo as requested in comments. --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index efda07b093..4522260636 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ Unless specifically indicated otherwise in a file, files are licensed under the Apache 2.0 license, as can be found in: LICENSE-apache-2.0.txt -Folders containing files under different permissive license than Apache 2.0 are listed below. Eeach folder should contain own README file with license specified for its files. The original license text is included in those source files. +Folders containing files under different permissive license than Apache 2.0 are listed below. Each folder should contain its own README file with license specified for its files. The original license text is included in those source files. - [cmsis](./cmsis) - MIT, BSD-3-Clause - [components/802.15.4_RF/mcr20a-rf-driver](./components/802.15.4_RF/mcr20a-rf-driver) - BSD-3-Clause From 4a58fa1e26f8ce0b76477785db080c9c1ac39bfb Mon Sep 17 00:00:00 2001 From: Amanda Butler Date: Fri, 15 Feb 2019 14:05:29 -0600 Subject: [PATCH 066/109] Add articles to README.md Include articles for clarity. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3e3d985518..bed98b0caf 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,11 @@ The [release notes](https://os.mbed.com/releases) detail the current release. Yo ## License and contributions -The software is provided under [Apache-2.0 license](LICENSE-apache-2.0.txt). Contributions to this project are accepted under the same license. Please see [contributing.md](CONTRIBUTING.md) for more info. +The software is provided under the [Apache-2.0 license](LICENSE-apache-2.0.txt). Contributions to this project are accepted under the same license. Please see [contributing.md](CONTRIBUTING.md) for more information. This project contains code from other projects. The original license text is included in those source files. They must comply with our [license guide](https://os.mbed.com/docs/latest/reference/license.html). -Folders containing files under different permissive license than Apache 2.0 are listed in [LICENSE](LICENSE) file. +Folders containing files under different permissive license than Apache 2.0 are listed in the [LICENSE](LICENSE) file. ## Getting started for developers From 783485f3b7ff7a5f426932912cbba8f0e0d35db3 Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Thu, 14 Feb 2019 14:44:51 -0600 Subject: [PATCH 067/109] Remove pyocd requirement and update icetea. Icetea depends on mbed-flasher. mbed-flasher recently released a version that drops the dependency on pyocd. Icetea released a version that uses this latest version of mbed-flasher. So now tht pyocd is no longer in our dependency tree, we can drop it here. --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index f6459351c0..de08793b17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,5 +20,4 @@ beautifulsoup4>=4,<=4.6.3 fuzzywuzzy>=0.11,<=0.17 pyelftools>=0.24,<=0.25 git+https://github.com/armmbed/manifest-tool.git@v1.4.6 -pyocd>=0.14,<0.15 -icetea>=1.0.2,<1.1 +icetea>=1.2.1,<1.3 From da5c3a84f6fec7dc4fb03ccdcf6a02ea9263ffcb Mon Sep 17 00:00:00 2001 From: Naveen Kaje Date: Fri, 15 Feb 2019 11:02:57 -0600 Subject: [PATCH 068/109] tools: export: MCUXpresso: fix case inconsistencies in .templ file names The templ file names are both all upper case and lower case letters. The Target Names map is usually all upper case. The match could fail if the templ file, as we have case-sensitive comparison. Handle such cases by perorming a case-insensitve check. mbed export of a project to MCUXpresso could potentially always fail irrespective of what is passed in -m option since the target names map entry and the filename may not match. This commit fixes this issue. Example of the issue that this commit fixes: $ mbed export -i mcuxpresso -m lpc11u68 -v project.py: error: LPC11U68 not supported by mcuxpresso --- tools/export/mcuxpresso/__init__.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/export/mcuxpresso/__init__.py b/tools/export/mcuxpresso/__init__.py index 52e1f77c94..54a2db4313 100644 --- a/tools/export/mcuxpresso/__init__.py +++ b/tools/export/mcuxpresso/__init__.py @@ -1,6 +1,6 @@ """ mbed SDK -Copyright (c) 2011-2016 ARM Limited +Copyright (c) 2011-2019 ARM Limited Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -28,9 +28,10 @@ from builtins import str import copy import tempfile import shutil +import re from subprocess import Popen, PIPE -from os import getcwd, remove +from os import getcwd, remove, listdir from os.path import splitext, basename, exists from random import randint @@ -54,10 +55,19 @@ class MCUXpresso(GNUARMEclipse): MBED_CONFIG_HEADER_SUPPORTED = True + @staticmethod + def is_target_name_in_dir(path, target_name): + # toos/export/mcuxpresso/ has entries with + # both lower and upper case. Handle these inconsistencies. + for entry in listdir(path): + if(re.match(entry, target_name + '_cproject.tmpl', re.IGNORECASE)): + return True + return False + @classmethod def is_target_supported(cls, target_name): # target is supported when *_cproject.tmpl template file exists - if exists(cls.TEMPLATE_DIR + '/mcuxpresso/' + target_name + '_cproject.tmpl'): + if MCUXpresso.is_target_name_in_dir(cls.TEMPLATE_DIR + '/mcuxpresso/', target_name): target = TARGET_MAP[target_name] return apply_supported_whitelist( cls.TOOLCHAIN, POST_BINARY_WHITELIST, target) From 6be5ad09f2db83faf432d450a1660d4a80e4bab4 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Fri, 15 Feb 2019 17:33:21 +0200 Subject: [PATCH 069/109] ESP8266: connect() returns OK in non-blocking calls --- components/wifi/esp8266-driver/ESP8266Interface.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/wifi/esp8266-driver/ESP8266Interface.cpp b/components/wifi/esp8266-driver/ESP8266Interface.cpp index 1f3ea4b592..f3e7d4b7de 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.cpp +++ b/components/wifi/esp8266-driver/ESP8266Interface.cpp @@ -253,7 +253,11 @@ int ESP8266Interface::connect() _cmutex.unlock(); - return _connect_retval; + if (!_if_blocking) { + return NSAPI_ERROR_OK; + } else { + return _connect_retval; + } } int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security) From 631acd4ac8d03cd4116fa9c13b61b3bd83e2ac27 Mon Sep 17 00:00:00 2001 From: Marcin Tomczyk Date: Wed, 9 Jan 2019 13:07:36 +0100 Subject: [PATCH 070/109] ONME-3949 Configuration options for STM_EMAC buffer counts --- .../emac-drivers/TARGET_STM_EMAC/mbed_lib.json | 13 +++++++++++++ .../TARGET_STM32F1/device/stm32f1xx_hal_conf.h | 10 ++++++++-- .../TARGET_STM32F2/device/stm32f2xx_hal_conf.h | 10 ++++++++-- .../TARGET_STM32F4/device/stm32f4xx_hal_conf.h | 10 ++++++++-- .../TARGET_STM32F7/device/stm32f7xx_hal_conf.h | 9 +++++++-- 5 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 features/netsocket/emac-drivers/TARGET_STM_EMAC/mbed_lib.json diff --git a/features/netsocket/emac-drivers/TARGET_STM_EMAC/mbed_lib.json b/features/netsocket/emac-drivers/TARGET_STM_EMAC/mbed_lib.json new file mode 100644 index 0000000000..39ae08e4a4 --- /dev/null +++ b/features/netsocket/emac-drivers/TARGET_STM_EMAC/mbed_lib.json @@ -0,0 +1,13 @@ +{ + "name": "stm32-emac", + "config": { + "eth-rxbufnb": 4, + "eth-txbufnb": 4 + }, + "target_overrides": { + "NUCLEO_F207ZG": { + "eth-rxbufnb": 1, + "eth-txbufnb": 4 + } + } +} diff --git a/targets/TARGET_STM/TARGET_STM32F1/device/stm32f1xx_hal_conf.h b/targets/TARGET_STM/TARGET_STM32F1/device/stm32f1xx_hal_conf.h index 55aad36197..3bfc9a065b 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/device/stm32f1xx_hal_conf.h +++ b/targets/TARGET_STM/TARGET_STM32F1/device/stm32f1xx_hal_conf.h @@ -164,8 +164,14 @@ extern "C" { /* Definition of the Ethernet driver buffers size and count */ #define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ #define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 8U /* 8 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +#ifdef MBED_CONF_STM32_EMAC_ETH_RXBUFNB +#define ETH_RXBUFNB MBED_CONF_STM32_EMAC_ETH_RXBUFNB /* Rx buffers of size ETH_RX_BUF_SIZE */ +#endif + +#ifdef MBED_CONF_STM32_EMAC_ETH_TXBUFNB +#define ETH_TXBUFNB MBED_CONF_STM32_EMAC_ETH_TXBUFNB /* Tx buffers of size ETH_TX_BUF_SIZE */ +#endif /* Section 2: PHY configuration section */ diff --git a/targets/TARGET_STM/TARGET_STM32F2/device/stm32f2xx_hal_conf.h b/targets/TARGET_STM/TARGET_STM32F2/device/stm32f2xx_hal_conf.h index 23c209ca62..2ca8e308ee 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/device/stm32f2xx_hal_conf.h +++ b/targets/TARGET_STM/TARGET_STM32F2/device/stm32f2xx_hal_conf.h @@ -175,8 +175,14 @@ /* Definition of the Ethernet driver buffers size and count */ #define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ #define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +#ifdef MBED_CONF_STM32_EMAC_ETH_RXBUFNB +#define ETH_RXBUFNB MBED_CONF_STM32_EMAC_ETH_RXBUFNB /* Rx buffers of size ETH_RX_BUF_SIZE */ +#endif + +#ifdef MBED_CONF_STM32_EMAC_ETH_TXBUFNB +#define ETH_TXBUFNB MBED_CONF_STM32_EMAC_ETH_TXBUFNB /* Tx buffers of size ETH_TX_BUF_SIZE */ +#endif /* Section 2: PHY configuration section */ diff --git a/targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_conf.h b/targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_conf.h index 44179a7e50..5d7d9caec6 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_conf.h +++ b/targets/TARGET_STM/TARGET_STM32F4/device/stm32f4xx_hal_conf.h @@ -183,8 +183,14 @@ /* Definition of the Ethernet driver buffers size and count */ #define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ #define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +#ifdef MBED_CONF_STM32_EMAC_ETH_RXBUFNB +#define ETH_RXBUFNB MBED_CONF_STM32_EMAC_ETH_RXBUFNB /* Rx buffers of size ETH_RX_BUF_SIZE */ +#endif + +#ifdef MBED_CONF_STM32_EMAC_ETH_TXBUFNB +#define ETH_TXBUFNB MBED_CONF_STM32_EMAC_ETH_TXBUFNB /* Tx buffers of size ETH_TX_BUF_SIZE */ +#endif /* Section 2: PHY configuration section */ diff --git a/targets/TARGET_STM/TARGET_STM32F7/device/stm32f7xx_hal_conf.h b/targets/TARGET_STM/TARGET_STM32F7/device/stm32f7xx_hal_conf.h index f484b45c73..c3c9080c3f 100644 --- a/targets/TARGET_STM/TARGET_STM32F7/device/stm32f7xx_hal_conf.h +++ b/targets/TARGET_STM/TARGET_STM32F7/device/stm32f7xx_hal_conf.h @@ -189,9 +189,14 @@ /* Definition of the Ethernet driver buffers size and count */ #define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ #define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ +#ifdef MBED_CONF_STM32_EMAC_ETH_RXBUFNB +#define ETH_RXBUFNB MBED_CONF_STM32_EMAC_ETH_RXBUFNB /* Rx buffers of size ETH_RX_BUF_SIZE */ +#endif + +#ifdef MBED_CONF_STM32_EMAC_ETH_TXBUFNB +#define ETH_TXBUFNB MBED_CONF_STM32_EMAC_ETH_TXBUFNB /* Tx buffers of size ETH_TX_BUF_SIZE */ +#endif /* Section 2: PHY configuration section */ /* DP83848 PHY Address*/ From 1f5fdbc43b12168c4c746cc658e031b361c54084 Mon Sep 17 00:00:00 2001 From: Desmond Chen Date: Tue, 19 Feb 2019 14:19:44 +0800 Subject: [PATCH 071/109] BLE:Cordio: ATTS setting for write cback should use bitwise or --- .../targets/TARGET_CORDIO/source/CordioGattServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioGattServer.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioGattServer.cpp index 8a096aab26..e553256087 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioGattServer.cpp +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioGattServer.cpp @@ -294,7 +294,7 @@ ble_error_t GattServer::insert_characteristic_value_attribute( attribute_it->settings = ATTS_SET_READ_CBACK; } if (properties & WRITABLE_PROPERTIES) { - attribute_it->settings = ATTS_SET_WRITE_CBACK; + attribute_it->settings |= ATTS_SET_WRITE_CBACK; } if (value_attribute.getUUID().shortOrLong() == UUID::UUID_TYPE_LONG) { attribute_it->settings |= ATTS_SET_UUID_128; From dae6a757eabe510affa316e53d44e9f91063b642 Mon Sep 17 00:00:00 2001 From: Michal Paszta Date: Fri, 15 Feb 2019 11:37:00 +0200 Subject: [PATCH 072/109] Greentea: Remove TLSSocket_simultaneous test The reason is that some platforms lack memory to run it. To be brought back once TLS library memory consumption is optimized. --- TESTS/netsocket/tls/main.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/TESTS/netsocket/tls/main.cpp b/TESTS/netsocket/tls/main.cpp index 0e7316a9e3..9ee0dfee56 100644 --- a/TESTS/netsocket/tls/main.cpp +++ b/TESTS/netsocket/tls/main.cpp @@ -195,9 +195,12 @@ Case cases[] = { Case("TLSSOCKET_SEND_REPEAT", TLSSOCKET_SEND_REPEAT), Case("TLSSOCKET_SEND_TIMEOUT", TLSSOCKET_SEND_TIMEOUT), Case("TLSSOCKET_NO_CERT", TLSSOCKET_NO_CERT), -#ifndef __IAR_SYSTEMS_ICC__ - Case("TLSSOCKET_SIMULTANEOUS", TLSSOCKET_SIMULTANEOUS) -#endif +// Temporarily removing this test, as TLS library consumes too much memory +// and we see frequent memory allocation failures on architectures with less +// RAM such as DISCO_L475VG_IOT1A and NUCLEO_F207ZG (both have 128 kB RAM) +// This test also fails for IAR, due to wrong heap configuration in the linker +// script - see https://github.com/ARMmbed/mbed-os/issues/8306 +// Case("TLSSOCKET_SIMULTANEOUS", TLSSOCKET_SIMULTANEOUS) }; Specification specification(greentea_setup, cases, greentea_teardown, greentea_continue_handlers); From fb4441ffc05eca7833d11d3ab1283fe8fb19109c Mon Sep 17 00:00:00 2001 From: Arto Kinnunen Date: Tue, 19 Feb 2019 11:58:19 +0200 Subject: [PATCH 073/109] Update Nanostack_HAL licenses and copyright year -Add Apache License to files that were missing a licence -Update copyright year --- .../arm_hal_fhss_timer.cpp | 13 +++++++------ .../arm_hal_interrupt.c | 13 +++++++------ .../arm_hal_interrupt_private.h | 13 +++++++------ .../arm_hal_random.c | 13 +++++++------ .../arm_hal_timer.cpp | 13 +++++++------ .../nanostack-hal-mbed-cmsis-rtos/cs_nvm/cs_nvm.c | 13 +++++++------ .../unittest/cs_nvm/csnvmtest.cpp | 15 ++++++++++++++- .../test_cs_nvm_unit/unittest/cs_nvm/main.cpp | 15 ++++++++++++++- .../unittest/cs_nvm/test_cs_nvm.c | 15 ++++++++++++++- .../unittest/cs_nvm/test_cs_nvm.h | 15 ++++++++++++++- .../unittest/stubs/configuration_store_stub.c | 15 ++++++++++++++- .../unittest/stubs/configuration_store_stub.h | 15 ++++++++++++++- .../unittest/stubs/ns_trace_stub.c | 15 ++++++++++++++- .../unittest/stubs/nsdynmemLIB_stub.c | 15 ++++++++++++++- .../unittest/stubs/nsdynmemLIB_stub.h | 15 ++++++++++++++- .../unittest/stubs/timeout_stub.c | 15 ++++++++++++++- .../nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c | 13 +++++++------ .../nanostack-hal-mbed-cmsis-rtos/ns_event_loop.h | 13 +++++++------ .../ns_event_loop_mbed.cpp | 13 +++++++------ .../ns_event_loop_mutex.c | 13 +++++++------ .../ns_event_loop_mutex.h | 13 +++++++------ .../nanostack-hal-mbed-cmsis-rtos/ns_hal_init.c | 13 +++++++------ .../nanostack-hal-mbed-cmsis-rtos/ns_hal_init.h | 13 +++++++------ .../nanostack-hal-mbed-cmsis-rtos/nvm/nvm_ram.c | 15 ++++++++++++++- 24 files changed, 245 insertions(+), 89 deletions(-) diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_fhss_timer.cpp b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_fhss_timer.cpp index ca9bc0a338..e5aa08f8f8 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_fhss_timer.cpp +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_fhss_timer.cpp @@ -1,15 +1,16 @@ /* - * Copyright (c) 2018 ARM Limited. All rights reserved. + * Copyright (c) 2018-2019, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt.c index e09dd3e8bf..519e3995b9 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt.c @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt_private.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt_private.h index 586e2e9604..6bea5dcd07 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt_private.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_interrupt_private.h @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_random.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_random.c index 2def6c4f16..7ba0aae6f8 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_random.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_random.c @@ -1,15 +1,16 @@ /* - * Copyright (c) 2015 ARM Limited. All rights reserved. + * Copyright (c) 2015, 2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_timer.cpp b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_timer.cpp index 7aeb13f334..c7952d1be9 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_timer.cpp +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/arm_hal_timer.cpp @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/cs_nvm.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/cs_nvm.c index bdd77358f6..4b9eed9f93 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/cs_nvm.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/cs_nvm.c @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/csnvmtest.cpp b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/csnvmtest.cpp index 4393ca4ad6..ee1e1881c5 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/csnvmtest.cpp +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/csnvmtest.cpp @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "CppUTest/TestHarness.h" diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/main.cpp b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/main.cpp index cc82213e17..d6a8a5740c 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/main.cpp +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/main.cpp @@ -1,5 +1,18 @@ /* - * Copyright (c) 2015 ARM Limited. All rights reserved. + * Copyright (c) 2015, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "CppUTest/CommandLineTestRunner.h" diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.c index ced1cec5e8..915a82ea5e 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.c @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.h index 36155af9f6..b14537ddd6 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/cs_nvm/test_cs_nvm.h @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 TEST_NS_NVM_HELPER_H #define TEST_NS_NVM_HELPER_H diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.c index e00ead2cad..556c159b6c 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.c @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.h index 02d53e4294..418b230143 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/configuration_store_stub.h @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 __CONFIGURATION_STORE_STUB_H__ #define __CONFIGURATION_STORE_STUB_H__ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/ns_trace_stub.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/ns_trace_stub.c index b4b4f442b6..d58eb4c4a5 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/ns_trace_stub.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/ns_trace_stub.c @@ -1,5 +1,18 @@ /* - * Copyright (c) 2014-2016 ARM Limited. All rights reserved. + * Copyright (c) 2014-2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.c index 0b10772efc..e870047d86 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.c @@ -1,5 +1,18 @@ /* - * Copyright (c) 2014-2016 ARM Limited. All rights reserved. + * Copyright (c) 2014-2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "nsdynmemLIB_stub.h" diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.h index 3a15519876..4ab78ec9dd 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/nsdynmemLIB_stub.h @@ -1,5 +1,18 @@ /* - * Copyright (c) 2015-2016 ARM Limited. All rights reserved. + * Copyright (c) 2015-2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 __NSDYNMEMLIB_STUB_H__ #define __NSDYNMEMLIB_STUB_H__ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/timeout_stub.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/timeout_stub.c index be22af487a..4e18eb5010 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/timeout_stub.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/cs_nvm/test/test_cs_nvm_unit/unittest/stubs/timeout_stub.c @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016 ARM Limited. All rights reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 "eventOS_event_timer.h" diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c index ec970bdd07..9b1655c127 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.c @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.h index 8dc55bd737..5e38ece428 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop.h @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mbed.cpp b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mbed.cpp index 6953cb660d..96e320884b 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mbed.cpp +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mbed.cpp @@ -1,15 +1,16 @@ /* - * Copyright (c) 2018 ARM Limited. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.c index b65c98617a..d6244d4757 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.c @@ -1,15 +1,16 @@ /* - * Copyright (c) 2018 ARM Limited. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.h index ce3ac9beb6..d8a56ca62a 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_event_loop_mutex.h @@ -1,15 +1,16 @@ /* - * Copyright (c) 2018 ARM Limited. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.c index 566472a0dc..0a81c9ef17 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.c @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.h b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.h index 10991ce4c7..a26b48cc25 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.h +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/ns_hal_init.h @@ -1,15 +1,16 @@ /* - * Copyright (c) 2016-2018 ARM Limited. All rights reserved. + * Copyright (c) 2016-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. + * + * 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 + * 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. + * 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. */ diff --git a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/nvm/nvm_ram.c b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/nvm/nvm_ram.c index 51ad41160c..12a6974fa9 100644 --- a/features/nanostack/nanostack-hal-mbed-cmsis-rtos/nvm/nvm_ram.c +++ b/features/nanostack/nanostack-hal-mbed-cmsis-rtos/nvm/nvm_ram.c @@ -1,5 +1,18 @@ /* - * Copyright (c) 2016, ARM Limited, All Rights Reserved. + * Copyright (c) 2016, 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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. */ #ifdef MBED_CONF_NANOSTACK_HAL_NVM_CFSTORE From 7824c793b7188c8f7b282a8e77817567f2086617 Mon Sep 17 00:00:00 2001 From: Netanel Gonen Date: Mon, 18 Feb 2019 13:56:50 +0200 Subject: [PATCH 074/109] support in more types then just RSA_KEYPAIR if the type is not supported the psa_crypto will return the error code for unsupported --- .../crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c b/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c index d734903874..5cc9acc2bc 100644 --- a/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c +++ b/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c @@ -1003,18 +1003,13 @@ psa_status_t psa_generate_key(psa_key_slot_t key, in_vec[1].base = &bits; in_vec[1].len = sizeof(size_t); - /* currently the parameter argument is used only for RSA keypair - and ignored in other cases. support for other algorithms - may be added later*/ - if (PSA_KEY_TYPE_RSA_KEYPAIR == type) { - in_vec[2].base = parameters; - /* size of parameter is unsigned integer as defined in header */ - in_vec[2].len = parameters_size; - } else { // currenty ignored for non RSA case - in_vec[2].base = NULL; - in_vec[2].len = 0; + if (((parameters == NULL) && (parameters_size != 0)) || ((parameters != NULL) && (parameters_size == 0))) { + return (PSA_ERROR_INVALID_ARGUMENT); } + in_vec[2].base = parameters; + in_vec[2].len = parameters_size; + handle = psa_connect(PSA_KEY_MNG_ID, MINOR_VER); if (handle <= 0) { return (PSA_ERROR_COMMUNICATION_FAILURE); From 31b9ce2d0be5a6fbc20ee0961b37615dad2a1c3a Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Thu, 14 Feb 2019 13:54:31 +0000 Subject: [PATCH 075/109] cmsis conf: change license to apache 2.0 --- cmsis/mbed_cmsis_conf.h | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/cmsis/mbed_cmsis_conf.h b/cmsis/mbed_cmsis_conf.h index d5ba37c8b2..d0fed8c324 100644 --- a/cmsis/mbed_cmsis_conf.h +++ b/cmsis/mbed_cmsis_conf.h @@ -1,23 +1,18 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2012 ARM Limited +/* + * Copyright (c) 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * 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 * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * 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_CMSIS_CONF_H #define MBED_CMSIS_CONF_H From b6fe528a5dff3bf10bcfd3cfe31a445a61b8126f Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Thu, 14 Feb 2019 13:58:07 +0000 Subject: [PATCH 076/109] wifi test: add license info --- TESTS/network/wifi/wifi_tests.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/TESTS/network/wifi/wifi_tests.h b/TESTS/network/wifi/wifi_tests.h index b7d598b8b6..579b4d6e59 100644 --- a/TESTS/network/wifi/wifi_tests.h +++ b/TESTS/network/wifi/wifi_tests.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018, Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * 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 WIFI_TESTS_H #define WIFI_TESTS_H From e3e8d490e72119ff735207a393423c82fe788943 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Thu, 14 Feb 2019 14:02:35 +0000 Subject: [PATCH 077/109] test mbedmicro: fix licenses --- TESTS/mbedmicro-mbed/attributes/attributes.c | 17 +++++++++++++++++ TESTS/mbedmicro-mbed/attributes/weak.c | 17 +++++++++++++++++ TESTS/mbedmicro-mbed/static_assert/test_c.c | 17 +++++++++++++++++ TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp | 17 +++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/TESTS/mbedmicro-mbed/attributes/attributes.c b/TESTS/mbedmicro-mbed/attributes/attributes.c index 5329b8a3c5..2f031f4f47 100644 --- a/TESTS/mbedmicro-mbed/attributes/attributes.c +++ b/TESTS/mbedmicro-mbed/attributes/attributes.c @@ -1,3 +1,20 @@ +/* +* Copyright (c) 2016-2018 ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* 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 "mbed_toolchain.h" #include diff --git a/TESTS/mbedmicro-mbed/attributes/weak.c b/TESTS/mbedmicro-mbed/attributes/weak.c index 7b2f862177..745cdca84c 100644 --- a/TESTS/mbedmicro-mbed/attributes/weak.c +++ b/TESTS/mbedmicro-mbed/attributes/weak.c @@ -1,3 +1,20 @@ +/* +* Copyright (c) 2016-2018 ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* 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 "mbed_toolchain.h" int testWeak1() diff --git a/TESTS/mbedmicro-mbed/static_assert/test_c.c b/TESTS/mbedmicro-mbed/static_assert/test_c.c index b908a2e872..ab7612eea2 100644 --- a/TESTS/mbedmicro-mbed/static_assert/test_c.c +++ b/TESTS/mbedmicro-mbed/static_assert/test_c.c @@ -1,3 +1,20 @@ +/* +* Copyright (c) 2015-2018 ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* 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 "mbed_assert.h" #define THE_ANSWER 42 diff --git a/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp b/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp index 2bff2780cb..55755dcee0 100644 --- a/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp +++ b/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp @@ -1,3 +1,20 @@ +/* +* Copyright (c) 2016-2018 ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* 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 "mbed_assert.h" #define THE_ANSWER 42 From 75ba44a6d058c826363751cf955e558994bed0d9 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Thu, 14 Feb 2019 14:06:15 +0000 Subject: [PATCH 078/109] check release: add license header --- tools/check_release.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/check_release.py b/tools/check_release.py index 4d940fbb2d..249945946c 100644 --- a/tools/check_release.py +++ b/tools/check_release.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + # Script to check a new mbed 2 release by compiling a set of specified test apps # for all currently supported platforms. Each test app must include an mbed library. # This can either be the pre-compiled version 'mbed' or the source version 'mbed-dev'. From aaa2b2b5dca6d63fa33451cd9197786a44cb68fc Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Fri, 15 Feb 2019 13:19:05 +0000 Subject: [PATCH 079/109] tools: add license headers --- tools/arm_pack_manager/__init__.py | 18 ++++++++++++++++++ tools/arm_pack_manager/pack_manager.py | 17 +++++++++++++++++ tools/check_release.py | 2 +- tools/dev/intel_hex_utils.py | 18 ++++++++++++++++++ tools/export/exporters.py | 18 ++++++++++++++++++ tools/host_tests/midi.py | 20 +++++++++++++++++++- tools/importer/importer.py | 18 ++++++++++++++++++ tools/memap.py | 18 ++++++++++++++++++ tools/misc/find_c_includes.py | 18 ++++++++++++++++++ tools/misc/remove-device-h.py | 18 ++++++++++++++++++ tools/project.py | 18 ++++++++++++++++++ tools/test/__init__.py | 17 +++++++++++++++++ tools/test/examples/examples.py | 18 ++++++++++++++++++ tools/test/examples/examples_lib.py | 20 +++++++++++++++++++- tools/test/memap/parse_test.py | 18 ++++++++++++++++++ tools/test/pylint.py | 18 ++++++++++++++++++ tools/test/spm/__init__.py | 17 +++++++++++++++++ tools/test/toolchains/api_test.py | 18 ++++++++++++++++++ tools/test/toolchains/arm_support_test.py | 18 ++++++++++++++++++ tools/test_configs/__init__.py | 18 ++++++++++++++++++ 20 files changed, 342 insertions(+), 3 deletions(-) diff --git a/tools/arm_pack_manager/__init__.py b/tools/arm_pack_manager/__init__.py index e33b3495d1..eac5cf4232 100644 --- a/tools/arm_pack_manager/__init__.py +++ b/tools/arm_pack_manager/__init__.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2018 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + try: from urllib2 import urlopen, URLError except ImportError: diff --git a/tools/arm_pack_manager/pack_manager.py b/tools/arm_pack_manager/pack_manager.py index edc492803b..6c946d87fe 100644 --- a/tools/arm_pack_manager/pack_manager.py +++ b/tools/arm_pack_manager/pack_manager.py @@ -1,3 +1,20 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" from __future__ import print_function, division, absolute_import import argparse from os.path import basename diff --git a/tools/check_release.py b/tools/check_release.py index 249945946c..e64e6d2a4f 100644 --- a/tools/check_release.py +++ b/tools/check_release.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2016 ARM Limited. All rights reserved. +Copyright (c) 2016-2019 ARM Limited. All rights reserved. SPDX-License-Identifier: Apache-2.0 diff --git a/tools/dev/intel_hex_utils.py b/tools/dev/intel_hex_utils.py index c60e9c4e74..75ec2bfbc4 100644 --- a/tools/dev/intel_hex_utils.py +++ b/tools/dev/intel_hex_utils.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2014-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + from intelhex import IntelHex from cStringIO import StringIO diff --git a/tools/export/exporters.py b/tools/export/exporters.py index 61e91f48a0..b0db20e274 100644 --- a/tools/export/exporters.py +++ b/tools/export/exporters.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + """Just a template for subclassing""" import os from abc import abstractmethod, ABCMeta diff --git a/tools/host_tests/midi.py b/tools/host_tests/midi.py index 67f34ea6f8..3df89070b2 100644 --- a/tools/host_tests/midi.py +++ b/tools/host_tests/midi.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + from __future__ import print_function import sys import re @@ -69,4 +87,4 @@ try: test_midi_out_loopback(output_port,input_port) except KeyboardInterrupt: - pass \ No newline at end of file + pass diff --git a/tools/importer/importer.py b/tools/importer/importer.py index b093309e1d..f57de43af8 100644 --- a/tools/importer/importer.py +++ b/tools/importer/importer.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2017-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + import os import json import sys diff --git a/tools/memap.py b/tools/memap.py index 3691f89ce8..b233eab327 100644 --- a/tools/memap.py +++ b/tools/memap.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + #!/usr/bin/env python """Memory Map File Analyser for ARM mbed""" diff --git a/tools/misc/find_c_includes.py b/tools/misc/find_c_includes.py index e24c6d13c8..34d1ef2712 100644 --- a/tools/misc/find_c_includes.py +++ b/tools/misc/find_c_includes.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + #!/usr/bin/env python import os diff --git a/tools/misc/remove-device-h.py b/tools/misc/remove-device-h.py index 6e71ecb2f4..a7834f3856 100644 --- a/tools/misc/remove-device-h.py +++ b/tools/misc/remove-device-h.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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. +""" + import json import os import stat diff --git a/tools/project.py b/tools/project.py index 550c2eec3e..1037a6ee33 100644 --- a/tools/project.py +++ b/tools/project.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + """ The CLI entry point for exporting projects from the mbed tools to any of the supported IDEs or project structures. """ diff --git a/tools/test/__init__.py b/tools/test/__init__.py index e69de29bb2..0119582f3f 100644 --- a/tools/test/__init__.py +++ b/tools/test/__init__.py @@ -0,0 +1,17 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" diff --git a/tools/test/examples/examples.py b/tools/test/examples/examples.py index 3fbeaa3acc..bf3f2796e5 100644 --- a/tools/test/examples/examples.py +++ b/tools/test/examples/examples.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2017-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + """ import and bulid a bunch of example programs """ from argparse import ArgumentParser diff --git a/tools/test/examples/examples_lib.py b/tools/test/examples/examples_lib.py index 308fb87c75..9d607cb83b 100644 --- a/tools/test/examples/examples_lib.py +++ b/tools/test/examples/examples_lib.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2017-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + """ Import and bulid a bunch of example programs This library includes functions that are shared between the examples.py and @@ -425,4 +443,4 @@ def update_mbedos_version(config, tag, examples): return result return 0 - \ No newline at end of file + diff --git a/tools/test/memap/parse_test.py b/tools/test/memap/parse_test.py index 6ed7ecd7e5..e3bb7ed5ec 100644 --- a/tools/test/memap/parse_test.py +++ b/tools/test/memap/parse_test.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2018-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + import sys from io import open from os import sep diff --git a/tools/test/pylint.py b/tools/test/pylint.py index 9fc43ae18b..38c89705de 100644 --- a/tools/test/pylint.py +++ b/tools/test/pylint.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + """A test that all code scores above a 9.25 in pylint""" import subprocess diff --git a/tools/test/spm/__init__.py b/tools/test/spm/__init__.py index e69de29bb2..982d7317e5 100644 --- a/tools/test/spm/__init__.py +++ b/tools/test/spm/__init__.py @@ -0,0 +1,17 @@ +""" +Copyright (c) 2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" diff --git a/tools/test/toolchains/api_test.py b/tools/test/toolchains/api_test.py index f48ea1dc0d..1958afa41e 100644 --- a/tools/test/toolchains/api_test.py +++ b/tools/test/toolchains/api_test.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2017-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + """Tests for the toolchain sub-system""" import sys import os diff --git a/tools/test/toolchains/arm_support_test.py b/tools/test/toolchains/arm_support_test.py index b32bd7ab82..fdafa68a8c 100644 --- a/tools/test/toolchains/arm_support_test.py +++ b/tools/test/toolchains/arm_support_test.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2016-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + """Tests for the arm toolchain supported checks""" import sys import os diff --git a/tools/test_configs/__init__.py b/tools/test_configs/__init__.py index e397374339..5d40db4066 100644 --- a/tools/test_configs/__init__.py +++ b/tools/test_configs/__init__.py @@ -1,3 +1,21 @@ +""" +Copyright (c) 2018-2019 ARM Limited. All rights reserved. + +SPDX-License-Identifier: Apache-2.0 + +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 +""" + from os.path import dirname, abspath, join, exists from tools.utils import json_file_to_dict From a43ef525d616e3cfec55e792ef61a3c28412aae5 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Fri, 15 Feb 2019 13:37:40 +0000 Subject: [PATCH 080/109] copyright 2019 fix --- TESTS/mbedmicro-mbed/attributes/attributes.c | 2 +- TESTS/mbedmicro-mbed/attributes/weak.c | 2 +- TESTS/mbedmicro-mbed/static_assert/test_c.c | 2 +- TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp | 2 +- TESTS/network/wifi/wifi_tests.h | 2 +- cmsis/mbed_cmsis_conf.h | 2 +- tools/arm_pack_manager/__init__.py | 2 +- tools/memap.py | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/TESTS/mbedmicro-mbed/attributes/attributes.c b/TESTS/mbedmicro-mbed/attributes/attributes.c index 2f031f4f47..df7ede99bb 100644 --- a/TESTS/mbedmicro-mbed/attributes/attributes.c +++ b/TESTS/mbedmicro-mbed/attributes/attributes.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2016-2018 ARM Limited. All rights reserved. +* Copyright (c) 2016-2019 ARM Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * diff --git a/TESTS/mbedmicro-mbed/attributes/weak.c b/TESTS/mbedmicro-mbed/attributes/weak.c index 745cdca84c..9a30fe77ce 100644 --- a/TESTS/mbedmicro-mbed/attributes/weak.c +++ b/TESTS/mbedmicro-mbed/attributes/weak.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2016-2018 ARM Limited. All rights reserved. +* Copyright (c) 2016-2019 ARM Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * diff --git a/TESTS/mbedmicro-mbed/static_assert/test_c.c b/TESTS/mbedmicro-mbed/static_assert/test_c.c index ab7612eea2..adcff7073a 100644 --- a/TESTS/mbedmicro-mbed/static_assert/test_c.c +++ b/TESTS/mbedmicro-mbed/static_assert/test_c.c @@ -1,5 +1,5 @@ /* -* Copyright (c) 2015-2018 ARM Limited. All rights reserved. +* Copyright (c) 2015-2019 ARM Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * diff --git a/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp b/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp index 55755dcee0..024e4970cf 100644 --- a/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp +++ b/TESTS/mbedmicro-mbed/static_assert/test_cpp.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2016-2018 ARM Limited. All rights reserved. +* Copyright (c) 2016-2019 ARM Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * diff --git a/TESTS/network/wifi/wifi_tests.h b/TESTS/network/wifi/wifi_tests.h index 579b4d6e59..d5f8eea39e 100644 --- a/TESTS/network/wifi/wifi_tests.h +++ b/TESTS/network/wifi/wifi_tests.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Arm Limited and affiliates. + * Copyright (c) 2018-2019, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/cmsis/mbed_cmsis_conf.h b/cmsis/mbed_cmsis_conf.h index d0fed8c324..2a79698992 100644 --- a/cmsis/mbed_cmsis_conf.h +++ b/cmsis/mbed_cmsis_conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Arm Limited and affiliates. + * Copyright (c) 2018-2019, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tools/arm_pack_manager/__init__.py b/tools/arm_pack_manager/__init__.py index eac5cf4232..a16977245d 100644 --- a/tools/arm_pack_manager/__init__.py +++ b/tools/arm_pack_manager/__init__.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2016-2018 ARM Limited. All rights reserved. +Copyright (c) 2016-2019 ARM Limited. All rights reserved. SPDX-License-Identifier: Apache-2.0 diff --git a/tools/memap.py b/tools/memap.py index b233eab327..7f3a409f09 100644 --- a/tools/memap.py +++ b/tools/memap.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2016 ARM Limited. All rights reserved. +Copyright (c) 2016-2019 ARM Limited. All rights reserved. SPDX-License-Identifier: Apache-2.0 From 7049b585b56234b85872bbff57c592d63dbbc101 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Mon, 18 Feb 2019 15:45:33 +0000 Subject: [PATCH 081/109] tools: fix hashbang --- tools/memap.py | 4 ++-- tools/misc/find_c_includes.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/memap.py b/tools/memap.py index 7f3a409f09..99b6b561ea 100644 --- a/tools/memap.py +++ b/tools/memap.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + """ Copyright (c) 2016-2019 ARM Limited. All rights reserved. @@ -16,8 +18,6 @@ See the License for the specific language governing permissions and limitations under the License. """ -#!/usr/bin/env python - """Memory Map File Analyser for ARM mbed""" from __future__ import print_function, division, absolute_import diff --git a/tools/misc/find_c_includes.py b/tools/misc/find_c_includes.py index 34d1ef2712..292412f7d2 100644 --- a/tools/misc/find_c_includes.py +++ b/tools/misc/find_c_includes.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + """ Copyright (c) 2016-2019 ARM Limited. All rights reserved. @@ -16,8 +18,6 @@ See the License for the specific language governing permissions and limitations under the License. """ -#!/usr/bin/env python - import os import re From 81f7aa6003d3a5d267e1ef595686ae199cd3de62 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Tue, 19 Feb 2019 09:55:05 +0000 Subject: [PATCH 082/109] memap: remove not needed comment prior future import --- tools/memap.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/memap.py b/tools/memap.py index 99b6b561ea..f6c4c4a81b 100644 --- a/tools/memap.py +++ b/tools/memap.py @@ -17,8 +17,6 @@ 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. """ - -"""Memory Map File Analyser for ARM mbed""" from __future__ import print_function, division, absolute_import from abc import abstractmethod, ABCMeta From 6cbe7a77597bd5be480c849f6dbbe5f3d12668bd Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Tue, 19 Feb 2019 10:38:53 +0000 Subject: [PATCH 083/109] tools: move string description after import modules --- tools/export/exporters.py | 2 +- tools/project.py | 7 ++++--- tools/test/examples/examples.py | 4 ++-- tools/test/examples/examples_lib.py | 12 ++++++------ tools/test/pylint.py | 4 ++-- tools/test/toolchains/api_test.py | 3 ++- tools/test/toolchains/arm_support_test.py | 3 ++- 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/tools/export/exporters.py b/tools/export/exporters.py index b0db20e274..960f8d15ea 100644 --- a/tools/export/exporters.py +++ b/tools/export/exporters.py @@ -16,7 +16,6 @@ See the License for the specific language governing permissions and limitations under the License. """ -"""Just a template for subclassing""" import os from abc import abstractmethod, ABCMeta import logging @@ -30,6 +29,7 @@ from tools.targets import TARGET_MAP from tools.utils import mkdir from tools.resources import FileType +"""Just a template for subclassing""" class TargetNotSupportedException(Exception): """Indicates that an IDE does not support a particular MCU""" diff --git a/tools/project.py b/tools/project.py index 1037a6ee33..8002d41704 100644 --- a/tools/project.py +++ b/tools/project.py @@ -16,9 +16,6 @@ See the License for the specific language governing permissions and limitations """ -""" The CLI entry point for exporting projects from the mbed tools to any of the -supported IDEs or project structures. -""" from __future__ import print_function, absolute_import from builtins import str @@ -57,6 +54,10 @@ from tools.utils import NotSupportedException from tools.options import extract_profile, list_profiles, extract_mcus from tools.notifier.term import TerminalNotifier +""" The CLI entry point for exporting projects from the mbed tools to any of the +supported IDEs or project structures. +""" + EXPORTER_ALIASES = { u'gcc_arm': u'make_gcc_arm', u'uvision': u'uvision5', diff --git a/tools/test/examples/examples.py b/tools/test/examples/examples.py index bf3f2796e5..d3d698152d 100644 --- a/tools/test/examples/examples.py +++ b/tools/test/examples/examples.py @@ -16,8 +16,6 @@ See the License for the specific language governing permissions and limitations """ -""" import and bulid a bunch of example programs """ - from argparse import ArgumentParser import os from os.path import dirname, abspath, basename @@ -26,6 +24,8 @@ import sys import subprocess import json +""" import and bulid a bunch of example programs """ + ROOT = abspath(dirname(dirname(dirname(dirname(__file__))))) sys.path.insert(0, ROOT) diff --git a/tools/test/examples/examples_lib.py b/tools/test/examples/examples_lib.py index 9d607cb83b..89e488a8a5 100644 --- a/tools/test/examples/examples_lib.py +++ b/tools/test/examples/examples_lib.py @@ -15,6 +15,12 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations """ +import os +from os.path import dirname, abspath, basename +import os.path +import sys +import subprocess +from shutil import rmtree """ Import and bulid a bunch of example programs @@ -22,12 +28,6 @@ limitations the update.py modules. """ -import os -from os.path import dirname, abspath, basename -import os.path -import sys -import subprocess -from shutil import rmtree ROOT = abspath(dirname(dirname(dirname(dirname(__file__))))) sys.path.insert(0, ROOT) diff --git a/tools/test/pylint.py b/tools/test/pylint.py index 38c89705de..dc986eaab3 100644 --- a/tools/test/pylint.py +++ b/tools/test/pylint.py @@ -16,12 +16,12 @@ See the License for the specific language governing permissions and limitations """ -"""A test that all code scores above a 9.25 in pylint""" - import subprocess import re import os.path +"""A test that all code scores above a 9.25 in pylint""" + SCORE_REGEXP = re.compile( r'^Your\ code\ has\ been\ rated\ at\ (\-?[0-9\.]+)/10') diff --git a/tools/test/toolchains/api_test.py b/tools/test/toolchains/api_test.py index 1958afa41e..fded2c672e 100644 --- a/tools/test/toolchains/api_test.py +++ b/tools/test/toolchains/api_test.py @@ -16,7 +16,6 @@ See the License for the specific language governing permissions and limitations """ -"""Tests for the toolchain sub-system""" import sys import os from string import printable @@ -25,6 +24,8 @@ from mock import MagicMock, patch from hypothesis import given, settings, HealthCheck from hypothesis.strategies import text, lists, fixed_dictionaries, booleans +"""Tests for the toolchain sub-system""" + ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")) sys.path.insert(0, ROOT) diff --git a/tools/test/toolchains/arm_support_test.py b/tools/test/toolchains/arm_support_test.py index fdafa68a8c..e0f5aa6b64 100644 --- a/tools/test/toolchains/arm_support_test.py +++ b/tools/test/toolchains/arm_support_test.py @@ -16,7 +16,6 @@ See the License for the specific language governing permissions and limitations """ -"""Tests for the arm toolchain supported checks""" import sys import os from string import printable @@ -25,6 +24,8 @@ from mock import MagicMock, patch from hypothesis import given, settings from hypothesis.strategies import text, lists, sampled_from +"""Tests for the arm toolchain supported checks""" + ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")) sys.path.insert(0, ROOT) From 22832744078706c674fb0019af2984b4fea59562 Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Tue, 5 Feb 2019 18:28:57 +0200 Subject: [PATCH 084/109] PSOC6: enable export to CMake The approach for the hex_files subset selection is identical to makefile exporter: https://github.com/ARMmbed/mbed-os/pull/9466 Single hex file should be passed to srec_cat when hex_filename is set in targets.json or mbed_app.json. --- tools/export/cmake/__init__.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/export/cmake/__init__.py b/tools/export/cmake/__init__.py index 5cf7caa95d..10c5de002b 100644 --- a/tools/export/cmake/__init__.py +++ b/tools/export/cmake/__init__.py @@ -44,7 +44,8 @@ class CMake(Exporter): "MCU_NRF51Code.binary_hook", "TEENSY3_1Code.binary_hook", "LPCTargetCode.lpc_patch", - "LPC4088Code.binary_hook" + "LPC4088Code.binary_hook", + "PSOC6Code.complete" ]) @classmethod @@ -74,6 +75,12 @@ class CMake(Exporter): # sort includes reverse, so the deepest dir comes first (ensures short includes) includes = sorted([re.sub(r'^[.]/', '', l) for l in self.resources.inc_dirs], reverse=True) + # select dependant hex files to merge into compiled hex image + hex_files = self.resources.hex_files + if hasattr(self.toolchain.target, 'hex_filename'): + hex_filename = self.toolchain.target.hex_filename + hex_files = list(f for f in hex_files if basename(f) == hex_filename) + ctx = { 'name': self.project_name, 'target': self.target, @@ -83,7 +90,7 @@ class CMake(Exporter): 'include_paths': includes, 'library_paths': sorted([re.sub(r'^[.]/', '', l) for l in self.resources.lib_dirs]), 'linker_script': self.resources.linker_script, - 'hex_files': self.resources.hex_files, + 'hex_files': hex_files, 'ar': basename(self.toolchain.ar), 'cc': basename(self.toolchain.cc[0]), 'cc_flags': " ".join(flag for flag in self.toolchain.cc[1:] if not flag == "-c"), From bb3c20695ec77324ecfa50d04d8b3dfaf978493e Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Tue, 19 Feb 2019 20:03:00 +0200 Subject: [PATCH 085/109] tools/export: move hex_files selection to base Exporter class CMake and makefile exporters share a common logic for hex file selection. Factor it as a common property in the base class to avoid code duplication. --- tools/export/cmake/__init__.py | 8 +------- tools/export/exporters.py | 9 +++++++++ tools/export/makefile/__init__.py | 7 +------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/tools/export/cmake/__init__.py b/tools/export/cmake/__init__.py index 10c5de002b..67216544e1 100644 --- a/tools/export/cmake/__init__.py +++ b/tools/export/cmake/__init__.py @@ -75,12 +75,6 @@ class CMake(Exporter): # sort includes reverse, so the deepest dir comes first (ensures short includes) includes = sorted([re.sub(r'^[.]/', '', l) for l in self.resources.inc_dirs], reverse=True) - # select dependant hex files to merge into compiled hex image - hex_files = self.resources.hex_files - if hasattr(self.toolchain.target, 'hex_filename'): - hex_filename = self.toolchain.target.hex_filename - hex_files = list(f for f in hex_files if basename(f) == hex_filename) - ctx = { 'name': self.project_name, 'target': self.target, @@ -90,7 +84,7 @@ class CMake(Exporter): 'include_paths': includes, 'library_paths': sorted([re.sub(r'^[.]/', '', l) for l in self.resources.lib_dirs]), 'linker_script': self.resources.linker_script, - 'hex_files': hex_files, + 'hex_files': self.hex_files, 'ar': basename(self.toolchain.ar), 'cc': basename(self.toolchain.cc[0]), 'cc_flags': " ".join(flag for flag in self.toolchain.cc[1:] if not flag == "-c"), diff --git a/tools/export/exporters.py b/tools/export/exporters.py index 960f8d15ea..43504c6c13 100644 --- a/tools/export/exporters.py +++ b/tools/export/exporters.py @@ -141,6 +141,15 @@ class Exporter(object): return [l for l in self.resources.get_file_names(FileType.LIB) if l.endswith(self.toolchain.LIBRARY_EXT)] + @property + def hex_files(self): + """Returns a list of hex files to include in the exported project""" + hex_files = self.resources.hex_files + if hasattr(self.toolchain.target, 'hex_filename'): + hex_filename = self.toolchain.target.hex_filename + hex_files = [f for f in hex_files if basename(f) == hex_filename] + return hex_files + def toolchain_flags(self, toolchain): """Returns a dictionary of toolchain flags. Keys of the dictionary are: diff --git a/tools/export/makefile/__init__.py b/tools/export/makefile/__init__.py index c4d7412a0a..830c2cb252 100644 --- a/tools/export/makefile/__init__.py +++ b/tools/export/makefile/__init__.py @@ -84,11 +84,6 @@ class Makefile(Exporter): sys_libs = [self.prepare_sys_lib(lib) for lib in self.toolchain.sys_libs] - hex_files = self.resources.hex_files - if hasattr(self.toolchain.target, 'hex_filename'): - hex_filename = self.toolchain.target.hex_filename - hex_files = list(f for f in hex_files if basename(f) == hex_filename) - ctx = { 'name': self.project_name, 'to_be_compiled': to_be_compiled, @@ -98,7 +93,7 @@ class Makefile(Exporter): 'linker_script': self.resources.linker_script, 'libraries': libraries, 'ld_sys_libs': sys_libs, - 'hex_files': hex_files, + 'hex_files': self.hex_files, 'vpath': (["../../.."] if (basename(dirname(dirname(self.export_dir))) == "projectfiles") From c79e3fd10f4563748771b3e3878f2ffa0102a22f Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Fri, 15 Feb 2019 14:33:59 +0200 Subject: [PATCH 086/109] PSOC6: update PDL to the latest version --- .../psoc6pdl/drivers/include/cy_ble_clk.h | 11 +- .../psoc6pdl/drivers/include/cy_crypto.h | 313 ++-- .../drivers/include/cy_crypto_common.h | 291 +-- .../psoc6pdl/drivers/include/cy_crypto_core.h | 41 +- .../drivers/include/cy_crypto_core_aes.h | 125 +- .../drivers/include/cy_crypto_core_cmac.h | 32 +- .../drivers/include/cy_crypto_core_crc.h | 127 +- .../drivers/include/cy_crypto_core_crc_v1.h | 2 +- .../drivers/include/cy_crypto_core_crc_v2.h | 2 +- .../drivers/include/cy_crypto_core_des.h | 51 +- .../drivers/include/cy_crypto_core_ecc.h | 47 +- .../include/cy_crypto_core_ecc_nist_p.h | 59 +- .../drivers/include/cy_crypto_core_hmac.h | 27 +- .../drivers/include/cy_crypto_core_hw.h | 34 +- .../drivers/include/cy_crypto_core_hw_v2.h | 38 +- .../drivers/include/cy_crypto_core_hw_vu.h | 172 +- .../drivers/include/cy_crypto_core_mem.h | 30 +- .../drivers/include/cy_crypto_core_prng.h | 35 +- .../drivers/include/cy_crypto_core_sha.h | 110 +- .../drivers/include/cy_crypto_core_sha_v1.h | 18 +- .../drivers/include/cy_crypto_core_sha_v2.h | 2 +- .../drivers/include/cy_crypto_core_trng.h | 25 +- .../include/cy_crypto_core_trng_config_v1.h | 14 +- .../include/cy_crypto_core_trng_config_v2.h | 14 +- .../drivers/include/cy_crypto_core_trng_v1.h | 2 +- .../drivers/include/cy_crypto_core_vu.h | 62 +- .../drivers/include/cy_crypto_server.h | 8 +- .../psoc6pdl/drivers/include/cy_device.h | 2 + .../psoc6pdl/drivers/include/cy_pdl.h | 3 + .../psoc6pdl/drivers/include/cy_sysclk.h | 1 + .../psoc6pdl/drivers/source/cy_ble_clk.c | 10 +- .../psoc6pdl/drivers/source/cy_crypto.c | 4 +- .../drivers/source/cy_crypto_core_aes_v1.c | 100 +- .../drivers/source/cy_crypto_core_aes_v2.c | 109 +- .../drivers/source/cy_crypto_core_cmac_v1.c | 35 +- .../drivers/source/cy_crypto_core_cmac_v2.c | 29 +- .../drivers/source/cy_crypto_core_crc_v1.c | 102 +- .../drivers/source/cy_crypto_core_crc_v2.c | 103 +- .../drivers/source/cy_crypto_core_des_v1.c | 41 +- .../drivers/source/cy_crypto_core_des_v2.c | 46 +- .../source/cy_crypto_core_ecc_domain_params.c | 839 +++++---- .../drivers/source/cy_crypto_core_ecc_ecdsa.c | 189 +- .../source/cy_crypto_core_ecc_key_gen.c | 512 +++--- .../source/cy_crypto_core_ecc_nist_p.c | 1599 ++++++++--------- .../drivers/source/cy_crypto_core_hmac_v1.c | 126 +- .../drivers/source/cy_crypto_core_hmac_v2.c | 120 +- .../drivers/source/cy_crypto_core_hw.c | 25 +- .../drivers/source/cy_crypto_core_hw_v1.c | 18 +- .../drivers/source/cy_crypto_core_mem_v1.c | 8 +- .../drivers/source/cy_crypto_core_mem_v2.c | 8 +- .../drivers/source/cy_crypto_core_prng_v1.c | 8 +- .../drivers/source/cy_crypto_core_prng_v2.c | 8 +- .../drivers/source/cy_crypto_core_rsa.c | 248 +-- .../drivers/source/cy_crypto_core_sha_v1.c | 149 +- .../drivers/source/cy_crypto_core_sha_v2.c | 123 +- .../drivers/source/cy_crypto_core_trng_v1.c | 12 +- .../drivers/source/cy_crypto_core_trng_v2.c | 12 +- .../drivers/source/cy_crypto_core_vu.c | 52 +- .../drivers/source/cy_crypto_server.c | 14 +- 59 files changed, 3237 insertions(+), 3110 deletions(-) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_ble_clk.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_ble_clk.h index 8a2beb8903..47bd9b8793 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_ble_clk.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_ble_clk.h @@ -1,6 +1,6 @@ /***************************************************************************//** * \file cy_ble_clk.h -* \version 3.0 +* \version 3.10 * * The header file of the BLE ECO clock driver. * @@ -70,7 +70,14 @@ * * * -* +* +* +* +* +* +* * * * diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto.h index 0ee2810f3f..af3a29cd77 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto.h @@ -26,18 +26,51 @@ * \addtogroup group_crypto * \{ * The Crypto driver provides a public API to perform cryptographic and hash -* operations, as well as generate both true and pseudo random numbers -* (TRNG, PRNG). +* operations, as well as generate both true and pseudo random numbers. * * It uses a hardware IP block to accelerate operations. * * The functions and other declarations used in this driver are in cy_crypto.h, -* cy_crypto_core.h, and cy_crypto_server.h. You can also include cy_pdl.h +* cy_crypto_core.h, and cy_crypto_server.h. You can also include cy_pdl.h * (ModusToolbox only) to get access to all functions and declarations in the PDL. * -* The driver -* supports these standards: DES, TDES, AES (128, 192, 256 bits), CMAC-AES, SHA, -* HMAC, PRNG, TRNG, CRC, and RSA. +* The driver implements two usage models: +* * \ref group_crypto_cli_srv +* * \ref group_crypto_lld_api +* +* Mixing these usage models will result in undefined behaviour. +* +* The Crypto driver supports these standards: DES, TDES, AES (128, 192, 256 bits), CMAC-AES, SHA, +* HMAC, PRNG, TRNG, CRC, RSA, ECP, and ECDSA. +* \note ECP and ECDSA are only implemented for the \ref group_crypto_lld_api model. +* +* \section group_crypto_configuration_considerations Configuration Considerations +* +* Firmware sets up a cryptographic operation by passing in the required data as +* parameters in the function calls. +* +* All Crypto functions require a context. A context is a data +* structure that the driver uses for its operations. Firmware declares a +* context (allocates memory) but does not write or read the values in that +* context. In effect, the context is a scratch pad you provide to the driver. +* The driver uses the context to store and manipulate data during cryptographic +* operations. +* +* Several methods require an additional context unique to the particular +* cryptographic technique. +* The Crypto driver header files declare all the required structures for both +* configuration and context. +* +* Some encryption techniques require additional initialization specific to the +* technique. If there is an Init function, you must call it before using any +* other function for that technique, and re-initialize after you use a different +* encryption technique. +* +* For example, use \ref Cy_Crypto_Aes_Init to configure an AES encryption +* operation with the encryption key, and key length. +* Provide pointers to two context structures. You can then call the AES Run functions. +* If you use DES after that, you must re-initialize the AES encryption before using +* it again. * * \section group_crypto_definitions Definitions * @@ -63,16 +96,16 @@ * This function takes a fixed-size key and a block of plaintext data from * the message and encrypts it to generate ciphertext. Block ciphers are * reversible. The function performed on a block of encrypted data will -* decrypt it. +* decrypt that data. * * * * -* * * @@ -80,8 +113,8 @@ * * * * @@ -89,7 +122,7 @@ * * @@ -99,17 +132,17 @@ * * * * * * -* * -* * For more information see [Recommendation for Block Cipher Modes of Operation] * (https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-38b.pdf). @@ -144,7 +177,7 @@ * * * -* * -* * * @@ -176,15 +209,15 @@ * * * -* * *
VersionChangesReason of Change
3.0.03.10Updated the Cy_BLE_EcoConfigure() use case, when the voltageReg parameter is CY_BLE_ECO_VOLTAGE_REG_BLESSLDO +* and the Buck core regulator is enabled.Defect fixing: Before, when the Cy_BLE_EcoConfigure() function included the BLE LDO regulator option, the function returned CY_BLE_ECO_HARDWARE_ERROR if +* the Buck core regulator had been enabled.
3.0The initial version. \n The functionality of the BLE ECO clock is migrated from the BLE Middleware to the separated driver (ble_clk).Independent usage of BLE ECO clock without BLE Middleware.
Block Cipher ModeA mode of encrypting a message using block ciphers for messages of +* A mode of encrypting a message using block ciphers for messages of an * arbitrary length. The message is padded so that its length is an integer * multiple of the block size. ECB (Electronic Code Book), CBC (Cipher Block * Chaining), and CFB (Cipher Feedback) are all modes of using block ciphers -* to create an encrypted message of arbitrary length. +* to create an encrypted message of an arbitrary length. *
Data Encryption Standard (DES)The [DES standard] * (https://csrc.nist.gov/csrc/media/publications/fips/46/3/archive/1999-10-25/documents/fips46-3.pdf) -* specifies a symmetric-key algorithm for the encryption of electronic data. -* It uses a 56-bit key and a 64-bit message block size. +* specifies a symmetric-key algorithm for encryption of electronic data. +* It uses a 56-bit key. The block size is 64-bits. *
Triple DES (3DES or TDES)The [TDES standard] * (https://csrc.nist.gov/csrc/media/publications/fips/46/3/archive/1999-10-25/documents/fips46-3.pdf) -* specifies a symmetric-key block cipher, which applies the Data Encryption +* specifies a symmetric-key block cipher that applies the Data Encryption * Standard (DES) cipher algorithm three times to each data block. * It uses three 56-bit keys. The block size is 64-bits. * Advanced Encryption Standard (AES)The [AES standard] (https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf) * specifies the Rijndael algorithm, a symmetric block -* cipher that can process data blocks of 128 bits, using cipher keys with -* lengths of 128, 192, and 256 bits. Rijndael was designed to handle -* additional block sizes and key lengths, however they are not adopted in +* cipher that can process 128-bit data blocks, using cipher keys with +* 128-, 192-, and 256-bit lengths. Rijndael was designed to handle +* additional block sizes and key lengths. However, they are not adopted in * this standard. AES is also used for message authentication. *
Secure Hash Algorithm (SHA)Is a cryptographic hash function. -* This function takes a message of the arbitrary length and reduces it to a +* A cryptographic hash function. +* This function takes a message of an arbitrary length and reduces it to a * fixed-length residue or message digest after performing a series of * mathematically defined operations that practically guarantee that any * change in the message will change the hash value. It is used for message @@ -136,7 +169,7 @@ * *
Cipher-based Message Authentication Code (CMAC)This is a block cipher-based message authentication code algorithm. +* A block cipher-based message authentication code algorithm. * It computes the MAC value using the AES block cipher algorithm.
Hash Message Authentication Code (HMAC)Is a specific type of message authentication code (MAC) involving a +* A specific type of message authentication code (MAC) that involves a * cryptographic hash function and a secret cryptographic key. * It computes the MAC value using a Hash algorithm. * For more information see [The Keyed-Hash Message Authentication Code standard] @@ -154,7 +187,7 @@ * *
Pseudo Random Number Generator (PRNG)Is a Linear Feedback Shift Registers-based algorithm for generating a +* A Linear Feedback Shift Registers-based algorithm for generating a * sequence of numbers starting from a non-zero seed.
Asymmetric Key CryptographyAlso referred to as Public Key encryption. Someone who wishes to -* receive a message, publishes a very large public key (up to 4096 bits -* currently), which is one of two prime factors of a very large number. The -* other prime factor is the private key of the recipient and a secret. -* Someone wishing to send a message to the publisher of the public key -* encrypts the message with the public key. This message can now be -* decrypted only with the private key (the other prime factor held secret by +* Also referred to as Public Key encryption. To receive a message, +* you publish a very large public key (up to 4096 bits currently). +* That key is one of the two prime factors of a very large number. The +* other prime factor is the recipient's private (secret) key. +* To send a message to the publisher of the public key, you +* encrypt the message with the public key. This message can now be +* decrypted only with the private key (the other prime factor held in secret by * the recipient). The message is now sent over any channel to the recipient -* who can decrypt it with the private, secret, key. The same process is used +* who can decrypt it with the private (secret) key. The same process is used * to send messages to the sender of the original message. The asymmetric * cryptography relies on the mathematical impracticality (usually related to * the processing power available at any given time) of factoring the keys. @@ -192,7 +225,7 @@ * The public key is described by the pair (n, e) where n is a product of two * randomly chosen primes p and q. The exponent e is a random integer * 1 < e < Q where Q = (p-1) (q-1). The private key d is uniquely defined -* by the integer 1 < d < Q such that ed congruent to 1 (mod Q ). +* by the integer 1 < d < Q so that ed congruent with 1 (mod Q ). *
@@ -202,10 +235,51 @@ * RSASSA-PKCS1-v1_5 described here, page 31: * http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf * -* See the Cryptographic Function Block chapter of the Technical Reference Manual. +* See the "Cryptographic Function Block" chapter of the Technical Reference Manual. * * \section group_crypto_MISRA MISRA-C Compliance -* This driver does not contains any driver-specific MISRA violations. +* The Crypto driver has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
8.8AAn external object or function shall be declared in one and only +* one file.The pointer to the operation context memory can not be public +* accessible (can not be defined in the header file) but it should be +* extarnally accessed, because it is used by other Cypress software +* resources.
11.4AA cast should not be performed between a pointer to object type and +* a different pointer to object type.The pointers to the context memory are void to allow handling of +* different data types for different operations. +* The cast operation is safe because the configuration is verified +* before operation is performed. +*
16.7AA pointer parameter in a function prototype should be declared as +* pointer to const if the pointer is not used to modify the addressed +* object.The objects pointed to by the base addresses of the CRYPTO are not +* always modified. While a const qualifier can be used in select +* scenarios, it brings little benefit in adding this to the affected +* functions.
* * \section group_crypto_changelog Changelog * @@ -214,15 +288,16 @@ * * * * * -* * * * * -* * * * * -* +* * * * @@ -267,7 +342,7 @@ * * * -* * @@ -278,7 +353,7 @@ * * * -* +* * * * @@ -289,15 +364,15 @@ * \ref Cy_Crypto_Trng_Generate, \ref Cy_Crypto_Des_Run, * \ref Cy_Crypto_Tdes_Run, \ref Cy_Crypto_Rsa_Proc * -* +* * * * -* +* * * * @@ -306,29 +381,24 @@ * *
2.20 *
    -*
  • Moved from pre-compiled library to Open Source under +*
  • Moved from a pre-compiled library to Open Source under * Apache 2.0 license.
  • -*
  • Added ECP and ECDSA support for NIST P curves: +*
  • Core (server) This API is now available.
  • +*
  • Added ECP and ECDSA support for the NIST P curves: * SECP192R1, SECP224R1, SECP256R1, SECP384R1, SECP521R1.
  • *
  • ECP and ECDSA only supported with direct calls to Crypto APIs, -* no client interface functions present.
  • -*
  • Added chunk mode for CRC.
  • -*
  • Added chunk mode for SHA, chunk size is limited to -* SHA block size.
  • +* no client interface functions are present. +*
  • Added Chunk mode for CRC.
  • +*
  • Added Chunk mode for SHA, the chunk size is limited to +* the SHA block size.
  • *
*
ECC support added.
@@ -232,22 +307,22 @@ *
2.11bSame as production 2.10; only newly added Elliptic Curve point +* The same as production 2.10; only the newly-added Elliptic Curve point * multiplication functionality (NIST P256) is pre-production. * Open source under Apache version 2.0 license.
2.11Based on pre-production 2.10, except newly added Elliptic Curve point +* Based on pre-production 2.10, except the newly-added Elliptic Curve point * multiplication functionality (NIST P256). -* Does not incorporate production level documentation. +* Does not incorporate the production level documentation. * Open source under Apache version 2.0 license.ECC support.
2.10bSame as production 2.10. Open source under Apache version 2.0 license.The same as production 2.10. Open source under Apache version 2.0 license.
Added register access layer. Use register access macros instead +* Added the register access layer. Use register access macros instead * of direct register access using dereferenced pointers.Makes register access device-independent, so that the PDL does * not need to be recompiled for each supported part number.
2.0bSame as production 2.0. Open source under Apache version 2.0 license.The same as production 2.0. Open source under Apache version 2.0 license.
Documentation update and clarificationDocumentation update and clarification.
-* Changed crypto IP power control
-* Enhanced Vector Unit functionality for RSA crypto algorithm
-* Added support of the single-core devices +* Changed crypto IP power control.
+* Enhanced Vector Unit functionality for RSA crypto algorithm.
+* Added support of the single-core devices. *
New device supportNew device support.
1.0
* -* \defgroup group_crypto_cli_srv Client-Server API +* \defgroup group_crypto_cli_srv Client-Server Model * \{ -* \defgroup group_crypto_client Client +* \defgroup group_crypto_cli_srv_macros Macros +* \defgroup group_crypto_cli_srv_functions Functions * \{ -* Client part of the Crypto. -* \defgroup group_crypto_macros Macros -* \defgroup group_crypto_cli_functions Functions -* \defgroup group_crypto_cli_data_structures Data Structures -* \defgroup group_crypto_enums Enumerated Types +* \defgroup group_crypto_cli_functions Client Functions +* \defgroup group_crypto_srv_functions Server Functions * \} -* \defgroup group_crypto_server Server +* \defgroup group_crypto_cli_srv_data_structures Data Structures * \{ -* Server part of the Crypto. -* \defgroup group_crypto_srv_functions Functions -* \defgroup group_crypto_srv_data_structures Data Structures -* \} -* \defgroup group_crypto_config_structure Configuration Structure -* \{ -* Crypto initialization configuration. -* \note Should be the same for Crypto Server and Crypto Client initializations. +* \defgroup group_crypto_config_structure Common Data Structures +* \defgroup group_crypto_cli_data_structures Client Data Structures +* \defgroup group_crypto_srv_data_structures Server Data Structures * \} * \} -* \defgroup group_crypto_lld_api Low-Level API +* \defgroup group_crypto_lld_api Direct Crypto Core Access +* \defgroup group_crypto_data_structures Common Data Structures +* \defgroup group_crypto_enums Common Enumerated Types */ /** @@ -339,23 +409,22 @@ * * The functions and other declarations used in this part of the driver are in * cy_crypto.h and cy_crypto_server.h. You can also include cy_pdl.h -* (ModusToolbox only) to get access to all functions and declarations in the +* (ModusToolbox only) to get access to all functions and declarations in the * PDL. * -* Firmware initializes and starts the Crypto server. The server can run on any +* The firmware initializes and starts the Crypto server. The server can run on any * core and works with the Crypto hardware. The Crypto server is implemented as * a secure block. It performs all cryptographic operations for the client. * Access to the server is through the Inter Process Communication (IPC) driver. * Direct access is not allowed. * -* The Crypto client can run on any core too. Firmware initializes and starts -* the client. The firmware then provides the configuration data required for -* the desired cryptographic technique, and requests that the server run the +* The Crypto client can run on any core too. The firmware initializes and starts +* the client. The firmware then provides configuration data required for +* the desired cryptographic technique and a request that the server run the * cryptographic operation. * * This document contains the following topics: * - \ref group_crypto_architecture -* - \ref group_crypto_configuration_considerations * - \ref group_crypto_configuration_structure * - \ref group_crypto_server_init * - \ref group_crypto_client_init @@ -396,23 +465,6 @@ * Using IPC for communication provides a simple synchronization mechanism to * handle concurrent requests from different cores. * -* \section group_crypto_configuration_considerations Configuration Considerations -* -* Firmware sets up a cryptographic operation by passing in required data as -* parameters in function calls. -* -* All Crypto functions require a context. A context is a data -* structure that the driver uses for its operations. Firmware declares the -* context (allocates memory) but does not write or read the values in the -* context. In effect the context is a scratch pad you provide to the driver. -* The driver uses the context to store and manipulate data during cryptographic -* operations. -* -* Several methods require an additional context unique to the particular -* cryptographic technique. -* The Crypto driver header files declare all the required structures for both -* configuration and context. -* * \section group_crypto_configuration_structure Configuration Structure * * IPC communication for the Crypto driver is handled transparently. User should @@ -527,17 +579,6 @@ * * \snippet crypto/2.10/snippet/main.c snippet_myCryptoInit * -* Some encryption techniques require additional initialization specific to the -* technique. If there is an Init function, you must call it before using any -* other function for that technique, and reinitialize after you use a different -* encryption technique. -* -* For example, use \ref Cy_Crypto_Aes_Init to configure an AES encryption -* operation with the encryption key, and key length. -* Provide pointers to two context structures. You can then call AES Run functions. -* If later on you use DES, you must re-initialize AES encryption before using -* it again. -* * \section group_crypto_common_use_cases Common Use Cases * * \subsection group_crypto_Use_CRC CRC Calculation @@ -667,9 +708,9 @@ * (2^moduloLength mod modulo). These fields are optional, and can be set to NULL. * * Calculate these coefficients with \ref Cy_Crypto_Rsa_CalcCoefs. -* Pass in the address of the key structure with the modulus and exponent values -* for the key. The function returns the coefficients for the key in the key -* structure, replacing any previous values. +* Pass them in the address of the key structure with the modulus and exponent +* values for the key. The function returns the coefficients for the key in the +* key structure, replacing any previous values. * * The RSA functionality also implements functions to decrypt a signature using * a public key. This signature must follow the RSASSA-PKCS-v1_5 standard. @@ -786,7 +827,7 @@ cy_en_crypto_status_t Cy_Crypto_GetLibraryInfo(cy_en_crypto_lib_info_t *cryptoIn * that stores the Crypto driver common context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoInit @@ -801,7 +842,7 @@ cy_en_crypto_status_t Cy_Crypto_Init(cy_stc_crypto_config_t const *config, cy_st * This function de-initializes the Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_DeInit(void); @@ -813,7 +854,7 @@ cy_en_crypto_status_t Cy_Crypto_DeInit(void); * This function enables (turns on) the Crypto hardware. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Enable(void); @@ -825,7 +866,7 @@ cy_en_crypto_status_t Cy_Crypto_Enable(void); * This function disables (turns off) the Crypto hardware. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Disable(void); @@ -843,7 +884,7 @@ cy_en_crypto_status_t Cy_Crypto_Disable(void); * False - is not blocking. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Sync(bool isBlocking); @@ -859,7 +900,7 @@ cy_en_crypto_status_t Cy_Crypto_Sync(bool isBlocking); * \ref cy_stc_crypto_hw_error_t. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_GetErrorStatus(cy_stc_crypto_hw_error_t *hwErrorCause); @@ -890,7 +931,7 @@ cy_en_crypto_status_t Cy_Crypto_GetErrorStatus(cy_stc_crypto_hw_error_t *hwError * the Crypto function context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoPrngUse @@ -920,7 +961,7 @@ cy_en_crypto_status_t Cy_Crypto_Prng_Init(uint32_t lfsr32InitState, * the Crypto function context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoPrngUse @@ -953,7 +994,7 @@ cy_en_crypto_status_t Cy_Crypto_Prng_Generate(uint32_t max, * internal variables the Crypto driver requires. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoAesEcbUse @@ -986,7 +1027,7 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Init(uint32_t *key, * that stores all AES internal variables. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoAesEcbUse @@ -1025,7 +1066,7 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Ecb_Run(cy_en_crypto_dir_mode_t dirMode, * internal variables the Crypto driver requires. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Aes_Cbc_Run(cy_en_crypto_dir_mode_t dirMode, @@ -1053,17 +1094,17 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Cbc_Run(cy_en_crypto_dir_mode_t dirMode, * The pointer to the initial vector. __Must be 4-byte aligned.__ * * \param dst -* The pointer to a destination cipher text. __Must be 4-byte aligned.__ +* The pointer to the destination cipher text. __Must be 4-byte aligned.__ * * \param src -* The pointer to a source plain text. __Must be 4-byte aligned.__ +* The pointer to the source plain text. __Must be 4-byte aligned.__ * * \param cfContext * The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all * internal variables the Crypto driver requires. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Aes_Cfb_Run(cy_en_crypto_dir_mode_t dirMode, @@ -1102,17 +1143,17 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Cfb_Run(cy_en_crypto_dir_mode_t dirMode, * __Must be 4-byte aligned.__ * * \param dst -* The pointer to a destination cipher text. __Must be 4-byte aligned.__ +* The pointer to the destination cipher text. __Must be 4-byte aligned.__ * * \param src -* The pointer to a source plain text. __Must be 4-byte aligned.__ +* The pointer to the source plain text. __Must be 4-byte aligned.__ * * \param cfContext * The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all * internal variables the Crypto driver requires. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Aes_Ctr_Run(cy_en_crypto_dir_mode_t dirMode, @@ -1134,7 +1175,7 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Ctr_Run(cy_en_crypto_dir_mode_t dirMode, * the context structure when making this function call. * * \param src -* The pointer to a source plain text. __Must be 4-byte aligned.__ +* The pointer to the source plain text. __Must be 4-byte aligned.__ * * \param srcSize * The size of a source plain text. @@ -1153,7 +1194,7 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Ctr_Run(cy_en_crypto_dir_mode_t dirMode, * internal variables the Crypto driver requires. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoCmacUse @@ -1189,7 +1230,7 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Cmac_Run(uint32_t *src, * The size of a message. * * \param digest -* The pointer to the hash digest. Hash size depends to selected SHA mode +* The pointer to the hash digest. The hash size depends on the selected SHA mode * (from 20 to 64 bytes, see \ref CY_CRYPTO_SHA_MAX_DIGEST_SIZE). * __Must be 4-byte aligned.__ * @@ -1198,7 +1239,7 @@ cy_en_crypto_status_t Cy_Crypto_Aes_Cmac_Run(uint32_t *src, * internal variables for Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoSha256Use @@ -1246,7 +1287,7 @@ cy_en_crypto_status_t Cy_Crypto_Sha_Run(uint32_t *message, * internal variables for the Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoHmacUse @@ -1288,7 +1329,7 @@ cy_en_crypto_status_t Cy_Crypto_Hmac_Run(uint32_t *hmac, * internal variables for the Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Str_MemCpy(void *dst, @@ -1320,7 +1361,7 @@ cy_en_crypto_status_t Cy_Crypto_Str_MemCpy(void *dst, * internal variables for the Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Str_MemSet(void *dst, @@ -1357,7 +1398,7 @@ cy_en_crypto_status_t Cy_Crypto_Str_MemSet(void *dst, * internal variables for the Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Str_MemCmp(void const *src0, @@ -1395,7 +1436,7 @@ cy_en_crypto_status_t Cy_Crypto_Str_MemCmp(void const *src0, * internal variables for the Crypto driver. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Str_MemXor(void const *src0, @@ -1508,7 +1549,7 @@ cy_en_crypto_status_t Cy_Crypto_Str_MemXor(void const *src0, * the Crypto driver context. * * \return -* A Crypto status \ref cy_en_crypto_status_t +* \ref cy_en_crypto_status_t * * \note * The polynomial, initial seed and remainder XOR values are always @@ -1551,7 +1592,7 @@ cy_en_crypto_status_t Cy_Crypto_Crc_Init(uint32_t polynomial, * the Crypto driver context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \note * The polynomial, initial seed and remainder XOR values are always @@ -1594,7 +1635,7 @@ cy_en_crypto_status_t Cy_Crypto_Crc_Run(void *data, * the Crypto driver context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoTrngUse @@ -1636,7 +1677,7 @@ cy_en_crypto_status_t Cy_Crypto_Trng_Generate(uint32_t GAROPol, * the Crypto driver context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Des_Run(cy_en_crypto_dir_mode_t dirMode, @@ -1673,7 +1714,7 @@ cy_en_crypto_status_t Cy_Crypto_Des_Run(cy_en_crypto_dir_mode_t dirMode, * the Crypto driver context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoTdesUse @@ -1735,7 +1776,7 @@ cy_en_crypto_status_t Cy_Crypto_Tdes_Run(cy_en_crypto_dir_mode_t dirMode, * the RSA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Rsa_Proc(cy_stc_crypto_rsa_pub_key_t const *pubKey, @@ -1774,7 +1815,7 @@ cy_en_crypto_status_t Cy_Crypto_Rsa_Proc(cy_stc_crypto_rsa_pub_key_t const *pubK * the RSA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Rsa_CalcCoefs(cy_stc_crypto_rsa_pub_key_t const *pubKey, @@ -1818,7 +1859,7 @@ cy_en_crypto_status_t Cy_Crypto_Rsa_CalcCoefs(cy_stc_crypto_rsa_pub_key_t const * the RSA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Rsa_Verify(cy_en_crypto_rsa_ver_result_t *verResult, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_common.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_common.h index 47301afbca..1fe68ef5e2 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_common.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_common.h @@ -60,7 +60,7 @@ #define CY_CRYPTO_DRV_VERSION_MINOR 20 /** -* \addtogroup group_crypto_macros +* \addtogroup group_crypto_cli_srv_macros * \{ */ @@ -70,7 +70,7 @@ /** Defines Crypto_Sync non-blocking execution type parameter */ #define CY_CRYPTO_SYNC_NON_BLOCKING (false) -/** Defines the Crypto DES block size (in bytes) */ +/** Defines the Crypto DES block size (in bytes). */ #define CY_CRYPTO_DES_BLOCK_SIZE (8u) /** Defines the Crypto DES key size (in bytes) */ @@ -114,7 +114,7 @@ #define CY_CRYPTO_SHA512_224_DIGEST_SIZE (28u) /** Hash size for the SHA512_256 mode (in bytes) */ #define CY_CRYPTO_SHA512_256_DIGEST_SIZE (32u) -/** Maximal hash size for the SHA modes (in bytes) */ +/** The maximal Hash size for the SHA modes (in bytes). */ #define CY_CRYPTO_SHA_MAX_DIGEST_SIZE (CY_CRYPTO_SHA512_DIGEST_SIZE) /** Block size for the SHA1 mode (in bytes) */ @@ -141,6 +141,9 @@ #define CY_CRYPTO_SHA512_ROUND_MEM_SIZE (640uL) #define CY_CRYPTO_SHA_MAX_ROUND_MEM_SIZE (CY_CRYPTO_SHA512_ROUND_MEM_SIZE) +/* The width of the Crypto hardware registers values in bits. */ +#define CY_CRYPTO_HW_REGS_WIDTH (32UL) + /** \endcond */ #endif /* #if (CPUSS_CRYPTO_SHA == 1) */ @@ -161,11 +164,13 @@ /** Crypto Driver PDL ID */ #define CY_CRYPTO_ID CY_PDL_DRV_ID(0x0Cu) -/** \} group_crypto_macros */ +/** \} group_crypto_cli_srv_macros */ /** * \addtogroup group_crypto_config_structure * \{ + The Crypto initialization configuration. +* \note Should be the same for the Crypto Server and Crypto Client initialization. */ /** The Crypto user callback function type. @@ -231,32 +236,37 @@ typedef struct /** \} group_crypto_config_structure */ /** -* \addtogroup group_crypto_cli_data_structures +* \addtogroup group_crypto_data_structures * \{ */ #if (CPUSS_CRYPTO_VU == 1) + /** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the RSA public key and - * additional coefficients to accelerate RSA calculation. - * - * RSA key contained from two fields: - * - n - modulus part of the key - * - e - exponent part of the key. - * - * Other fields are accelerating coefficients and can be calculated by - * \ref Cy_Crypto_Rsa_CalcCoefs. - * - * \note The modulus and exponent values in the - * \ref cy_stc_crypto_rsa_pub_key_t must also be in little-endian order.
- * Use \ref Cy_Crypto_Rsa_InvertEndianness function to convert to or from - * little-endian order. - * +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +* +* The driver uses this structure to store and manipulate the RSA public key and +* additional coefficients to accelerate RSA calculation. +* +* RSA key contained from two fields: +* - n - modulus part of the key +* - e - exponent part of the key. +* +* Other fields are accelerating coefficients and can be calculated by +* \ref Cy_Crypto_Rsa_CalcCoefs. +* +* \note The modulus and exponent values in the +* \ref cy_stc_crypto_rsa_pub_key_t must also be in little-endian order.
+* Use \ref Cy_Crypto_Rsa_InvertEndianness function to convert to or from +* little-endian order. */ typedef struct { + /** \cond INTERNAL */ /** The pointer to the modulus part of public key. */ uint8_t *moduloPtr; /** The modulus length, in bits, maximum supported size is 2048Bit */ @@ -278,10 +288,18 @@ typedef struct /** The pointer to the (2^moduloLength mod modulo). Memory for it should be allocated by user with size moduloLength */ uint8_t *rBarPtr; +/** \endcond */ } cy_stc_crypto_rsa_pub_key_t; #endif /* #if (CPUSS_CRYPTO_VU == 1) */ +/** \} group_crypto_data_structures */ + +/** +* \addtogroup group_crypto_cli_data_structures +* \{ +*/ + /** Structure for storing a description of a Crypto hardware error */ typedef struct { @@ -484,17 +502,25 @@ typedef enum /** \endcond */ /** -* \addtogroup group_crypto_cli_data_structures +* \addtogroup group_crypto_data_structures * \{ */ #if (CPUSS_CRYPTO_AES == 1) -/** Structure for storing the AES state */ + +/** The structure for storing the AES state. +* All fields for this structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** Pointer to AES key */ uint8_t *key; - /** Pointer to AES inversed key */ + /** Pointer to AES inverse key */ uint8_t *invKey; /** AES key length */ cy_en_crypto_aes_key_length_t keyLength; @@ -502,10 +528,39 @@ typedef struct uint32_t *buffers; /** AES processed block index (for CMAC, SHA operations) */ uint32_t blockIdx; + /** \endcond */ } cy_stc_crypto_aes_state_t; #endif /* #if (CPUSS_CRYPTO_AES == 1) */ -/** \} group_crypto_cli_data_structures */ +#if (CPUSS_CRYPTO_SHA == 1) + +/** The structure for storing the SHA state. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ +typedef struct +{ + /** \cond INTERNAL */ + uint32_t mode; + uint8_t *block; + uint32_t blockSize; + uint8_t *hash; + uint32_t hashSize; + uint8_t *roundMem; + uint32_t roundMemSize; + uint32_t messageSize; + uint32_t digestSize; + uint32_t blockIdx; + uint8_t const *initialHash; + /** \endcond */ +} cy_stc_crypto_sha_state_t; + +#endif /* (CPUSS_CRYPTO_SHA == 1) */ + +/** \} group_crypto_data_structures */ /************************************************************* * Structures used for communication between Client and Server @@ -516,14 +571,16 @@ typedef struct * \{ */ -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the server - * context. - */ +/** The structure for storing the crypto server context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** IPC communication channel number */ uint32_t ipcChannel; /** IPC acquire interrupt channel number */ @@ -540,6 +597,7 @@ typedef struct bool isHwErrorOccured; /** Hardware processing errors */ cy_stc_crypto_hw_error_t hwErrorStatus; + /** \endcond */ } cy_stc_crypto_server_context_t; /** \} group_crypto_srv_data_structures */ @@ -549,14 +607,16 @@ typedef struct * \{ */ -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the global - * context. - */ +/** The structure for storing the crypto client context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** Operation instruction code */ cy_en_crypto_comm_instr_t instr; /** Response from executed crypto function */ @@ -575,18 +635,21 @@ typedef struct cy_stc_sysint_t releaseNotifierConfig; /** Pointer to the crypto function specific context data */ void *xdata; + /** \endcond */ } cy_stc_crypto_context_t; #if (CPUSS_CRYPTO_DES == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the DES operational - * context. - */ +/** The structure for storing the DES context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** Operation direction (Encrypt / Decrypt) */ cy_en_crypto_dir_mode_t dirMode; /** Pointer to key data */ @@ -595,18 +658,21 @@ typedef struct uint32_t *dst; /** Pointer to data source block */ uint32_t *src; + /** \endcond */ } cy_stc_crypto_context_des_t; #endif /* #if (CPUSS_CRYPTO_DES == 1) */ #if (CPUSS_CRYPTO_AES == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the AES operational - * context. - */ +/** The structure for storing the AES context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** AES state data */ cy_stc_crypto_aes_state_t aesState; /** Operation direction (Encrypt / Decrypt) */ @@ -627,38 +693,22 @@ typedef struct uint32_t *dst; /** Pointer to data source block */ uint32_t *src; + /** \endcond */ } cy_stc_crypto_context_aes_t; #endif /* #if (CPUSS_CRYPTO_AES == 1) */ #if (CPUSS_CRYPTO_SHA == 1) -/** \cond INTERNAL */ -/* The structure for storing the SHA context */ -typedef struct -{ - uint32_t mode; - uint8_t *block; - uint32_t blockSize; - uint8_t *hash; - uint32_t hashSize; - uint8_t *roundMem; - uint32_t roundMemSize; - uint32_t messageSize; - uint32_t digestSize; - uint32_t blockIdx; - uint8_t const *initialHash; -} cy_stc_crypto_sha_state_t; - -/** \endcond */ - -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the SHA operational - * context. - */ +/** The structure for storing the SHA context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** Pointer to data source block */ uint32_t *message; /** Operation data size */ @@ -671,35 +721,41 @@ typedef struct uint32_t *key; /** Key data length (for HMAC only) */ uint32_t keyLength; + /** \endcond */ } cy_stc_crypto_context_sha_t; #endif /* #if (CPUSS_CRYPTO_SHA == 1) */ #if (CPUSS_CRYPTO_PR == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the PRNG operational - * context. - */ +/** The structure for storing the PRNG context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ uint32_t lfsr32InitState; /**< lfsr32 initialization data */ uint32_t lfsr31InitState; /**< lfsr31 initialization data */ uint32_t lfsr29InitState; /**< lfsr29 initialization data */ uint32_t max; /**< Maximum of the generated value */ uint32_t *prngNum; /**< Pointer to generated value */ + /** \endcond */ } cy_stc_crypto_context_prng_t; #endif /* #if (CPUSS_CRYPTO_PR == 1) */ #if (CPUSS_CRYPTO_TR == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the TRNG operational - * context. - */ +/** The structure for storing the TRNG context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** The polynomial for the programmable Galois ring oscillator (TR_GARO_CTL). The polynomial is represented WITHOUT the high order bit (this bit is @@ -721,35 +777,41 @@ typedef struct uint32_t max; /** Pointer to generated value */ uint32_t *trngNum; + /** \endcond */ } cy_stc_crypto_context_trng_t; #endif /* #if (CPUSS_CRYPTO_TR == 1) */ #if (CPUSS_CRYPTO_STR == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the STR operational - * context. - */ +/** The structure for storing the string context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ void const *src0; /**< Pointer to 1-st string source */ void const *src1; /**< Pointer to 2-nd string source */ void *dst; /**< Pointer to string destination */ uint32_t dataSize; /**< Operation data size */ uint32_t data; /**< Operation data value (for memory setting) */ + /** \endcond */ } cy_stc_crypto_context_str_t; #endif /* #if (CPUSS_CRYPTO_STR == 1) */ #if (CPUSS_CRYPTO_CRC == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the CRC operational - * context. - */ +/** The structure for storing the CRC context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ void* data; /**< Pointer to data source block */ uint32_t dataSize; /**< Operation data size */ uint32_t *crc; /**< Pointer to CRC destination variable */ @@ -759,20 +821,23 @@ typedef struct uint32_t dataXor; /**< Input data XOR flag */ uint32_t remReverse; /**< Output data reverse flag */ uint32_t remXor; /**< Output data XOR flag */ + /** \endcond */ } cy_stc_crypto_context_crc_t; #endif /* #if (CPUSS_CRYPTO_CRC == 1) */ #if (CPUSS_CRYPTO_VU == 1) #if (CPUSS_CRYPTO_SHA == 1) -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the RSA verifying - * context. - */ +/** The structure for storing the RSA verification context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in the function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** Pointer to verification result /ref cy_en_crypto_rsa_ver_result_t */ cy_en_crypto_rsa_ver_result_t *verResult; /** SHA digest type, used with SHA calculation of the message */ @@ -783,17 +848,20 @@ typedef struct uint32_t const *decryptedSignature; /** Length of the decrypted RSA signature */ uint32_t decryptedSignatureLength; + /** \endcond */ } cy_stc_crypto_context_rsa_ver_t; #endif /* #if (CPUSS_CRYPTO_SHA == 1) */ -/** - * Firmware allocates memory and provides a pointer to this structure in - * function calls. Firmware does not write or read values in this structure. - * The driver uses this structure to store and manipulate the RSA operational - * context. - */ +/** The structure for storing the RSA context. +* All fields for the context structure are internal. Firmware never reads or +* writes these values. Firmware allocates the structure and provides the +* address of the structure to the driver in function calls. Firmware must +* ensure that the defined instance of this structure remains in scope +* while the drive is in use. +*/ typedef struct { + /** \cond INTERNAL */ /** Pointer to key data */ cy_stc_crypto_rsa_pub_key_t const *key; /** Pointer to data source block */ @@ -802,6 +870,7 @@ typedef struct uint32_t messageSize; /** Pointer to data destination block */ uint32_t *result; + /** \endcond */ } cy_stc_crypto_context_rsa_t; #endif /* #if (CPUSS_CRYPTO_VU == 1) */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core.h index fe64336cfb..31c67a5bfb 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core.h @@ -36,10 +36,43 @@ * provides the configuration data required for the desired cryptographic * technique. * -* \defgroup group_crypto_llc_macros Macros -* \defgroup group_crypto_llc_functions Functions -* \defgroup group_crypto_llc_data_structures Data Structures -* \defgroup group_crypto_llc_enums Enumerated Types +* \defgroup group_crypto_lld_hw Control and Status +* \{ +* \defgroup group_crypto_lld_hw_functions Functions +* \} +* \defgroup group_crypto_lld_symmetric Symmetric Key Algorithms (AES, DES, TDES) +* \{ +* \defgroup group_crypto_lld_symmetric_functions Functions +* \} +* \defgroup group_crypto_lld_asymmetric Asymmetric Key Algorithms (RSA, ECP, ECDSA) +* \{ +* \defgroup group_crypto_lld_asymmetric_functions Functions +* \defgroup group_crypto_lld_asymmetric_enums Enumerated Types +* \} +* \defgroup group_crypto_lld_sha Hash Operations (SHA) +* \{ +* \defgroup group_crypto_lld_sha_functions Functions +* \} +* \defgroup group_crypto_lld_mac Message Authentication Code (CMAC, HMAC) +* \{ +* \defgroup group_crypto_lld_mac_functions Functions +* \} +* \defgroup group_crypto_lld_crc Cyclic Redundancy Code (CRC) +* \{ +* \defgroup group_crypto_lld_crc_functions Functions +* \} +* \defgroup group_crypto_lld_rng Random Number Generation (TRNG, PRNG) +* \{ +* \defgroup group_crypto_lld_rng_functions Functions +* \} +* \defgroup group_crypto_lld_vu Vector Unit (VU) +* \{ +* \defgroup group_crypto_lld_vu_functions Functions +* \} +* \defgroup group_crypto_lld_mem Memory Streaming Functions +* \{ +* \defgroup group_crypto_lld_mem_functions Functions +* \} * \} */ #if !defined(CY_CRYPTO_CORE_H) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_aes.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_aes.h index 7f93678932..0f6e960941 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_aes.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_aes.h @@ -72,15 +72,19 @@ typedef cy_en_crypto_status_t (*cy_crypto_aes_ctr_func_t)(CRYPTO_Type *base, uint8_t const *src, cy_stc_crypto_aes_state_t *aesState); +/** +* \addtogroup group_crypto_lld_symmetric_functions +* \{ +*/ /******************************************************************************* * Function Name: Cy_Crypto_Core_Aes_Init ****************************************************************************//** * -* Sets Aes mode and prepare inversed key. +* Initializes AES mode of operation and prepares an inverse key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param key * The pointer to the encryption/decryption key. @@ -89,10 +93,11 @@ typedef cy_en_crypto_status_t (*cy_crypto_aes_ctr_func_t)(CRYPTO_Type *base, * \ref cy_en_crypto_aes_key_length_t * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Init(CRYPTO_Type *base, @@ -100,44 +105,45 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Init(CRYPTO_Type *base, cy_en_crypto_aes_key_length_t keyLength, cy_stc_crypto_aes_state_t *aesState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Aes_Init(base, key, keyLength, aesState); + tmpResult = Cy_Crypto_Core_V1_Aes_Init(base, key, keyLength, aesState); } else { - myResult = Cy_Crypto_Core_V2_Aes_Init(base, key, keyLength, aesState); + tmpResult = Cy_Crypto_Core_V2_Aes_Init(base, key, keyLength, aesState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Aes_Ecb ****************************************************************************//** * -* Performs AES operation on one Block. +* Performs the AES operation on a single block. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT * (\ref cy_en_crypto_dir_mode_t). * * \param dst -* The pointer to a destination cipher block. +* The pointer to the destination cipher block. * * \param src -* The pointer to a source block. +* The pointer to the source block. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ecb(CRYPTO_Type *base, @@ -146,28 +152,29 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ecb(CRYPTO_Type *base, uint8_t const *src, cy_stc_crypto_aes_state_t *aesState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Aes_Ecb(base, dirMode, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V1_Aes_Ecb(base, dirMode, dst, src, aesState); } else { - myResult = Cy_Crypto_Core_V2_Aes_Ecb(base, dirMode, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V2_Aes_Ecb(base, dirMode, dst, src, aesState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Aes_Cbc ****************************************************************************//** * -* Performs AES operation on a plain text with Cipher Block Chaining (CBC). +* Performs the AES-CBC operation defined in the dirMode parameter on a plain text +* defined in the src parameter. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -180,16 +187,17 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ecb(CRYPTO_Type *base, * The pointer to the initial vector. * * \param dst -* The pointer to a destination cipher text. +* The pointer to the destination cipher text. * * \param src -* The pointer to a source plain text. +* The pointer to the source plain text. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cbc(CRYPTO_Type *base, @@ -200,28 +208,29 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cbc(CRYPTO_Type *base, uint8_t const *src, cy_stc_crypto_aes_state_t *aesState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Aes_Cbc(base, dirMode, srcSize, ivPtr, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V1_Aes_Cbc(base, dirMode, srcSize, ivPtr, dst, src, aesState); } else { - myResult = Cy_Crypto_Core_V2_Aes_Cbc(base, dirMode, srcSize, ivPtr, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V2_Aes_Cbc(base, dirMode, srcSize, ivPtr, dst, src, aesState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Aes_Cfb -******************************************************************************** +****************************************************************************//** * -* Performs AES operation on a plain text with the Cipher Feedback Block method (CFB). +* Performs the AES-CFB operation defined in the dirMode parameter on a plain text +* defined in the SRC parameter. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -234,16 +243,17 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cbc(CRYPTO_Type *base, * The pointer to the initial vector. * * \param dst -* The pointer to a destination cipher text. +* The pointer to the destination cipher text. * * \param src -* The pointer to a source plain text. +* The pointer to the source plain text. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cfb(CRYPTO_Type *base, @@ -254,31 +264,31 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cfb(CRYPTO_Type *base, uint8_t const *src, cy_stc_crypto_aes_state_t *aesState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Aes_Cfb(base, dirMode, srcSize, ivPtr, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V1_Aes_Cfb(base, dirMode, srcSize, ivPtr, dst, src, aesState); } else { - myResult = Cy_Crypto_Core_V2_Aes_Cfb(base, dirMode, srcSize, ivPtr, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V2_Aes_Cfb(base, dirMode, srcSize, ivPtr, dst, src, aesState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Aes_Ctr -******************************************************************************** +****************************************************************************//** * -* Performs AES operation on a plain text using the counter method (CTR). +* Performs the AES-CTR operation on a plain text defined in the src parameter. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcSize -* The size of a source plain text. +* The size of the source plain text. * * \param srcOffset * The size of an offset within the current block stream for resuming within the @@ -291,16 +301,17 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cfb(CRYPTO_Type *base, * The saved stream-block for resuming. Is over-written by the function. * * \param dst -* The pointer to a destination cipher text. +* The pointer to the destination cipher text. * * \param src -* The pointer to a source plain text. Must be 4-Byte aligned. +* The pointer to the source plain text. Must be 4-Byte aligned. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ctr(CRYPTO_Type *base, @@ -312,20 +323,22 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ctr(CRYPTO_Type *base, uint8_t const *src, cy_stc_crypto_aes_state_t *aesState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Aes_Ctr(base, srcSize, srcOffset, ivPtr, streamBlock, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V1_Aes_Ctr(base, srcSize, srcOffset, ivPtr, streamBlock, dst, src, aesState); } else { - myResult = Cy_Crypto_Core_V2_Aes_Ctr(base, srcSize, srcOffset, ivPtr, streamBlock, dst, src, aesState); + tmpResult = Cy_Crypto_Core_V2_Aes_Ctr(base, srcSize, srcOffset, ivPtr, streamBlock, dst, src, aesState); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_symmetric_functions */ + #endif /* #if (CPUSS_CRYPTO_AES == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_cmac.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_cmac.h index 710fe59921..c4e908c068 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_cmac.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_cmac.h @@ -47,21 +47,26 @@ typedef cy_en_crypto_status_t (*cy_crypto_cmac_func_t)(CRYPTO_Type *base, cy_stc_crypto_aes_state_t *aesState); /** \endcond */ +/** +* \addtogroup group_crypto_lld_mac_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Cmac ****************************************************************************//** * -* Performs CMAC(Cipher-based Message Authentication Code) operation -* on a message to produce message authentication code using AES. +* Calculates the AES Cipher-based Message Authentication Code (CMAC) on the input +* message with the provided key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param message -* The pointer to a source plain text. Must be 4-byte aligned. +* The pointer to the source plain text. Must be 4-byte aligned. * * \param messageSize -* The size of a source plain text. +* The size of the source plain text in bytes. * * \param key * The pointer to the encryption key. Must be 4-byte aligned. @@ -73,10 +78,11 @@ typedef cy_en_crypto_status_t (*cy_crypto_cmac_func_t)(CRYPTO_Type *base, * The pointer to the calculated CMAC. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Cmac(CRYPTO_Type *base, @@ -87,20 +93,22 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Cmac(CRYPTO_Type *base, uint8_t *cmac, cy_stc_crypto_aes_state_t *aesState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Cmac(base, message, messageSize, key, keyLength, cmac, aesState); + tmpResult = Cy_Crypto_Core_V1_Cmac(base, message, messageSize, key, keyLength, cmac, aesState); } else { - myResult = Cy_Crypto_Core_V2_Cmac(base, message, messageSize, key, keyLength, cmac, aesState); + tmpResult = Cy_Crypto_Core_V2_Cmac(base, message, messageSize, key, keyLength, cmac, aesState); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_mac_functions */ + #endif /* (CPUSS_CRYPTO_AES == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc.h index 921f474c90..6890e6654b 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc.h @@ -49,14 +49,19 @@ typedef cy_en_crypto_status_t (*cy_crypto_crc_func_t)(CRYPTO_Type *base, uint32_t dataSize, uint32_t lfsrInitState); +/** +* \addtogroup group_crypto_lld_crc_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc_Init ****************************************************************************//** * -* Initializes CRC calculation. +* Initializes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param polynomial * The polynomial (specified using 32 bits) used in the computing CRC. @@ -65,16 +70,16 @@ typedef cy_en_crypto_status_t (*cy_crypto_crc_func_t)(CRYPTO_Type *base, * The order in which data bytes are processed. 0 - MSB first; 1- LSB first. * * \param dataXor -* The byte mask for XORing data +* The byte mask for XORing data. * * \param remReverse * A remainder reverse: 0 means the remainder is not reversed. 1 means reversed. * * \param remXor -* Specifies a mask with which the LFSR32 register is XORed to produce a remainder. +* Specifies the mask with which the LFSR32 register is XORed to produce a remainder. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_Init(CRYPTO_Type *base, @@ -84,28 +89,28 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_Init(CRYPTO_Type *base, uint32_t remReverse, uint32_t remXor) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc_Init(base, polynomial, dataReverse, dataXor, remReverse, remXor); + tmpResult = Cy_Crypto_Core_V1_Crc_Init(base, polynomial, dataReverse, dataXor, remReverse, remXor); } else { - myResult = Cy_Crypto_Core_V2_Crc_Init(base, polynomial, dataReverse, dataXor, remReverse, remXor); + tmpResult = Cy_Crypto_Core_V2_Crc_Init(base, polynomial, dataReverse, dataXor, remReverse, remXor); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc ****************************************************************************//** * -* Performs CRC calculation on a message. +* Performs the CRC calculation on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param crc * The pointer to a computed CRC value. Must be 4-byte aligned. @@ -120,7 +125,7 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_Init(CRYPTO_Type *base, * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc(CRYPTO_Type *base, @@ -129,28 +134,28 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc(CRYPTO_Type *base, uint32_t dataSize, uint32_t lfsrInitState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc(base, crc, data, dataSize, lfsrInitState); + tmpResult = Cy_Crypto_Core_V1_Crc(base, crc, data, dataSize, lfsrInitState); } else { - myResult = Cy_Crypto_Core_V2_Crc(base, crc, data, dataSize, lfsrInitState); + tmpResult = Cy_Crypto_Core_V2_Crc(base, crc, data, dataSize, lfsrInitState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc_CalcInit ****************************************************************************//** * -* Initializes CRC calculation. +* Initializes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -159,7 +164,7 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc(CRYPTO_Type *base, * The polynomial (specified using 32 bits) used in the computing CRC. * * \param dataReverse -* The order in which data bytes are processed. 0 - MSB first; 1- LSB first. +* The order in which data bytes are processed. 0 - MSB first; 1 - LSB first. * * \param dataXor * The byte mask for XORing data @@ -168,13 +173,13 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc(CRYPTO_Type *base, * A remainder reverse: 0 means the remainder is not reversed. 1 means reversed. * * \param remXor -* Specifies a mask with which the LFSR32 register is XORed to produce a remainder. +* Specifies the mask with which the LFSR32 register is XORed to produce a remainder. * * \param lfsrInitState * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcInit(CRYPTO_Type *base, @@ -186,30 +191,30 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcInit(CRYPTO_Type *b uint32_t remXor, uint32_t lfsrInitState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc_CalcInit(base, width, polynomial, dataReverse, dataXor, + tmpResult = Cy_Crypto_Core_V1_Crc_CalcInit(base, width, polynomial, dataReverse, dataXor, remReverse, remXor, lfsrInitState); } else { - myResult = Cy_Crypto_Core_V2_Crc_CalcInit(base, width, polynomial, dataReverse, dataXor, + tmpResult = Cy_Crypto_Core_V2_Crc_CalcInit(base, width, polynomial, dataReverse, dataXor, remReverse, remXor, lfsrInitState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc_CalcStart ****************************************************************************//** * -* Prepares CRC calculation by setting an initial seeds value. +* Prepares the CRC calculation by setting an initial seed value. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -218,34 +223,34 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcInit(CRYPTO_Type *b * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcStart(CRYPTO_Type *base, uint32_t width, uint32_t lfsrInitState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc_CalcStart(base, width, lfsrInitState); + tmpResult = Cy_Crypto_Core_V1_Crc_CalcStart(base, width, lfsrInitState); } else { - myResult = Cy_Crypto_Core_V2_Crc_CalcStart(base, width, lfsrInitState); + tmpResult = Cy_Crypto_Core_V2_Crc_CalcStart(base, width, lfsrInitState); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc_CalcPartial ****************************************************************************//** * -* Performs CRC calculation of a message part. +* Performs the CRC calculation of a message part. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data * The pointer to the message whose CRC is being computed. @@ -254,34 +259,34 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcStart(CRYPTO_Type * * The size of a message in bytes. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcPartial(CRYPTO_Type *base, void const *data, uint32_t dataSize) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc_CalcPartial(base, data, dataSize); + tmpResult = Cy_Crypto_Core_V1_Crc_CalcPartial(base, data, dataSize); } else { - myResult = Cy_Crypto_Core_V2_Crc_CalcPartial(base, data, dataSize); + tmpResult = Cy_Crypto_Core_V2_Crc_CalcPartial(base, data, dataSize); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc_CalcFinish ****************************************************************************//** * -* Finalizes CRC calculation. +* Finalizes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -290,33 +295,33 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcPartial(CRYPTO_Type * The pointer to a computed CRC value. Must be 4-byte aligned. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcFinish(CRYPTO_Type *base, uint32_t width, uint32_t *crc) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc_CalcFinish(base, width, crc); + tmpResult = Cy_Crypto_Core_V1_Crc_CalcFinish(base, width, crc); } else { - myResult = Cy_Crypto_Core_V2_Crc_CalcFinish(base, width, crc); + tmpResult = Cy_Crypto_Core_V2_Crc_CalcFinish(base, width, crc); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Crc_Calc ****************************************************************************//** * -* Performs CRC calculation on a message. +* Performs the CRC calculation on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -331,27 +336,29 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_CalcFinish(CRYPTO_Type * The size of a message in bytes. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Crc_Calc(CRYPTO_Type *base, uint32_t width, uint32_t *crc, void const *data, uint32_t dataSize) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Crc_Calc(base, width, crc, data, dataSize); + tmpResult = Cy_Crypto_Core_V1_Crc_Calc(base, width, crc, data, dataSize); } else { - myResult = Cy_Crypto_Core_V2_Crc_Calc(base, width, crc, data, dataSize); + tmpResult = Cy_Crypto_Core_V2_Crc_Calc(base, width, crc, data, dataSize); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_crc_functions */ + #endif /* #if (CPUSS_CRYPTO_CRC == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v1.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v1.h index c4feeef338..f9f17ec657 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v1.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v1.h @@ -48,7 +48,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc(CRYPTO_Type *base, uint32_t dataSize, uint32_t lfsrInitState); -/* New Partial calculation interface */ +/* The new partial calculation interface. */ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcInit(CRYPTO_Type *base, uint32_t width, uint32_t polynomial, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v2.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v2.h index 319ce82a5d..58c4b7de92 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v2.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_crc_v2.h @@ -48,7 +48,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc(CRYPTO_Type *base, uint32_t dataSize, uint32_t lfsrInitState); -/* New Partial calculation interface */ +/* The new partial calculation interface. */ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcInit(CRYPTO_Type *base, uint32_t width, uint32_t polynomial, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_des.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_des.h index 14ec3290c5..4acf65c0ad 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_des.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_des.h @@ -42,16 +42,21 @@ typedef cy_en_crypto_status_t (*cy_crypto_des_func_t)(CRYPTO_Type *base, uint8_t *dst, uint8_t const *src); +/** +* \addtogroup group_crypto_lld_symmetric_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Des ****************************************************************************//** * -* Performs DES operation on a Single Block. All addresses must be 4-Byte aligned. -* Ciphertext (dstBlock) may overlap with plaintext (srcBlock) +* Performs the DES operation on a single block. All addresses must be 4-byte aligned. +* Ciphertext (dst) may overlap with plaintext (src). * This function is independent from the previous Crypto state. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -61,13 +66,13 @@ typedef cy_en_crypto_status_t (*cy_crypto_des_func_t)(CRYPTO_Type *base, * The pointer to the encryption/decryption key. * * \param dst -* The pointer to a destination cipher block. +* The pointer to the destination cipher block. * * \param src -* The pointer to a source block. +* The pointer to the source block. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Des(CRYPTO_Type *base, @@ -76,30 +81,30 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Des(CRYPTO_Type *base, uint8_t *dst, uint8_t const *src) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Des(base, dirMode, key, dst, src); + tmpResult = Cy_Crypto_Core_V1_Des(base, dirMode, key, dst, src); } else { - myResult = Cy_Crypto_Core_V2_Des(base, dirMode, key, dst, src); + tmpResult = Cy_Crypto_Core_V2_Des(base, dirMode, key, dst, src); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Tdes ****************************************************************************//** * -* Performs TDES operation on a Single Block. All addresses must be 4-Byte aligned. -* Ciphertext (dstBlock) may overlap with plaintext (srcBlock) +* Performs the TDES operation on a single block. All addresses must be 4-byte aligned. +* Ciphertext (dst) may overlap with plaintext (src). * This function is independent from the previous Crypto state. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -109,13 +114,13 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Des(CRYPTO_Type *base, * The pointer to the encryption/decryption keys. * * \param dst -* The pointer to a destination cipher block. +* The pointer to the destination cipher block. * * \param src -* The pointer to a source data block. +* The pointer to the source data block. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Tdes(CRYPTO_Type *base, @@ -124,20 +129,22 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Tdes(CRYPTO_Type *base, uint8_t *dst, uint8_t const *src) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Tdes(base, dirMode, key, dst, src); + tmpResult = Cy_Crypto_Core_V1_Tdes(base, dirMode, key, dst, src); } else { - myResult = Cy_Crypto_Core_V2_Tdes(base, dirMode, key, dst, src); + tmpResult = Cy_Crypto_Core_V2_Tdes(base, dirMode, key, dst, src); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_symmetric_functions */ + #endif /* #if (CPUSS_CRYPTO_DES == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc.h index 6a68d63e9f..fb98ccb491 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc.h @@ -34,6 +34,12 @@ #if (CPUSS_CRYPTO_VU == 1) +/** +* \addtogroup group_crypto_lld_asymmetric_enums +* \{ +*/ + +/** List of supported elliptic curve IDs */ typedef enum { CY_CRYPTO_ECC_ECP_NONE = 0, CY_CRYPTO_ECC_ECP_SECP192R1, @@ -45,6 +51,8 @@ typedef enum { CY_CRYPTO_ECC_ECP_CURVES_CNT } cy_en_crypto_ecc_curve_id_t; +/** \} group_crypto_lld_asymmetric_enums */ + typedef enum cy_en_red_mul_algs { CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG = 0, CY_CRYPTO_NIST_P_SHIFT_MUL_RED_ALG, @@ -60,7 +68,7 @@ typedef struct { uint32_t size; /** name of curve */ - const char *name; + const char_t *name; /** ECC calculation default algorithm */ cy_en_crypto_ecc_red_mul_algs_t algo; @@ -118,7 +126,14 @@ typedef struct { } cy_stc_crypto_ecc_key; -typedef int (*cy_func_get_random_data_t)(void *, unsigned char *, size_t); +/** +* \addtogroup group_crypto_lld_asymmetric_functions +* \{ +*/ + +/** Pointer to a random number supplier function */ +typedef int (*cy_func_get_random_data_t)(void *rndInfo, uint8_t *rndData, size_t rndSize); + cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakeKeyPair(CRYPTO_Type *base, cy_en_crypto_ecc_curve_id_t curveID, cy_stc_crypto_ecc_key *key, @@ -127,22 +142,24 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8_t *hash, uint32_t hashlen, uint8_t *sig, - cy_stc_crypto_ecc_key *key, - uint8_t *messageKey); + const cy_stc_crypto_ecc_key *key, + const uint8_t *messageKey); cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, - const uint8_t *sig, - const uint8_t *hash, - uint32_t hashlen, - uint8_t *status, - cy_stc_crypto_ecc_key *key); + const uint8_t *sig, + const uint8_t *hash, + uint32_t hashlen, + uint8_t *stat, + const cy_stc_crypto_ecc_key *key); cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakePrivateKey(CRYPTO_Type *base, cy_en_crypto_ecc_curve_id_t curveID, uint8_t *key, cy_func_get_random_data_t GetRandomDataFunc, void *randomDataInfo); cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakePublicKey(CRYPTO_Type *base, cy_en_crypto_ecc_curve_id_t curveID, - uint8_t *privateKey, + const uint8_t *privateKey, cy_stc_crypto_ecc_key *publicKey); +/** \} group_crypto_lld_asymmetric_functions */ + /** Calculates the actual size in bytes of the bits value */ #define CY_CRYPTO_BYTE_SIZE_OF_BITS(x) (uint32_t)(((x) + 7u) >> 3u) @@ -166,11 +183,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakePublicKey(CRYPTO_Type *base, #define CY_CRYPTO_ECC_MAX_BYTE_SIZE (CY_CRYPTO_ECC_P521_BYTE_SIZE) /* "Global" vector unit registers. */ -#define VR_D 10 -#define VR_S_X 11 -#define VR_S_Y 12 -#define VR_BARRETT 13 -#define VR_P 14 /* polynomial */ +#define VR_D 10u +#define VR_S_X 11u +#define VR_S_Y 12u +#define VR_BARRETT 13u +#define VR_P 14u /* polynomial */ #endif /* #if (CPUSS_CRYPTO_VU == 1) */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc_nist_p.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc_nist_p.h index 6fec27fa7b..33e5b3a824 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc_nist_p.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_ecc_nist_p.h @@ -33,38 +33,39 @@ #if (CPUSS_CRYPTO_VU == 1) -void Cy_Crypto_Core_EC_NistP_SetMode(int bitsize); +void Cy_Crypto_Core_EC_NistP_SetMode(uint32_t bitsize); void Cy_Crypto_Core_EC_NistP_SetRedAlg(cy_en_crypto_ecc_red_mul_algs_t alg); -void Cy_Crypto_Core_EC_NistP_PointMul(CRYPTO_Type *base, int p_x, int p_y, int p_d, int p_order, int bitsize); + +/** +* \addtogroup group_crypto_lld_asymmetric_functions +* \{ +*/ cy_en_crypto_status_t Cy_Crypto_Core_EC_NistP_PointMultiplication(CRYPTO_Type *base, cy_en_crypto_ecc_curve_id_t curveID, - uint8_t* ecpGX, - uint8_t* ecpGY, - uint8_t* ecpD, - uint8_t* ecpQX, - uint8_t* ecpQY); -void Cy_Crypto_Core_EC_MulMod( CRYPTO_Type *base, - int z, - int a, - int b, - int size); -void Cy_Crypto_Core_EC_DivMod( CRYPTO_Type *base, - int z, - int a, - int b, - int size); -void Cy_Crypto_Core_EC_SquareMod( CRYPTO_Type *base, - int z, - int a, - int size); -void Cy_Crypto_Core_EC_Bar_MulRed(CRYPTO_Type *base, - int z, - int x, - int size -); -void Cy_Crypto_Core_EC_AddMod( CRYPTO_Type *base, int z, int a, int b); -void Cy_Crypto_Core_EC_SubMod( CRYPTO_Type *base, int z, int a, int b); -void Cy_Crypto_Core_EC_HalfMod( CRYPTO_Type *base, int z, int a); + const uint8_t *ecpGX, + const uint8_t *ecpGY, + const uint8_t *ecpD, + uint8_t *ecpQX, + uint8_t *ecpQY); +/** \} group_crypto_lld_asymmetric_functions */ + +void Cy_Crypto_Core_EC_MulMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t b, uint32_t size); +void Cy_Crypto_Core_EC_DivMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t b, uint32_t size); +void Cy_Crypto_Core_EC_SquareMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t size); +void Cy_Crypto_Core_EC_Bar_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size); + +void Cy_Crypto_Core_EC_AddMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t b); +void Cy_Crypto_Core_EC_SubMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t b); +void Cy_Crypto_Core_EC_HalfMod( CRYPTO_Type *base, uint32_t z, uint32_t a); + +void Cy_Crypto_Core_JacobianEcAdd(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t s_z, uint32_t t_x, uint32_t t_y, uint32_t size); +void Cy_Crypto_Core_JacobianEcDouble(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t s_z, uint32_t size); +void Cy_Crypto_Core_JacobianEcScalarMul(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t d, uint32_t size); + +void Cy_Crypto_Core_JacobianTransform(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t s_z); +void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t s_z, uint32_t size); + +void Cy_Crypto_Core_EC_NistP_PointMul(CRYPTO_Type *base, uint32_t p_x, uint32_t p_y, uint32_t p_d, uint32_t p_order, uint32_t bitsize); #endif /* #if (CPUSS_CRYPTO_VU == 1) */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hmac.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hmac.h index 8dabf45ad5..d920990cf9 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hmac.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hmac.h @@ -44,23 +44,28 @@ typedef cy_en_crypto_status_t (*cy_crypto_hmac_func_t)(CRYPTO_Type *base, uint32_t keyLength, cy_en_crypto_sha_mode_t mode); +/** +* \addtogroup group_crypto_lld_mac_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Hmac ****************************************************************************//** * -* Performs HMAC calculation. +* Performs the HMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmac * The pointer to the calculated HMAC. Must be 4-byte aligned. * * \param message -* The pointer to a message whose hash value is being computed. +* The pointer to the message whose hash value is being computed. * * \param messageSize -* The size of a message. +* The size of the message. * * \param key * The pointer to the key. @@ -72,7 +77,7 @@ typedef cy_en_crypto_status_t (*cy_crypto_hmac_func_t)(CRYPTO_Type *base, * \ref cy_en_crypto_sha_mode_t * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Hmac(CRYPTO_Type *base, @@ -83,20 +88,22 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Hmac(CRYPTO_Type *base, uint32_t keyLength, cy_en_crypto_sha_mode_t mode) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Hmac(base, hmac, message, messageSize, key, keyLength, mode); + tmpResult = Cy_Crypto_Core_V1_Hmac(base, hmac, message, messageSize, key, keyLength, mode); } else { - myResult = Cy_Crypto_Core_V2_Hmac(base, hmac, message, messageSize, key, keyLength, mode); + tmpResult = Cy_Crypto_Core_V2_Hmac(base, hmac, message, messageSize, key, keyLength, mode); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_mac_functions */ + #endif /* #if (CPUSS_CRYPTO_SHA == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw.h index c7df544ae8..ff2ddf9c86 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw.h @@ -108,9 +108,9 @@ #define REG_CRYPTO_DEV_KEY_CTL0(base) (((CRYPTO_V2_Type*)(base))->DEV_KEY_CTL0) #define REG_CRYPTO_DEV_KEY_CTL1(base) (((CRYPTO_V2_Type*)(base))->DEV_KEY_CTL1) -/* CRYPTO internal memory buffer size IN BYTES */ +/* The CRYPTO internal-memory buffer-size in bytes. */ #define CY_CRYPTO_MEM_BUFF_SIZE ((cy_device->cryptoMemSize) * 4u) -/* CRYPTO internal memory buffer size IN 32 bit WORDS */ +/* The CRYPTO internal-memory buffer-size in 32-bit words. */ #define CY_CRYPTO_MEM_BUFF_SIZE_U32 (cy_device->cryptoMemSize) /* Device Crypto IP descriptor type */ @@ -220,6 +220,11 @@ typedef enum /** \endcond */ +/** +* \addtogroup group_crypto_lld_hw_functions +* \{ +*/ + void Cy_Crypto_Core_HwInit(void); cy_en_crypto_status_t Cy_Crypto_Core_Enable(CRYPTO_Type *base); @@ -239,10 +244,10 @@ void Cy_Crypto_Core_InvertEndianness(void *inArrPtr, uint32_t byteSize); * The function checks whether the Crypto hardware is enabled. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \return -* Crypto status \ref cy_en_crypto_status_t. +* Crypto status \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE bool Cy_Crypto_Core_IsEnabled(CRYPTO_Type *base) @@ -265,7 +270,7 @@ __STATIC_INLINE bool Cy_Crypto_Core_IsEnabled(CRYPTO_Type *base) * - from 0 to 16 for MXCRYPTO_ver2 IP block * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ __STATIC_INLINE uint8_t Cy_Crypto_Core_GetFIFODepth(CRYPTO_Type *base) @@ -281,7 +286,7 @@ __STATIC_INLINE uint8_t Cy_Crypto_Core_GetFIFODepth(CRYPTO_Type *base) * The value of this field ranges from 0 to 8 * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ __STATIC_INLINE uint8_t Cy_Crypto_Core_GetFIFOUsed(CRYPTO_Type *base) @@ -299,7 +304,7 @@ __STATIC_INLINE uint8_t Cy_Crypto_Core_GetFIFOUsed(CRYPTO_Type *base) * By default EVENT_LEVEL = 0; * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ __STATIC_INLINE void Cy_Crypto_Core_WaitForFifoAvailable(CRYPTO_Type *base) @@ -316,7 +321,7 @@ __STATIC_INLINE void Cy_Crypto_Core_WaitForFifoAvailable(CRYPTO_Type *base) * Waits until all instruction in FIFO will be completed * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ __STATIC_INLINE void Cy_Crypto_Core_WaitForReady(CRYPTO_Type *base) @@ -333,7 +338,7 @@ __STATIC_INLINE void Cy_Crypto_Core_WaitForReady(CRYPTO_Type *base) * Masks / unmasks multiple interrupt sources. * * \param base -* Pointer to Crypto instance address +* The pointer to the CRYPTO instance. * * \param interrupts * Mask bits. See definitions above. @@ -351,7 +356,7 @@ __STATIC_INLINE void Cy_Crypto_Core_SetInterruptMask(CRYPTO_Type *base, uint32_t * Reports mask / unmask multiple interrupt sources. * * \param base -* Pointer to Crypto instance address +* The pointer to the CRYPTO instance. * * \return * Mask bits. See definitions above. @@ -369,7 +374,7 @@ __STATIC_INLINE uint32_t Cy_Crypto_Core_GetInterruptMask(CRYPTO_Type const *base * Reports states of multiple enabled interrupt sources. * * \param base -* Pointer to Crypto instance address +* The pointer to the CRYPTO instance. * * \return * Source bits. See definitions above. @@ -387,7 +392,7 @@ __STATIC_INLINE uint32_t Cy_Crypto_Core_GetInterruptStatusMasked(CRYPTO_Type con * Reports states of multiple interrupt sources. * * \param base -* Pointer to Crypto instance address +* The pointer to the CRYPTO instance. * * \return * Source bits. See definitions above. @@ -405,7 +410,7 @@ __STATIC_INLINE uint32_t Cy_Crypto_Core_GetInterruptStatus(CRYPTO_Type *base) * Sets one of more interrupt sources * * \param base -* Pointer to Crypto instance address +* The pointer to the CRYPTO instance. * * \param interrupts * Source bit(s) @@ -423,7 +428,7 @@ __STATIC_INLINE void Cy_Crypto_Core_SetInterrupt(CRYPTO_Type *base, uint32_t in * Clears multiple interrupt sources. * * \param base -* Pointer to Crypto instance address +* The pointer to the CRYPTO instance. * * \param interrupts * Source bit(s). See definitions above. @@ -435,6 +440,7 @@ __STATIC_INLINE void Cy_Crypto_Core_ClearInterrupt(CRYPTO_Type *base, uint32_t (void) REG_CRYPTO_INTR(base); } +/** \} group_crypto_lld_hw_functions */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_v2.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_v2.h index fb8e1b11ac..33eef6dad5 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_v2.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_v2.h @@ -151,8 +151,8 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_FFStart(CRYPTO_Type *base, { } - REG_CRYPTO_INSTR_FF_WR(base) = (CY_CRYPTO_V2_FF_START_OPC << CY_CRYPTO_OPCODE_POS) - | (ff_idx << CY_CRYPTO_RSRC0_SHIFT); + REG_CRYPTO_INSTR_FF_WR(base) = ((uint32_t)CY_CRYPTO_V2_FF_START_OPC << CY_CRYPTO_OPCODE_POS) | + (ff_idx << CY_CRYPTO_RSRC0_SHIFT); REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t) p_mem; REG_CRYPTO_INSTR_FF_WR(base) = size; } @@ -168,8 +168,8 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_FFContinue(CRYPTO_Type *base, /* Wait for previous loading has been completed. */ (CY_CRYPTO_V2_RB_FF_LOAD0 == ff_idx) ? Cy_Crypto_Core_V2_FFLoad0Sync(base) : Cy_Crypto_Core_V2_FFLoad1Sync(base); - REG_CRYPTO_INSTR_FF_WR(base) = (CY_CRYPTO_V2_FF_CONTINUE_OPC << CY_CRYPTO_OPCODE_POS) - | (ff_idx << CY_CRYPTO_RSRC0_SHIFT); + REG_CRYPTO_INSTR_FF_WR(base) = ((uint32_t)CY_CRYPTO_V2_FF_CONTINUE_OPC << CY_CRYPTO_OPCODE_POS) | + (ff_idx << CY_CRYPTO_RSRC0_SHIFT); REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t) p_mem; REG_CRYPTO_INSTR_FF_WR(base) = size; } @@ -181,7 +181,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_FFStop(CRYPTO_Type *base, uint32_t ff_idx { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_FF_STOP_OPC << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_FF_STOP_OPC << CY_CRYPTO_OPCODE_POS) | (ff_idx << CY_CRYPTO_RSRC0_SHIFT)); } @@ -193,7 +193,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_BlockMov(CRYPTO_Type *base, { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_BLOCK_MOV_OPC << CY_CRYPTO_OPCODE_POS) + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_BLOCK_MOV_OPC << CY_CRYPTO_OPCODE_POS) | (size << CY_CRYPTO_RSRC16_SHIFT) | (dst_idx << CY_CRYPTO_RSRC12_SHIFT) | (src_idx << CY_CRYPTO_RSRC0_SHIFT)); @@ -207,8 +207,8 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_BlockMov_Reflect(CRYPTO_Type *base, { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_BLOCK_MOV_OPC << CY_CRYPTO_OPCODE_POS) - | (1u << CY_CRYPTO_RSRC23_SHIFT) + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_BLOCK_MOV_OPC << CY_CRYPTO_OPCODE_POS) + | (1UL << CY_CRYPTO_RSRC23_SHIFT) | (size << CY_CRYPTO_RSRC16_SHIFT) | (dst_idx << CY_CRYPTO_RSRC12_SHIFT) | (src_idx << CY_CRYPTO_RSRC0_SHIFT)); @@ -222,7 +222,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_BlockSet(CRYPTO_Type *base, { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_BLOCK_SET_OPC << CY_CRYPTO_OPCODE_POS) + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_BLOCK_SET_OPC << CY_CRYPTO_OPCODE_POS) | (size << CY_CRYPTO_RSRC16_SHIFT) | (dst_idx << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)(data) << CY_CRYPTO_RSRC0_SHIFT)); @@ -236,7 +236,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_BlockCmp(CRYPTO_Type *base, { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_BLOCK_CMP_OPC << CY_CRYPTO_OPCODE_POS) + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_BLOCK_CMP_OPC << CY_CRYPTO_OPCODE_POS) | (size << CY_CRYPTO_RSRC16_SHIFT) | (src1_idx << CY_CRYPTO_RSRC4_SHIFT) | (src0_idx << CY_CRYPTO_RSRC0_SHIFT)); @@ -250,7 +250,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_BlockXor(CRYPTO_Type *base, { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_BLOCK_XOR_OPC << CY_CRYPTO_OPCODE_POS) + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_BLOCK_XOR_OPC << CY_CRYPTO_OPCODE_POS) | (size << CY_CRYPTO_RSRC16_SHIFT) | (dst_idx << CY_CRYPTO_RSRC12_SHIFT) | (src1_idx << CY_CRYPTO_RSRC4_SHIFT) @@ -264,7 +264,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_BlockGcm(CRYPTO_Type *base) { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(CY_CRYPTO_V2_BLOCK_GCM_OPC << CY_CRYPTO_OPCODE_POS); + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((uint32_t)CY_CRYPTO_V2_BLOCK_GCM_OPC << CY_CRYPTO_OPCODE_POS); } __STATIC_INLINE void Cy_Crypto_Core_V2_Run(CRYPTO_Type *base, uint32_t opc) @@ -284,7 +284,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RBClear(CRYPTO_Type *base) { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(CY_CRYPTO_V2_RB_CLEAR_OPC << CY_CRYPTO_OPCODE_POS); + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((uint32_t)CY_CRYPTO_V2_RB_CLEAR_OPC << CY_CRYPTO_OPCODE_POS); } __STATIC_INLINE void Cy_Crypto_Core_V2_RBSwap(CRYPTO_Type *base) @@ -294,7 +294,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RBSwap(CRYPTO_Type *base) { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(CY_CRYPTO_V2_RB_SWAP_OPC << CY_CRYPTO_OPCODE_POS); + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((uint32_t)CY_CRYPTO_V2_RB_SWAP_OPC << CY_CRYPTO_OPCODE_POS); } __STATIC_INLINE void Cy_Crypto_Core_V2_RBXor(CRYPTO_Type *base, uint32_t offset, uint32_t size) @@ -304,7 +304,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RBXor(CRYPTO_Type *base, uint32_t offset, { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_RB_XOR_OPC << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_RB_XOR_OPC << CY_CRYPTO_OPCODE_POS) | (offset << CY_CRYPTO_RSRC8_SHIFT) | (size << CY_CRYPTO_RSRC0_SHIFT)); } @@ -316,7 +316,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RBStore(CRYPTO_Type *base, uint32_t offse { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_RB_STORE_OPC << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_RB_STORE_OPC << CY_CRYPTO_OPCODE_POS) | (offset << CY_CRYPTO_RSRC8_SHIFT) | (size << CY_CRYPTO_RSRC0_SHIFT));} @@ -327,7 +327,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RBSetByte(CRYPTO_Type *base, uint32_t off { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((CY_CRYPTO_V2_RB_BYTE_SET_OPC << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(((uint32_t)CY_CRYPTO_V2_RB_BYTE_SET_OPC << CY_CRYPTO_OPCODE_POS) | (offset << CY_CRYPTO_RSRC8_SHIFT) | ((uint32_t)(byte) << CY_CRYPTO_RSRC0_SHIFT)); } @@ -339,7 +339,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RunAes(CRYPTO_Type *base) { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(CY_CRYPTO_V2_AES_OPC << CY_CRYPTO_OPCODE_POS); + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((uint32_t)CY_CRYPTO_V2_AES_OPC << CY_CRYPTO_OPCODE_POS); } __STATIC_INLINE void Cy_Crypto_Core_V2_RunAesInv(CRYPTO_Type *base) @@ -349,7 +349,7 @@ __STATIC_INLINE void Cy_Crypto_Core_V2_RunAesInv(CRYPTO_Type *base) { } - REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)(CY_CRYPTO_V2_AES_INV_OPC << CY_CRYPTO_OPCODE_POS); + REG_CRYPTO_INSTR_FF_WR(base) = (uint32_t)((uint32_t)CY_CRYPTO_V2_AES_INV_OPC << CY_CRYPTO_OPCODE_POS); } __STATIC_INLINE void Cy_Crypto_Core_V2_RunChacha(CRYPTO_Type *base, uint8_t roundNum) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_vu.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_vu.h index c883594c2c..7780982475 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_vu.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_hw_vu.h @@ -191,8 +191,8 @@ #define CY_CRYPTO_VU2_INV_BIT_IMM_OPC (0x2Eu) -__STATIC_INLINE void CY_CRYPTO_VU_SAVE_REG (CRYPTO_Type *base, uint32_t rsrc, uint32_t *ddata); -__STATIC_INLINE void CY_CRYPTO_VU_RESTORE_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t ddata); +__STATIC_INLINE void CY_CRYPTO_VU_SAVE_REG (CRYPTO_Type *base, uint32_t rsrc, uint32_t *data); +__STATIC_INLINE void CY_CRYPTO_VU_RESTORE_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t data); __STATIC_INLINE void CY_CRYPTO_VU_SET_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t data, uint32_t size); @@ -200,7 +200,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_MOV_REG_TO_STATUS (CRYPTO_Type *base, uin { REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_MOV_REG_TO_STATUS_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | - (uint32_t)rsrc); + ((uint32_t)rsrc)); } __STATIC_INLINE void CY_CRYPTO_VU_MOV_REG_TO_STATUS (CRYPTO_Type *base, uint32_t rsrc) @@ -222,18 +222,19 @@ __STATIC_INLINE void CY_CRYPTO_VU_MOV_STATUS_TO_REG (CRYPTO_Type *base, uint32_t __STATIC_INLINE void CY_CRYPTO_VU_COND_MOV_IMM_TO_STATUS (CRYPTO_Type *base, uint32_t cc, uint32_t imm4) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******* V1 *********/ - int tmp_reg = CY_CRYPTO_VU_HW_REG14; - uint32_t tmp_data; + uint32_t tmpReg = CY_CRYPTO_VU_HW_REG14; + uint32_t tmpData; - CY_CRYPTO_VU_SAVE_REG(base, tmp_reg, &tmp_data); + CY_CRYPTO_VU_SAVE_REG(base, tmpReg, &tmpData); - CY_CRYPTO_VU_SET_REG(base, tmp_reg, imm4, 4); - CY_CRYPTO_VU_COND_MOV_REG_TO_STATUS(base, cc, tmp_reg); + /* Load 4 bit immediate value */ + CY_CRYPTO_VU_SET_REG(base, tmpReg, imm4, 4u); + CY_CRYPTO_VU_COND_MOV_REG_TO_STATUS(base, cc, tmpReg); - CY_CRYPTO_VU_RESTORE_REG(base, tmp_reg, tmp_data); + CY_CRYPTO_VU_RESTORE_REG(base, tmpReg, tmpData); } else { @@ -255,8 +256,8 @@ __STATIC_INLINE void CY_CRYPTO_VU_SET_REG (CRYPTO_Type *base, uint32_t rdst, uin { REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_SET_REG_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)rdst << CY_CRYPTO_RSRC26_SHIFT) | - ((uint32_t)data << ((cy_device->cryptoVersion == 1) ? CY_CRYPTO_RSRC12_SHIFT : CY_CRYPTO_RSRC13_SHIFT)) | - (((uint32_t)size - 1) << CY_CRYPTO_RSRC0_SHIFT)); + ((uint32_t)data << ((CY_CRYPTO_HW_V1) ? CY_CRYPTO_RSRC12_SHIFT : CY_CRYPTO_RSRC13_SHIFT)) | + (((uint32_t)size - 1u) << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_COND_LD_REG (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc) @@ -317,7 +318,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_ADD_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_ADD_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -331,7 +332,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_SUB_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_SUB_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -345,7 +346,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_OR_REG (CRYPTO_Type *base, uint32_t cc, u ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_OR_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -359,7 +360,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_AND_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_AND_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -373,7 +374,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_XOR_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_XOR_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -387,7 +388,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_NOR_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_NOR_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -401,7 +402,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_NAND_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_NAND_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -415,7 +416,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_MIN_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_MIN_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -429,7 +430,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_MAX_REG (CRYPTO_Type *base, uint32_t cc, ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_MAX_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -464,8 +465,8 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_ALLOC_MEM (CRYPTO_Type *base, uint32_t cc REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_ALLOC_MEM_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | - ((uint32_t)rdst << ((cy_device->cryptoVersion == 1) ? CY_CRYPTO_RSRC12_SHIFT : CY_CRYPTO_RSRC16_SHIFT)) | - (((uint32_t)size - 1) << CY_CRYPTO_RSRC0_SHIFT)); + ((uint32_t)rdst << ((CY_CRYPTO_HW_V1) ? CY_CRYPTO_RSRC12_SHIFT : CY_CRYPTO_RSRC16_SHIFT)) | + (((uint32_t)size - 1u) << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_ALLOC_MEM (CRYPTO_Type *base, uint32_t rdst, uint32_t size) @@ -477,7 +478,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_FREE_MEM (CRYPTO_Type *base, uint32_t cc, { REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_FREE_MEM_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | - (uint32_t)reg_mask); + ((uint32_t)reg_mask)); } __STATIC_INLINE void CY_CRYPTO_VU_FREE_MEM (CRYPTO_Type *base, uint32_t reg_mask) @@ -491,7 +492,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_LSL (CRYPTO_Type *base, uint32_t cc, uint ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_LSL (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -501,7 +502,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_LSL (CRYPTO_Type *base, uint32_t rdst, uint32_ __STATIC_INLINE void CY_CRYPTO_VU_COND_LSL1 (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******* V1 *********/ REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_LSL1_OPC << CY_CRYPTO_OPCODE_POS) | @@ -527,7 +528,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_LSL1 (CRYPTO_Type *base, uint32_t rdst, uint32 __STATIC_INLINE void CY_CRYPTO_VU_COND_LSL1_WITH_CARRY (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******* V1 *********/ REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_LSL1_WITH_CARRY_OPC << CY_CRYPTO_OPCODE_POS) | @@ -553,11 +554,11 @@ __STATIC_INLINE void CY_CRYPTO_VU_LSL1_WITH_CARRY (CRYPTO_Type *base, uint32_t r __STATIC_INLINE void CY_CRYPTO_VU_COND_LSR (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_LSR_OPC : CY_CRYPTO_VU2_LSR_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_LSR_OPC : CY_CRYPTO_VU2_LSR_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_LSR (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -567,7 +568,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_LSR (CRYPTO_Type *base, uint32_t rdst, uint32_ __STATIC_INLINE void CY_CRYPTO_VU_COND_LSR1 (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******* V1 *********/ REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)(CY_CRYPTO_VU1_LSR1_OPC) << CY_CRYPTO_OPCODE_POS) | @@ -593,7 +594,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_LSR1 (CRYPTO_Type *base, uint32_t rdst, uint32 __STATIC_INLINE void CY_CRYPTO_VU_COND_LSR1_WITH_CARRY (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******* V1 *********/ REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)(CY_CRYPTO_VU1_LSR1_WITH_CARRY_OPC) << CY_CRYPTO_OPCODE_POS) | @@ -619,11 +620,11 @@ __STATIC_INLINE void CY_CRYPTO_VU_LSR1_WITH_CARRY (CRYPTO_Type *base, uint32_t r __STATIC_INLINE void CY_CRYPTO_VU_COND_CLSAME (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_CLSAME_OPC : CY_CRYPTO_VU2_CLSAME_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_CLSAME_OPC : CY_CRYPTO_VU2_CLSAME_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_CLSAME (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -633,11 +634,11 @@ __STATIC_INLINE void CY_CRYPTO_VU_CLSAME (CRYPTO_Type *base, uint32_t rdst, uint __STATIC_INLINE void CY_CRYPTO_VU_COND_CTSAME (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_CTSAME_OPC : CY_CRYPTO_VU2_CTSAME_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_CTSAME_OPC : CY_CRYPTO_VU2_CTSAME_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_CTSAME (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -647,10 +648,10 @@ __STATIC_INLINE void CY_CRYPTO_VU_CTSAME (CRYPTO_Type *base, uint32_t rdst, uint __STATIC_INLINE void CY_CRYPTO_VU_COND_SET_BIT (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_SET_BIT_OPC : CY_CRYPTO_VU2_SET_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_SET_BIT_OPC : CY_CRYPTO_VU2_SET_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_SET_BIT (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc) @@ -660,10 +661,10 @@ __STATIC_INLINE void CY_CRYPTO_VU_SET_BIT (CRYPTO_Type *base, uint32_t rdst, uin __STATIC_INLINE void CY_CRYPTO_VU_COND_CLR_BIT (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_CLR_BIT_OPC : CY_CRYPTO_VU2_CLR_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_CLR_BIT_OPC : CY_CRYPTO_VU2_CLR_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_CLR_BIT (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc) @@ -673,10 +674,10 @@ __STATIC_INLINE void CY_CRYPTO_VU_CLR_BIT (CRYPTO_Type *base, uint32_t rdst, uin __STATIC_INLINE void CY_CRYPTO_VU_COND_INV_BIT (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_INV_BIT_OPC : CY_CRYPTO_VU2_INV_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_INV_BIT_OPC : CY_CRYPTO_VU2_INV_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_INV_BIT (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc) @@ -686,11 +687,11 @@ __STATIC_INLINE void CY_CRYPTO_VU_INV_BIT (CRYPTO_Type *base, uint32_t rdst, uin __STATIC_INLINE void CY_CRYPTO_VU_COND_GET_BIT (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) { - REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((cy_device->cryptoVersion == 1) ? CY_CRYPTO_VU1_GET_BIT_OPC : CY_CRYPTO_VU2_GET_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | + REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)((CY_CRYPTO_HW_V1) ? CY_CRYPTO_VU1_GET_BIT_OPC : CY_CRYPTO_VU2_GET_BIT_OPC) << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_GET_BIT (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -701,17 +702,18 @@ __STATIC_INLINE void CY_CRYPTO_VU_GET_BIT (CRYPTO_Type *base, uint32_t rdst, uin /******************************************************************************/ __STATIC_INLINE void CY_CRYPTO_VU_COND_SET_BIT_IMM (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t imm13) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******** V1 ********/ - int tmp_reg = (rdst != CY_CRYPTO_VU_HW_REG14) ? CY_CRYPTO_VU_HW_REG14 : CY_CRYPTO_VU_HW_REG13; - uint32_t tmp_data; - CY_CRYPTO_VU_SAVE_REG(base, tmp_reg, &tmp_data); + uint32_t tmpReg = (rdst != CY_CRYPTO_VU_HW_REG14) ? CY_CRYPTO_VU_HW_REG14 : CY_CRYPTO_VU_HW_REG13; + uint32_t tmpData; + CY_CRYPTO_VU_SAVE_REG(base, tmpReg, &tmpData); - CY_CRYPTO_VU_SET_REG(base, tmp_reg, imm13, 13); - CY_CRYPTO_VU_COND_SET_BIT(base, cc, rdst, tmp_reg); + /* Load 13 bit immediate value */ + CY_CRYPTO_VU_SET_REG(base, tmpReg, imm13, 13u); + CY_CRYPTO_VU_COND_SET_BIT(base, cc, rdst, tmpReg); - CY_CRYPTO_VU_RESTORE_REG(base, tmp_reg, tmp_data); + CY_CRYPTO_VU_RESTORE_REG(base, tmpReg, tmpData); } else { @@ -719,7 +721,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_SET_BIT_IMM (CRYPTO_Type *base, uint32_t REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU2_SET_BIT_IMM_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC16_SHIFT) | - (uint32_t)imm13 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)imm13 << CY_CRYPTO_RSRC0_SHIFT)); } } @@ -730,17 +732,18 @@ __STATIC_INLINE void CY_CRYPTO_VU_SET_BIT_IMM (CRYPTO_Type *base, uint32_t rdst, __STATIC_INLINE void CY_CRYPTO_VU_COND_CLR_BIT_IMM (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t imm13) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******** V1 ********/ - int tmp_reg = (rdst != CY_CRYPTO_VU_HW_REG14) ? CY_CRYPTO_VU_HW_REG14 : CY_CRYPTO_VU_HW_REG13; - uint32_t tmp_data; - CY_CRYPTO_VU_SAVE_REG(base, tmp_reg, &tmp_data); + uint32_t tmpReg = (rdst != CY_CRYPTO_VU_HW_REG14) ? CY_CRYPTO_VU_HW_REG14 : CY_CRYPTO_VU_HW_REG13; + uint32_t tmpData; + CY_CRYPTO_VU_SAVE_REG(base, tmpReg, &tmpData); - CY_CRYPTO_VU_SET_REG(base, tmp_reg, imm13, 13); - CY_CRYPTO_VU_COND_CLR_BIT(base, cc, rdst, tmp_reg); + /* Load 13 bit immediate value */ + CY_CRYPTO_VU_SET_REG(base, tmpReg, imm13, 13u); + CY_CRYPTO_VU_COND_CLR_BIT(base, cc, rdst, tmpReg); - CY_CRYPTO_VU_RESTORE_REG(base, tmp_reg, tmp_data); + CY_CRYPTO_VU_RESTORE_REG(base, tmpReg, tmpData); } else { @@ -748,7 +751,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_CLR_BIT_IMM (CRYPTO_Type *base, uint32_t REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU2_CLR_BIT_IMM_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC16_SHIFT) | - (uint32_t)imm13 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)imm13 << CY_CRYPTO_RSRC0_SHIFT)); } } @@ -759,17 +762,18 @@ __STATIC_INLINE void CY_CRYPTO_VU_CLR_BIT_IMM (CRYPTO_Type *base, uint32_t rdst, __STATIC_INLINE void CY_CRYPTO_VU_COND_INV_BIT_IMM (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t imm13) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /******** V1 ********/ - int tmp_reg = (rdst != CY_CRYPTO_VU_HW_REG14) ? CY_CRYPTO_VU_HW_REG14 : CY_CRYPTO_VU_HW_REG13; - uint32_t tmp_data; - CY_CRYPTO_VU_SAVE_REG(base, tmp_reg, &tmp_data); + uint32_t tmpReg = (rdst != CY_CRYPTO_VU_HW_REG14) ? CY_CRYPTO_VU_HW_REG14 : CY_CRYPTO_VU_HW_REG13; + uint32_t tmpData; + CY_CRYPTO_VU_SAVE_REG(base, tmpReg, &tmpData); - CY_CRYPTO_VU_SET_REG(base, tmp_reg, imm13, 13); - CY_CRYPTO_VU_COND_INV_BIT(base, cc, rdst, tmp_reg); + /* Load 13 bit immediate value */ + CY_CRYPTO_VU_SET_REG(base, tmpReg, imm13, 13u); + CY_CRYPTO_VU_COND_INV_BIT(base, cc, rdst, tmpReg); - CY_CRYPTO_VU_RESTORE_REG(base, tmp_reg, tmp_data); + CY_CRYPTO_VU_RESTORE_REG(base, tmpReg, tmpData); } else { @@ -777,7 +781,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_INV_BIT_IMM (CRYPTO_Type *base, uint32_t REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU2_INV_BIT_IMM_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC16_SHIFT) | - (uint32_t)imm13 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)imm13 << CY_CRYPTO_RSRC0_SHIFT)); } } @@ -791,7 +795,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_TST (CRYPTO_Type *base, uint32_t cc, uint { REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_TST_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_TST (CRYPTO_Type *base, uint32_t rsrc) @@ -804,7 +808,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_MOV (CRYPTO_Type *base, uint32_t cc, uint REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_MOV_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_MOV (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc) @@ -817,7 +821,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_XSQUARE (CRYPTO_Type *base, uint32_t cc, REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_XSQUARE_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_XSQUARE (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc) @@ -831,7 +835,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_XMUL (CRYPTO_Type *base, uint32_t cc, uin ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_XMUL (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -846,7 +850,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_UMUL (CRYPTO_Type *base, uint32_t cc, uin ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_UMUL (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -856,7 +860,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_UMUL (CRYPTO_Type *base, uint32_t rdst, uint32 __STATIC_INLINE void CY_CRYPTO_VU_COND_USQUARE (CRYPTO_Type *base, uint32_t cc, uint32_t rdst, uint32_t rsrc) { - if (cy_device->cryptoVersion == 1) + if (CY_CRYPTO_HW_V1) { /***** V1 *******/ CY_CRYPTO_VU_COND_UMUL(base, cc, rdst, rsrc, rsrc); @@ -867,7 +871,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_USQUARE (CRYPTO_Type *base, uint32_t cc, REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU2_USQUARE_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | - (uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc << CY_CRYPTO_RSRC0_SHIFT)); } } @@ -906,7 +910,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_ADD (CRYPTO_Type *base, uint32_t cc, uint ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_ADD (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -920,7 +924,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_SUB (CRYPTO_Type *base, uint32_t cc, uint ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_SUB (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -934,7 +938,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_OR (CRYPTO_Type *base, uint32_t cc, uint3 ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_OR (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -948,7 +952,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_AND (CRYPTO_Type *base, uint32_t cc, uint ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_AND (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -962,7 +966,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_XOR (CRYPTO_Type *base, uint32_t cc, uint ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_XOR (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -976,7 +980,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_NOR (CRYPTO_Type *base, uint32_t cc, uint ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_NOR (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -990,7 +994,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_NAND (CRYPTO_Type *base, uint32_t cc, uin ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rdst << CY_CRYPTO_RSRC12_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_NAND (CRYPTO_Type *base, uint32_t rdst, uint32_t rsrc1, uint32_t rsrc0) @@ -1003,7 +1007,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_CMP_SUB (CRYPTO_Type *base, uint32_t cc, REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_CMP_SUB_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_CMP_SUB (CRYPTO_Type *base, uint32_t rsrc1, uint32_t rsrc0) @@ -1016,7 +1020,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_COND_CMP_DEGREE (CRYPTO_Type *base, uint32_t c REG_CRYPTO_INSTR_FF_WR(base) = (((uint32_t)CY_CRYPTO_VU_CMP_DEGREE_OPC << CY_CRYPTO_OPCODE_POS) | ((uint32_t)cc << CY_CRYPTO_RSRC20_SHIFT) | ((uint32_t)rsrc1 << CY_CRYPTO_RSRC4_SHIFT) | - (uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT); + ((uint32_t)rsrc0 << CY_CRYPTO_RSRC0_SHIFT)); } __STATIC_INLINE void CY_CRYPTO_VU_CMP_DEGREE (CRYPTO_Type *base, uint32_t rsrc1, uint32_t rsrc0) @@ -1031,7 +1035,7 @@ __STATIC_INLINE void CY_CRYPTO_VU_SAVE_REG (CRYPTO_Type *base, uint32_t rsrc, ui __STATIC_INLINE void CY_CRYPTO_VU_RESTORE_REG (CRYPTO_Type *base, uint32_t rdst, uint32_t data) { - CY_CRYPTO_VU_SET_REG(base, rdst, CY_CRYPTO_VU_GET_REG_DATA(data), CY_CRYPTO_VU_GET_REG_SIZE(data) + 1); + CY_CRYPTO_VU_SET_REG(base, rdst, CY_CRYPTO_VU_GET_REG_DATA(data), CY_CRYPTO_VU_GET_REG_SIZE(data) + 1u); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_mem.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_mem.h index 2e7f548619..f779b43e4c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_mem.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_mem.h @@ -44,6 +44,11 @@ typedef uint32_t (*cy_crypto_memcmp_func_t)(CRYPTO_Type *base, typedef void (*cy_crypto_memxor_func_t)(CRYPTO_Type *base, void* dst, void const *src0, void const *src1, uint16_t size); +/** +* \addtogroup group_crypto_lld_mem_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_MemCpy ****************************************************************************//** @@ -53,7 +58,7 @@ typedef void (*cy_crypto_memxor_func_t)(CRYPTO_Type *base, void* dst, * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dst * The pointer to the destination of MemCpy. @@ -67,7 +72,7 @@ typedef void (*cy_crypto_memxor_func_t)(CRYPTO_Type *base, void* dst, *******************************************************************************/ __STATIC_INLINE void Cy_Crypto_Core_MemCpy(CRYPTO_Type *base, void* dst, void const *src, uint16_t size) { - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { Cy_Crypto_Core_V1_MemCpy(base, dst, src, size); } @@ -85,7 +90,7 @@ __STATIC_INLINE void Cy_Crypto_Core_MemCpy(CRYPTO_Type *base, void* dst, void co * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dst * The pointer to the destination of MemSet. @@ -99,7 +104,7 @@ __STATIC_INLINE void Cy_Crypto_Core_MemCpy(CRYPTO_Type *base, void* dst, void co *******************************************************************************/ __STATIC_INLINE void Cy_Crypto_Core_MemSet(CRYPTO_Type *base, void* dst, uint8_t data, uint16_t size) { - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { Cy_Crypto_Core_V1_MemSet(base, dst, data, size); } @@ -117,7 +122,7 @@ __STATIC_INLINE void Cy_Crypto_Core_MemSet(CRYPTO_Type *base, void* dst, uint8_t * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src0 * The pointer to the first source of MemCmp. @@ -134,17 +139,17 @@ __STATIC_INLINE void Cy_Crypto_Core_MemSet(CRYPTO_Type *base, void* dst, uint8_t *******************************************************************************/ __STATIC_INLINE uint32_t Cy_Crypto_Core_MemCmp(CRYPTO_Type *base, void const *src0, void const *src1, uint16_t size) { - uint32_t result; - if (cy_device->cryptoVersion == 1u) + uint32_t tmpResult; + if (CY_CRYPTO_HW_V1) { - result = Cy_Crypto_Core_V1_MemCmp(base, src0, src1, size); + tmpResult = Cy_Crypto_Core_V1_MemCmp(base, src0, src1, size); } else { - result = Cy_Crypto_Core_V2_MemCmp(base, src0, src1, size); + tmpResult = Cy_Crypto_Core_V2_MemCmp(base, src0, src1, size); } - return (result); + return (tmpResult); } /******************************************************************************* @@ -156,7 +161,7 @@ __STATIC_INLINE uint32_t Cy_Crypto_Core_MemCmp(CRYPTO_Type *base, void const *sr * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dst * The pointer to the destination of MemXor. @@ -174,7 +179,7 @@ __STATIC_INLINE uint32_t Cy_Crypto_Core_MemCmp(CRYPTO_Type *base, void const *sr __STATIC_INLINE void Cy_Crypto_Core_MemXor(CRYPTO_Type *base, void* dst, void const *src0, void const *src1, uint16_t size) { - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { Cy_Crypto_Core_V1_MemXor(base, dst, src0, src1, size); } @@ -184,6 +189,7 @@ __STATIC_INLINE void Cy_Crypto_Core_MemXor(CRYPTO_Type *base, void* dst, } } +/** \} group_crypto_lld_mem_functions */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_prng.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_prng.h index cad1b88604..fcdf41a24b 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_prng.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_prng.h @@ -45,6 +45,11 @@ typedef cy_en_crypto_status_t (*cy_crypto_prng_func_t)(CRYPTO_Type *base, uint32_t max, uint32_t *randomNum); +/** +* \addtogroup group_crypto_lld_rng_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Prng_Init ****************************************************************************//** @@ -53,7 +58,7 @@ typedef cy_en_crypto_status_t (*cy_crypto_prng_func_t)(CRYPTO_Type *base, * Invoking this function causes a restart of the pseudo-random sequence. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param lfsr32InitState * A non-zero seed value for the first LFSR. @@ -65,7 +70,7 @@ typedef cy_en_crypto_status_t (*cy_crypto_prng_func_t)(CRYPTO_Type *base, * A non-zero seed value for the third LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Prng_Init(CRYPTO_Type *base, @@ -73,18 +78,18 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Prng_Init(CRYPTO_Type *base uint32_t lfsr31InitState, uint32_t lfsr29InitState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Prng_Init(base, lfsr32InitState, lfsr31InitState, lfsr29InitState); + tmpResult = Cy_Crypto_Core_V1_Prng_Init(base, lfsr32InitState, lfsr31InitState, lfsr29InitState); } else { - myResult = Cy_Crypto_Core_V2_Prng_Init(base, lfsr32InitState, lfsr31InitState, lfsr29InitState); + tmpResult = Cy_Crypto_Core_V2_Prng_Init(base, lfsr32InitState, lfsr31InitState, lfsr29InitState); } - return myResult; + return tmpResult; } /******************************************************************************* @@ -94,7 +99,7 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Prng_Init(CRYPTO_Type *base * Generates a Pseudo Random Number. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param max * The maximum value of a random number. @@ -103,27 +108,29 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Prng_Init(CRYPTO_Type *base * The pointer to a variable to store the generated pseudo random number. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Prng(CRYPTO_Type *base, uint32_t max, uint32_t *randomNum) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Prng(base, max, randomNum); + tmpResult = Cy_Crypto_Core_V1_Prng(base, max, randomNum); } else { - myResult = Cy_Crypto_Core_V2_Prng(base, max, randomNum); + tmpResult = Cy_Crypto_Core_V2_Prng(base, max, randomNum); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_rng_functions */ + #endif /* #if (CPUSS_CRYPTO_PR == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha.h index 783b54c06f..caf2e587fe 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha.h @@ -42,6 +42,11 @@ typedef cy_en_crypto_status_t (*cy_crypto_sha_func_t)(CRYPTO_Type *base, uint8_t *digest, cy_en_crypto_sha_mode_t mode); +/** +* \addtogroup group_crypto_lld_sha_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Sha ****************************************************************************//** @@ -49,22 +54,22 @@ typedef cy_en_crypto_status_t (*cy_crypto_sha_func_t)(CRYPTO_Type *base, * Performs the SHA Hash function. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param mode * \ref cy_en_crypto_sha_mode_t * * \param message -* The pointer to a message whose hash value is being computed. +* The pointer to the message whose hash value is being computed. * * \param messageSize -* The size of a message. +* The size of the message. * * \param digest * The pointer to the hash digest. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha(CRYPTO_Type *base, @@ -73,41 +78,41 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha(CRYPTO_Type *base, uint8_t *digest, cy_en_crypto_sha_mode_t mode) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Sha(base, message, messageSize, digest, mode); + tmpResult = Cy_Crypto_Core_V1_Sha(base, message, messageSize, digest, mode); } else { - myResult = Cy_Crypto_Core_V2_Sha(base, message, messageSize, digest, mode); + tmpResult = Cy_Crypto_Core_V2_Sha(base, message, messageSize, digest, mode); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Sha_Init ****************************************************************************//** * -* The function to initialize SHA operation. +* The function to initialize the SHA operation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param shaHashState -* The pointer to a Hash State. +* The pointer to a Hash state. * * \param mode * One of these: CY_CRYPTO_SHA256, CY_CRYPTO_SHA1, CY_CRYPTO_SHA256_224, * CY_CRYPTO_SHA512, CY_CRYPTO_SHA384, CY_CRYPTO_SHA512_224, CY_CRYPTO_SHA512_256 * * \param shaBuffers -* The pointer to memory buffers storage +* The pointer to the memory buffers storage. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Init(CRYPTO_Type *base, @@ -115,50 +120,50 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Init(CRYPTO_Type *base, cy_en_crypto_sha_mode_t mode, void *shaBuffers) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Sha_Init(base, shaHashState, mode, shaBuffers); + tmpResult = Cy_Crypto_Core_V1_Sha_Init(base, shaHashState, mode, shaBuffers); } else { - myResult = Cy_Crypto_Core_V2_Sha_Init(base, shaHashState, mode, shaBuffers); + tmpResult = Cy_Crypto_Core_V2_Sha_Init(base, shaHashState, mode, shaBuffers); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_Sha_Start ****************************************************************************//** * -* Initializes the initial hash vector. +* Initializes the initial Hash vector. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Start(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Sha_Start(base, hashState); + tmpResult = Cy_Crypto_Core_V1_Sha_Start(base, hashState); } else { - myResult = Cy_Crypto_Core_V2_Sha_Start(base, hashState); + tmpResult = Cy_Crypto_Core_V2_Sha_Start(base, hashState); } - return myResult; + return tmpResult; } /******************************************************************************* @@ -168,7 +173,7 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Start(CRYPTO_Type *base * Performs the SHA calculation on one message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. @@ -180,12 +185,12 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Start(CRYPTO_Type *base * The size of the message whose Hash is being computed. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \note * This function can be called several times only with message lengths dividable -* by block size. Only the last call to the function can process a message with -* the not dividable size. +* by the block size. Only the last call to the function can process a message with +* a not-dividable size. * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Update(CRYPTO_Type *base, @@ -193,55 +198,55 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Update(CRYPTO_Type *bas uint8_t const *message, uint32_t messageSize) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Sha_Update(base, hashState, message, messageSize); + tmpResult = Cy_Crypto_Core_V1_Sha_Update(base, hashState, message, messageSize); } else { - myResult = Cy_Crypto_Core_V2_Sha_Update(base, hashState, message, messageSize); + tmpResult = Cy_Crypto_Core_V2_Sha_Update(base, hashState, message, messageSize); } - return myResult; + return tmpResult; } /******************************************************************************* * Function Name: Cy_Crypto_Core_V1_Sha_Finish ****************************************************************************//** * -* Completes SHA calculation. +* Completes the SHA calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \param digest -* The pointer to the calculated hash digest. +* The pointer to the calculated Hash digest. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Finish(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState, uint8_t *digest) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Sha_Finish(base, hashState, digest); + tmpResult = Cy_Crypto_Core_V1_Sha_Finish(base, hashState, digest); } else { - myResult = Cy_Crypto_Core_V2_Sha_Finish(base, hashState, digest); + tmpResult = Cy_Crypto_Core_V2_Sha_Finish(base, hashState, digest); } - return myResult; + return tmpResult; } /******************************************************************************* @@ -251,31 +256,32 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Finish(CRYPTO_Type *bas * Clears the used memory buffers. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Sha_Free(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState) { - cy_en_crypto_status_t myResult; + cy_en_crypto_status_t tmpResult; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { - myResult = Cy_Crypto_Core_V1_Sha_Free(base, hashState); + tmpResult = Cy_Crypto_Core_V1_Sha_Free(base, hashState); } else { - myResult = Cy_Crypto_Core_V2_Sha_Free(base, hashState); + tmpResult = Cy_Crypto_Core_V2_Sha_Free(base, hashState); } - return myResult; + return tmpResult; } +/** \} group_crypto_lld_sha_functions */ #endif /* #if (CPUSS_CRYPTO_SHA == 1) */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v1.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v1.h index ec23625dc0..621272f47e 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v1.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v1.h @@ -38,37 +38,37 @@ typedef struct { - /* Allocate CRYPTO_MAX_BLOCK_SIZE Bytes for block */ + /* Allocates CRYPTO_MAX_BLOCK_SIZE Bytes for the block. */ uint32_t block[CY_CRYPTO_SHA1_BLOCK_SIZE / 4u]; - /* Allocate CRYPTO_MAX_HASH_SIZE Bytes for hash */ + /* Allocates CRYPTO_MAX_HASH_SIZE Bytes for the hash. */ uint32_t hash[CY_CRYPTO_SHA1_HASH_SIZE / 4u]; - /* Allocate CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMem */ + /* Allocates CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMem. */ uint32_t roundMem[CY_CRYPTO_SHA1_ROUND_MEM_SIZE / 4u]; } cy_stc_crypto_v1_sha1_buffers_t; typedef struct { - /* Allocate CRYPTO_MAX_BLOCK_SIZE Bytes for block */ + /* Allocates CRYPTO_MAX_BLOCK_SIZE Bytes for the block. */ uint32_t block[CY_CRYPTO_SHA256_BLOCK_SIZE / 4u]; - /* Allocate CRYPTO_MAX_HASH_SIZE Bytes for hash */ + /* Allocates CRYPTO_MAX_HASH_SIZE Bytes for the hash. */ uint32_t hash[CY_CRYPTO_SHA256_HASH_SIZE / 4u]; - /* Allocate CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMem */ + /* Allocates CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMem. */ uint32_t roundMem[CY_CRYPTO_SHA256_ROUND_MEM_SIZE / 4u]; } cy_stc_crypto_v1_sha256_buffers_t; typedef struct { - /* Allocate CRYPTO_MAX_BLOCK_SIZE Bytes for block */ + /* Allocates CRYPTO_MAX_BLOCK_SIZE Bytes for the block. */ uint32_t block[CY_CRYPTO_SHA512_BLOCK_SIZE / 4u]; - /* Allocate CRYPTO_MAX_HASH_SIZE Bytes for hash */ + /* Allocates CRYPTO_MAX_HASH_SIZE Bytes for the hash. */ uint32_t hash[CY_CRYPTO_SHA512_HASH_SIZE / 4u]; - /* Allocate CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMem */ + /* Allocates CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMem. */ uint32_t roundMem[CY_CRYPTO_SHA512_ROUND_MEM_SIZE / 4u]; } cy_stc_crypto_v1_sha512_buffers_t; diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v2.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v2.h index 720dd31d9d..11e842b0e0 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v2.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_sha_v2.h @@ -38,7 +38,7 @@ /** \cond INTERNAL */ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Init(CRYPTO_Type *base, - cy_stc_crypto_sha_state_t *shaHashState, + cy_stc_crypto_sha_state_t *hashState, cy_en_crypto_sha_mode_t mode, void *shaBuffers); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng.h index a9c234fd94..def797749e 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng.h @@ -42,15 +42,19 @@ typedef cy_en_crypto_status_t (*cy_crypto_trng_func_t)(CRYPTO_Type *base, uint32_t max, uint32_t *randomNum); +/** +* \addtogroup group_crypto_lld_rng_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Trng ****************************************************************************//** * -* Generates a True Random Number and returns it in the -* cfContext->trngNumPtr. +* Generates a True Random Number. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param GAROPol * The polynomial for the programmable Galois ring oscillator. @@ -59,13 +63,13 @@ typedef cy_en_crypto_status_t (*cy_crypto_trng_func_t)(CRYPTO_Type *base, * The polynomial for the programmable Fibonacci ring oscillator. * * \param max -* The maximum length of a random number, in the range [0, 32] bits. +* The maximum length of a random number, in the range of [0, 32] bits. * * \param randomNum * The pointer to a generated true random number. Must be 4-byte aligned. * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Trng(CRYPTO_Type *base, @@ -74,18 +78,19 @@ __STATIC_INLINE cy_en_crypto_status_t Cy_Crypto_Core_Trng(CRYPTO_Type *base, uint32_t max, uint32_t *randomNum) { - cy_en_crypto_status_t result; - if (cy_device->cryptoVersion == 1u) + cy_en_crypto_status_t tmpResult; + if (CY_CRYPTO_HW_V1) { - result = Cy_Crypto_Core_V1_Trng(base, GAROPol, FIROPol, max, randomNum); + tmpResult = Cy_Crypto_Core_V1_Trng(base, GAROPol, FIROPol, max, randomNum); } else { - result = Cy_Crypto_Core_V2_Trng(base, GAROPol, FIROPol, max, randomNum); + tmpResult = Cy_Crypto_Core_V2_Trng(base, GAROPol, FIROPol, max, randomNum); } - return (result); + return (tmpResult); } +/** \} group_crypto_lld_rng_functions */ #endif /* #if (CPUSS_CRYPTO_TR == 1) */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v1.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v1.h index 065c5672de..0eb516b9b3 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v1.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v1.h @@ -182,11 +182,11 @@ #define CY_CRYPTO_V1_TR_CUTOFF_COUNT8 (1UL) /** -Cut-off count (legal range is [1, 65535]). -"0": Illegal. -"1": 1 occurrence. -... -"65535": 65535 occurrences. +* Cut-off count (legal range is [1, 65535]). +* "0": Illegal. +* "1": 1 occurrence. +* ... +* "65535": 65535 occurrences. */ #define CY_CRYPTO_V1_TR_CUTOFF_COUNT16 (1UL) @@ -196,9 +196,9 @@ Cut-off count (legal range is [1, 65535]). * ... * "65535": 65536 bits. */ -#define CY_CRYPTO_V1_TR_WINDOW_SIZE (1uL) +#define CY_CRYPTO_V1_TR_WINDOW_SIZE (1UL) -/** the composed value for the TR_CTL0 register */ +/** The composed value for the TR_CTL0 register */ #define CY_CRYPTO_V1_TR_CTL0_VAL (_VAL2FLD(CRYPTO_TR_CTL0_SAMPLE_CLOCK_DIV, CY_CRYPTO_V1_TR_SAMPLE_CLOCK_DIV) | \ _VAL2FLD(CRYPTO_TR_CTL0_RED_CLOCK_DIV, CY_CRYPTO_V1_TR_RED_CLOCK_DIV) | \ _VAL2FLD(CRYPTO_TR_CTL0_INIT_DELAY, CY_CRYPTO_V1_TR_INIT_DELAY) | \ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v2.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v2.h index b193efdfbc..165b12aeb7 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v2.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_config_v2.h @@ -182,11 +182,11 @@ #define CY_CRYPTO_V2_TR_CUTOFF_COUNT8 (1UL) /** -Cut-off count (legal range is [1, 65535]). -"0": Illegal. -"1": 1 occurrence. -... -"65535": 65535 occurrences. +* Cut-off count (legal range is [1, 65535]). +* "0": Illegal. +* "1": 1 occurrence. +* ... +* "65535": 65535 occurrences. */ #define CY_CRYPTO_V2_TR_CUTOFF_COUNT16 (1UL) @@ -196,9 +196,9 @@ Cut-off count (legal range is [1, 65535]). * ... * "65535": 65536 bits. */ -#define CY_CRYPTO_V2_TR_WINDOW_SIZE (1uL) +#define CY_CRYPTO_V2_TR_WINDOW_SIZE (1UL) -/** the composed value for the TR_CTL0 register */ +/** The composed value for the TR_CTL0 register */ #define CY_CRYPTO_V2_TR_CTL0_VAL (_VAL2FLD(CRYPTO_TR_CTL0_SAMPLE_CLOCK_DIV, CY_CRYPTO_V2_TR_SAMPLE_CLOCK_DIV) | \ _VAL2FLD(CRYPTO_TR_CTL0_RED_CLOCK_DIV, CY_CRYPTO_V2_TR_RED_CLOCK_DIV) | \ _VAL2FLD(CRYPTO_TR_CTL0_INIT_DELAY, CY_CRYPTO_V2_TR_INIT_DELAY) | \ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_v1.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_v1.h index ad6b4b1a49..b4d79349ec 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_v1.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_trng_v1.h @@ -46,7 +46,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Trng(CRYPTO_Type *base, #endif /* CY_IP_MXCRYPTO */ -#endif /* #if !defined(CY_CRYPTO_CORE_TRNG_H) */ +#endif /* #if !defined(CY_CRYPTO_CORE_TRNG_V1_H) */ /* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_vu.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_vu.h index 27cbdd49e9..c0741a4a27 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_vu.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_core_vu.h @@ -41,17 +41,22 @@ #define CY_CRYPTO_VU_DATA_FLD_MASK (0x00003fffuL) #define CY_CRYPTO_VU_DATA_FLD_POS (16u) +/** +* \addtogroup group_crypto_lld_vu_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Cleanup ****************************************************************************//** * -* Cleanup the the CRYPTO block. +* Cleans up the Crypto block. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_Cleanup(CRYPTO_Type *base); @@ -60,10 +65,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_Cleanup(CRYPTO_Type *base); * Function Name: Cy_Crypto_Core_Vu_SetMemValue ****************************************************************************//** * -* Sets the value in the crypto memory allocated by destination VU register. +* Sets the value in the Crypto memory allocated by the destination VU register. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dstReg * The destination vector unit register. @@ -84,7 +89,7 @@ void Cy_Crypto_Core_Vu_SetMemValue(CRYPTO_Type *base, uint32_t dstReg, uint8_t c * Gets the value located in the crypto memory and pointed by source VU register. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dst * The pointer to the destination value. @@ -102,10 +107,10 @@ void Cy_Crypto_Core_Vu_GetMemValue(CRYPTO_Type *base, uint8_t *dst, uint32_t src * Function Name: Cy_Crypto_Core_Vu_IsRegZero ****************************************************************************//** * -* Returns TRUE if srcReg contains 0. FALSE otherwise. +* Returns TRUE if srcReg contains 0. FALSE - otherwise. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -120,10 +125,10 @@ bool Cy_Crypto_Core_Vu_IsRegZero(CRYPTO_Type *base, uint32_t srcReg); * Function Name: Cy_Crypto_Core_Vu_IsRegEqual ****************************************************************************//** * -* Returns TRUE if srcReg0 contains the same value as srcReg1. FALSE otherwise. +* Returns TRUE if srcReg0 contains the same value as srcReg1. FALSE - otherwise. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg0 * The source 0 vector unit register. @@ -142,10 +147,10 @@ bool Cy_Crypto_Core_Vu_IsRegEqual(CRYPTO_Type *base, uint32_t srcReg0, uint32_t ****************************************************************************//** * * Returns TRUE if srcReg0 contains the value less than value of srcReg1. -* FALSE otherwise. +* FALSE - otherwise. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg0 * The source 0 vector unit register. @@ -163,10 +168,10 @@ bool Cy_Crypto_Core_Vu_IsRegLess(CRYPTO_Type *base, uint32_t srcReg0, uint32_t s * Function Name: Cy_Crypto_Core_Vu_RegRead ****************************************************************************//** * -* Returns the data pointed in given register +* Returns the data pointed in a given register. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -185,7 +190,7 @@ __STATIC_INLINE uint32_t Cy_Crypto_Core_Vu_RegRead(CRYPTO_Type *base, uint32_t s * it is lower 12Bit of the 32Bit word * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -204,7 +209,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegSizeRead(CRYPTO_Type *base, uint32 * It is lower 12Bit of the 32Bit word * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -223,7 +228,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegBitSizeRead(CRYPTO_Type *base, uin * It is lower 12Bit of the 32Bit word * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -242,7 +247,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegByteSizeRead(CRYPTO_Type *base, ui * It is lower 12Bit of the 32Bit word * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -261,7 +266,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegWordSizeRead(CRYPTO_Type *base, ui * it is upper 16Bit of the 32Bir word. Pointer is in words (uint32_t). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -269,7 +274,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegWordSizeRead(CRYPTO_Type *base, ui *******************************************************************************/ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegDataPtrRead(CRYPTO_Type *base, uint32_t srcReg) { - return ((uint16_t)(_FLD2VAL(CRYPTO_RF_DATA_DATA32, REG_CRYPTO_VU_RF_DATA(base, srcReg)) >> CY_CRYPTO_VU_DATA_FLD_POS) + return (uint16_t)((_FLD2VAL(CRYPTO_RF_DATA_DATA32, REG_CRYPTO_VU_RF_DATA(base, srcReg)) >> CY_CRYPTO_VU_DATA_FLD_POS) & CY_CRYPTO_VU_DATA_FLD_MASK); } @@ -280,7 +285,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegDataPtrRead(CRYPTO_Type *base, uin * Returns the memory address of the data pointed in given register. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcReg * The source vector unit register. @@ -288,7 +293,7 @@ __STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegDataPtrRead(CRYPTO_Type *base, uin *******************************************************************************/ __STATIC_INLINE uint32_t * Cy_Crypto_Core_Vu_RegMemPointer(CRYPTO_Type *base, uint32_t srcReg) { - return (uint32_t *)((uint32_t)REG_CRYPTO_MEM_BUFF(base) + 4u * (uint32_t)Cy_Crypto_Core_Vu_RegDataPtrRead(base, srcReg)); + return (uint32_t *)((uint32_t)REG_CRYPTO_MEM_BUFF(base) + (4u * (uint32_t)Cy_Crypto_Core_Vu_RegDataPtrRead(base, srcReg))); } /******************************************************************************* @@ -298,13 +303,13 @@ __STATIC_INLINE uint32_t * Cy_Crypto_Core_Vu_RegMemPointer(CRYPTO_Type *base, ui * Waits until VU instruction will be completed * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ __STATIC_INLINE void Cy_Crypto_Core_Vu_WaitForComplete(CRYPTO_Type *base) { /* Wait until the VU instruction is complete */ - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { while (0uL != _FLD2VAL(CRYPTO_STATUS_VU_BUSY, REG_CRYPTO_STATUS(base))) { @@ -322,19 +327,20 @@ __STATIC_INLINE void Cy_Crypto_Core_Vu_WaitForComplete(CRYPTO_Type *base) * Function Name: Cy_Crypto_Core_Vu_StatusRead ****************************************************************************//** * -* Returns value of the VU status register +* Returns the value of the VU status register. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ -__STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_StatusRead(CRYPTO_Type *base) +__STATIC_INLINE uint32_t Cy_Crypto_Core_Vu_StatusRead(CRYPTO_Type *base) { Cy_Crypto_Core_Vu_WaitForComplete(base); - return((uint16_t)REG_CRYPTO_VU_STATUS(base)); + return((uint32_t)REG_CRYPTO_VU_STATUS(base)); } +/** \} group_crypto_lld_vu_functions */ #endif /* #if (CPUSS_CRYPTO_VU == 1) */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_server.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_server.h index f25efba8d4..99d9ce5996 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_server.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_crypto_server.h @@ -63,7 +63,7 @@ extern "C" { * the Crypto server context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \funcusage * \snippet crypto/2.10/snippet/main.c snippet_myCryptoServerStartBase @@ -94,7 +94,7 @@ cy_en_crypto_status_t Cy_Crypto_Server_Start_Base(cy_stc_crypto_config_t const * * the Crypto server context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * Refer to \ref Cy_Crypto_Server_Start_Base for the function usage example. * @@ -124,7 +124,7 @@ cy_en_crypto_status_t Cy_Crypto_Server_Start_Extra(cy_stc_crypto_config_t const * the Crypto server context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * Refer to \ref Cy_Crypto_Server_Start_Base for the function usage example. * @@ -142,7 +142,7 @@ cy_en_crypto_status_t Cy_Crypto_Server_Start_Full(cy_stc_crypto_config_t const * * This function available for Server side only. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Server_Stop(void); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_device.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_device.h index 44ecd5499e..f60560f49c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_device.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_device.h @@ -189,6 +189,8 @@ void Cy_PDL_Init(const cy_stc_device_t * device); * Register Access Helper Macros *******************************************************************************/ +#define CY_CRYPTO_HW_V1 (1U == cy_device->cryptoVersion) /* true if the mxcrypto version is 1 */ + #define CY_SRSS_NUM_CLKPATH ((uint32_t)(cy_device->srssNumClkpath)) #define CY_SRSS_NUM_PLL ((uint32_t)(cy_device->srssNumPll)) #define CY_SRSS_NUM_HFROOT ((uint32_t)(cy_device->srssNumHfroot)) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_pdl.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_pdl.h index 5c1a7f182a..3ed8b87027 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_pdl.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_pdl.h @@ -36,6 +36,7 @@ #include "cy_ctb.h" #include "cy_ctdac.h" #include "cy_dma.h" +#include "cy_dmac.h" #include "cy_efuse.h" #include "cy_flash.h" #include "cy_gpio.h" @@ -55,8 +56,10 @@ #include "cy_scb_i2c.h" #include "cy_scb_spi.h" #include "cy_scb_uart.h" +#include "cy_sd_host.h" #include "cy_smartio.h" #include "cy_smif.h" +#include "cy_smif_memslot.h" #include "cy_sysanalog.h" #include "cy_sysclk.h" #include "cy_sysint.h" diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_sysclk.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_sysclk.h index f2811c245e..3c71b78aab 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_sysclk.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/include/cy_sysclk.h @@ -112,6 +112,7 @@ * Updated the following functions implementation: \ref Cy_SysClk_EcoEnable, \ref Cy_SysClk_EcoGetStatus, \ref Cy_SysClk_FllGetConfiguration \n * and \ref Cy_SysClk_DeepSleepCallback. \n * The \ref Cy_SysClk_DeepSleepCallback now implements all four SysPm callback modes \ref cy_en_syspm_callback_mode_t. \n +* The actions that were done in \ref CY_SYSPM_CHECK_READY case are moved to \ref CY_SYSPM_BEFORE_TRANSITION. \n * So the \ref cy_stc_syspm_callback_t::skipMode must be set to 0UL. * Defect fixing. * diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_ble_clk.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_ble_clk.c index e14ba10b10..cd2e3a1f8a 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_ble_clk.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_ble_clk.c @@ -1,6 +1,6 @@ /***************************************************************************//** * \file cy_ble_clk.c -* \version 3.0 +* \version 3.10 * * \brief * This driver provides the source code for API BLE ECO clock. @@ -138,8 +138,8 @@ static cy_en_ble_eco_status_t Cy_BLE_HAL_MxdRadioEnableClocks(cy_en_ble_eco_freq /* Range for inputs parameters */ -#define CY_BLE_ECO_XTAL_SRART_UP_TIME_MAX ((uint8_t) (4593.75 / 31.25)) -#define CY_BLE_ECO_XTAL_SRART_UP_TIME_MIN ((uint8_t) (400 / 31.25)) +#define CY_BLE_ECO_XTAL_START_UP_TIME_MAX ((uint8_t) (4593.75 / 31.25)) +#define CY_BLE_ECO_XTAL_START_UP_TIME_MIN ((uint8_t) (400 / 31.25)) #define CY_BLE_ECO_CLOAD_MIN ((uint8_t) ((7.5 - 7.5)/0.075)) #define CY_BLE_ECO_CLOAD_MAX ((uint8_t) ((26.325 - 7.5)/0.075)) @@ -220,7 +220,7 @@ cy_en_ble_eco_status_t Cy_BLE_EcoConfigure(cy_en_ble_eco_freq_t freq, cy_en_ble_ uint32_t temp = 0UL; if( (freq > CY_BLE_BLESS_ECO_FREQ_32MHZ) || (sysClkDiv > CY_BLE_SYS_ECO_CLK_DIV_8) || - (xtalStartUpTime > CY_BLE_ECO_XTAL_SRART_UP_TIME_MAX) || (xtalStartUpTime < CY_BLE_ECO_XTAL_SRART_UP_TIME_MIN) || + (xtalStartUpTime > CY_BLE_ECO_XTAL_START_UP_TIME_MAX) || (xtalStartUpTime < CY_BLE_ECO_XTAL_START_UP_TIME_MIN) || (cLoad > CY_BLE_ECO_CLOAD_MAX)) { status = CY_BLE_ECO_BAD_PARAM; @@ -355,7 +355,7 @@ cy_en_ble_eco_status_t Cy_BLE_EcoConfigure(cy_en_ble_eco_freq_t freq, cy_en_ble_ /* Clear the BLERD_ACTIVE_INTR */ BLE_BLESS_INTR_STAT |= BLE_BLESS_INTR_STAT_BLERD_ACTIVE_INTR_Msk; - if(!Cy_SysPm_SimoBuckOutputIsEnabled(CY_SYSPM_BUCK_VRF)) + if((!Cy_SysPm_SimoBuckOutputIsEnabled(CY_SYSPM_BUCK_VRF)) || (voltageReg == CY_BLE_ECO_VOLTAGE_REG_BLESSLDO)) { temp |= BLE_BLESS_MT_CFG_ACT_LDO_NOT_BUCK_Msk; } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto.c index 0fd3c1604a..66bd2e6184 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto.c @@ -171,7 +171,7 @@ cy_en_crypto_status_t Cy_Crypto_Sync(bool isBlocking) * This function is internal and should not to be called directly by user software. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ static cy_en_crypto_status_t Cy_Crypto_Client_Send(void) @@ -309,7 +309,7 @@ cy_en_crypto_status_t Cy_Crypto_Enable(void) * The pointer to a variable to store gathered crypto library information. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_GetLibraryInfo(cy_en_crypto_lib_info_t *cryptoInfo) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v1.c index 4f3e3c082e..f7a67e20b5 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v1.c @@ -44,10 +44,11 @@ static void Cy_Crypto_Core_V1_Aes_InvKey(CRYPTO_Type *base, cy_stc_crypto_aes_st * Performs the AES block cipher. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \param dirMode * One of CRYPTO_ENCRYPT or CRYPTO_DECRYPT. @@ -90,10 +91,11 @@ void Cy_Crypto_Core_V1_Aes_ProcessBlock(CRYPTO_Type *base, * All addresses must be 4-Byte aligned! * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \param dstBlock * The pointer to the memory structure with the XOR results. @@ -136,10 +138,11 @@ void Cy_Crypto_Core_V1_Aes_Xor(CRYPTO_Type *base, * Calculates an inverse block cipher key from the block cipher key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * *******************************************************************************/ static void Cy_Crypto_Core_V1_Aes_InvKey(CRYPTO_Type *base, cy_stc_crypto_aes_state_t const *aesState) @@ -162,10 +165,10 @@ static void Cy_Crypto_Core_V1_Aes_InvKey(CRYPTO_Type *base, cy_stc_crypto_aes_st * Function Name: Cy_Crypto_Core_V1_Aes_Init ****************************************************************************//** * -* Sets Aes mode and prepare inversed key. +* Sets AES mode and prepares an inverse key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param key * The pointer to the encryption/decryption key. @@ -174,10 +177,11 @@ static void Cy_Crypto_Core_V1_Aes_InvKey(CRYPTO_Type *base, cy_stc_crypto_aes_st * \ref cy_en_crypto_aes_key_length_t * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Init(CRYPTO_Type *base, @@ -212,10 +216,10 @@ void Cy_Crypto_Core_V1_Aes_Free(CRYPTO_Type *base) * Function Name: Cy_Crypto_Core_V1_Aes_Ecb ****************************************************************************//** * -* Performs AES operation on one Block. +* Performs an AES operation on one block. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -228,10 +232,11 @@ void Cy_Crypto_Core_V1_Aes_Free(CRYPTO_Type *base) * The pointer to a source block. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Ecb(CRYPTO_Type *base, @@ -258,7 +263,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Ecb(CRYPTO_Type *base, * Performs AES operation on a plain text with Cipher Block Chaining (CBC). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -277,10 +282,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Ecb(CRYPTO_Type *base, * The pointer to a source plain text. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cbc(CRYPTO_Type *base, @@ -298,17 +304,17 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cbc(CRYPTO_Type *base, uint32_t *srcBuff = (uint32_t*)(&aesBuffers->block0); uint32_t *dstBuff = (uint32_t*)(&aesBuffers->block1); - cy_en_crypto_status_t myResult = CY_CRYPTO_SIZE_NOT_X16; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SIZE_NOT_X16; /* Check whether the data size is multiple of CY_CRYPTO_AES_BLOCK_SIZE */ - if (0uL == (uint32_t)(size & (CY_CRYPTO_AES_BLOCK_SIZE - 1u))) + if (0UL == (uint32_t)(size & (CY_CRYPTO_AES_BLOCK_SIZE - 1U))) { /* Copy the Initialization Vector to the local buffer because it changes during calculation */ Cy_Crypto_Core_V1_MemCpy(base, tempBuff, ivPtr, CY_CRYPTO_AES_BLOCK_SIZE); if (CY_CRYPTO_DECRYPT == dirMode) { - while (size > 0uL) + while (size != 0UL) { /* source message block */ Cy_Crypto_Core_V1_MemCpy(base, srcBuff, src, CY_CRYPTO_AES_BLOCK_SIZE); @@ -329,7 +335,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cbc(CRYPTO_Type *base, } else { - while (size > 0uL) + while (size != 0UL) { /* source message block */ Cy_Crypto_Core_V1_MemCpy(base, srcBuff, src, CY_CRYPTO_AES_BLOCK_SIZE); @@ -349,10 +355,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cbc(CRYPTO_Type *base, } } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -362,7 +368,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cbc(CRYPTO_Type *base, * Performs AES operation on a plain text with the Cipher Feedback Block method (CFB). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -381,10 +387,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cbc(CRYPTO_Type *base, * The pointer to a source plain text. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user must +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cfb(CRYPTO_Type *base, @@ -396,7 +403,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cfb(CRYPTO_Type *base, cy_stc_crypto_aes_state_t *aesState) { uint32_t size = srcSize; - cy_en_crypto_status_t myResult = CY_CRYPTO_SIZE_NOT_X16; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SIZE_NOT_X16; cy_stc_crypto_aes_buffers_t *aesBuffers = (cy_stc_crypto_aes_buffers_t*)aesState->buffers; @@ -406,17 +413,17 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cfb(CRYPTO_Type *base, uint32_t *encBuff = dstBuff; /* Default operation is ENCRYPT */ /* Check whether the data size is multiple of CY_CRYPTO_AES_BLOCK_SIZE */ - if (0uL == (size & (CY_CRYPTO_AES_BLOCK_SIZE - 1u))) + if (0UL == (size & (CY_CRYPTO_AES_BLOCK_SIZE - 1U))) { if (CY_CRYPTO_DECRYPT == dirMode) { encBuff = srcBuff; } - /* Copy the Initialization Vector to local encode buffer */ + /* Copies the Initialization Vector to the local encode buffer. */ Cy_Crypto_Core_V1_MemCpy(base, encBuff, ivPtr, CY_CRYPTO_AES_BLOCK_SIZE); - while (size > 0uL) + while (size != 0UL) { /* In this mode, (CFB) is always an encryption! */ Cy_Crypto_Core_V1_Aes_ProcessBlock(base, aesState, CY_CRYPTO_ENCRYPT, dstBuff, encBuff); @@ -435,20 +442,20 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cfb(CRYPTO_Type *base, size -= CY_CRYPTO_AES_BLOCK_SIZE; } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } - return (myResult); + return (tmpResult); } /******************************************************************************* * Function Name: Cy_Crypto_Core_V1_Aes_Ctr ******************************************************************************** * -* Performs AES operation on a plain text using the counter method (CTR). +* Performs an AES operation on a plain text using the counter method (CTR). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcSize * The size of a source plain text. @@ -458,7 +465,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cfb(CRYPTO_Type *base, * current cipher stream. * * \param ivPtr -* The 128-bit nonce and counter. +* The 128-bit initial vector and counter. * * \param streamBlock * The saved stream-block for resuming. Is over-written by the function. @@ -470,13 +477,14 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Cfb(CRYPTO_Type *base, * The pointer to a source plain text. Must be 4-Byte aligned. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user must +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ -#define CY_CRYPTO_AES_CTR_CNT_POS (0x02u) +#define CY_CRYPTO_AES_CTR_CNT_POS (0x02U) cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Ctr(CRYPTO_Type *base, uint32_t srcSize, uint32_t *srcOffset, @@ -491,28 +499,28 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Ctr(CRYPTO_Type *base, uint64_t counter; cy_stc_crypto_aes_buffers_t *aesBuffers = (cy_stc_crypto_aes_buffers_t*)aesState->buffers; - uint32_t *nonceCounter = (uint32_t*)(&aesBuffers->iv); + uint32_t *blockCounter = (uint32_t*)(&aesBuffers->iv); uint32_t *srcBuff = (uint32_t*)(&aesBuffers->block0); uint32_t *dstBuff = (uint32_t*)(&aesBuffers->block1); uint32_t *streamBuff = (uint32_t*)(&aesBuffers->block2); - Cy_Crypto_Core_V1_MemCpy(base, nonceCounter, ivPtr, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_V1_MemCpy(base, blockCounter, ivPtr, CY_CRYPTO_AES_BLOCK_SIZE); - counter = CY_SWAP_ENDIAN64(*(uint64_t*)(nonceCounter + CY_CRYPTO_AES_CTR_CNT_POS)); + counter = CY_SWAP_ENDIAN64(*(uint64_t*)(blockCounter + CY_CRYPTO_AES_CTR_CNT_POS)); cnt = (uint32_t)(srcSize / CY_CRYPTO_AES_BLOCK_SIZE); - for (i = 0uL; i < cnt; i++) + for (i = 0UL; i < cnt; i++) { /* source message block */ Cy_Crypto_Core_V1_MemCpy(base, srcBuff, src, CY_CRYPTO_AES_BLOCK_SIZE); /* In this mode, (CTR) is always an encryption! */ - Cy_Crypto_Core_V1_Aes_ProcessBlock(base, aesState, CY_CRYPTO_ENCRYPT, streamBuff, nonceCounter); + Cy_Crypto_Core_V1_Aes_ProcessBlock(base, aesState, CY_CRYPTO_ENCRYPT, streamBuff, blockCounter); - /* Increment the nonce counter, at least 64Bits (from 128) is the counter part */ + /* Increment the block counter, at least 64Bits (from 128) is the counter part */ counter++; - *(uint64_t*)(nonceCounter + CY_CRYPTO_AES_CTR_CNT_POS) = CY_SWAP_ENDIAN64(counter); + *(uint64_t*)(blockCounter + CY_CRYPTO_AES_CTR_CNT_POS) = CY_SWAP_ENDIAN64(counter); Cy_Crypto_Core_V1_Aes_Xor(base, aesState, dstBuff, srcBuff, streamBuff); @@ -523,7 +531,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Aes_Ctr(CRYPTO_Type *base, dst += CY_CRYPTO_AES_BLOCK_SIZE; } - Cy_Crypto_Core_V1_MemCpy(base, ivPtr, nonceCounter, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_V1_MemCpy(base, ivPtr, blockCounter, CY_CRYPTO_AES_BLOCK_SIZE); /* Save the reminder of the last non-complete block */ *srcOffset = (uint32_t)(srcSize % CY_CRYPTO_AES_BLOCK_SIZE); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v2.c index 54015cc8a8..173e232774 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_aes_v2.c @@ -45,10 +45,11 @@ * Calculates an inverse block cipher key from the block cipher key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * *******************************************************************************/ void Cy_Crypto_Core_V2_Aes_LoadEncKey(CRYPTO_Type *base, @@ -77,10 +78,11 @@ void Cy_Crypto_Core_V2_Aes_LoadEncKey(CRYPTO_Type *base, * Calculates an inverse block cipher key from the block cipher key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * *******************************************************************************/ void Cy_Crypto_Core_V2_Aes_LoadDecKey(CRYPTO_Type *base, @@ -109,10 +111,10 @@ void Cy_Crypto_Core_V2_Aes_LoadDecKey(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V2_Aes_Init ****************************************************************************//** * -* Sets Aes mode and prepare inversed key. +* Sets AES mode and prepares inverse key. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param key * The pointer to the encryption/decryption key. @@ -121,10 +123,11 @@ void Cy_Crypto_Core_V2_Aes_LoadDecKey(CRYPTO_Type *base, * \ref cy_en_crypto_aes_key_length_t * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Init(CRYPTO_Type *base, @@ -150,10 +153,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Init(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V2_Aes_Ecb ****************************************************************************//** * -* Performs AES operation on one Block. +* Performs an AES operation on one block. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -166,10 +169,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Init(CRYPTO_Type *base, * The pointer to a source block. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Ecb(CRYPTO_Type *base, @@ -202,7 +206,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Ecb(CRYPTO_Type *base, * Performs AES operation on a plain text with Cipher Block Chaining (CBC). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -221,10 +225,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Ecb(CRYPTO_Type *base, * The pointer to a source plain text. Must be 4-Byte aligned. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, @@ -236,10 +241,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, cy_stc_crypto_aes_state_t *aesState) { uint32_t size = srcSize; - cy_en_crypto_status_t myResult = CY_CRYPTO_SIZE_NOT_X16; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SIZE_NOT_X16; /* Check whether the data size is multiple of CY_CRYPTO_AES_BLOCK_SIZE */ - if (0uL == (uint32_t)(srcSize & (uint32_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1u))) + if (0UL == (uint32_t)(srcSize & (uint32_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1U))) { (CY_CRYPTO_ENCRYPT == dirMode) ? \ @@ -254,7 +259,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, { Cy_Crypto_Core_V2_BlockMov(base, CY_CRYPTO_V2_RB_BLOCK1, CY_CRYPTO_V2_RB_FF_LOAD1, CY_CRYPTO_AES_BLOCK_SIZE); - while (size != 0u) + while (size != 0U) { Cy_Crypto_Core_V2_BlockXor(base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_V2_RB_BLOCK1, CY_CRYPTO_AES_BLOCK_SIZE); @@ -268,7 +273,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, { Cy_Crypto_Core_V2_BlockMov(base, CY_CRYPTO_V2_RB_BLOCK2, CY_CRYPTO_V2_RB_FF_LOAD1, CY_CRYPTO_AES_BLOCK_SIZE); - while (size != 0u) + while (size != 0U) { Cy_Crypto_Core_V2_BlockMov(base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_AES_BLOCK_SIZE); Cy_Crypto_Core_V2_RunAesInv(base); @@ -280,12 +285,12 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, } } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } Cy_Crypto_Core_WaitForReady(base); - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -295,7 +300,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, * Performs AES operation on a plain text with the Cipher Feedback Block method (CFB). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -314,10 +319,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cbc(CRYPTO_Type *base, * The pointer to a source plain text. Must be 4-Byte aligned. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, @@ -330,10 +336,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, { uint32_t size = srcSize; - cy_en_crypto_status_t myResult = CY_CRYPTO_SIZE_NOT_X16; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SIZE_NOT_X16; /* Check whether the data size is multiple of CY_CRYPTO_AES_BLOCK_SIZE */ - if (0uL == (uint32_t)(size & (uint32_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1u))) + if (0UL == (uint32_t)(size & (uint32_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1U))) { Cy_Crypto_Core_V2_Aes_LoadEncKey(base, aesState); @@ -345,7 +351,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, if (CY_CRYPTO_ENCRYPT == dirMode) { - while (size != 0u) + while (size != 0U) { Cy_Crypto_Core_V2_RunAes(base); Cy_Crypto_Core_V2_BlockXor(base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_FF_LOAD0, @@ -357,7 +363,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, } else { - while (size != 0u) + while (size != 0U) { Cy_Crypto_Core_V2_RunAes(base); Cy_Crypto_Core_V2_BlockMov(base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_AES_BLOCK_SIZE); @@ -368,12 +374,12 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, } } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } Cy_Crypto_Core_WaitForReady(base); - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -383,7 +389,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, * Performs AES operation on a plain text using the counter method (CTR). * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param srcSize * The size of a source plain text. @@ -405,13 +411,14 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Cfb(CRYPTO_Type *base, * The pointer to a source plain text. Must be 4-Byte aligned. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ -#define CY_CRYPTO_AES_CTR_CNT_POS (2u) +#define CY_CRYPTO_AES_CTR_CNT_POS (2U) cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Ctr(CRYPTO_Type *base, uint32_t srcSize, uint32_t *srcOffset, @@ -421,28 +428,28 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Ctr(CRYPTO_Type *base, uint8_t const *src, cy_stc_crypto_aes_state_t *aesState) { - uint32_t nonceCounter[4]; + uint32_t blockCounter[4]; uint64_t counter; uint32_t cnt; uint32_t i; - nonceCounter[ 0] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[ 3], ivPtr[ 2], ivPtr[ 1], ivPtr[0]); - nonceCounter[ 1] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[ 7], ivPtr[ 6], ivPtr[ 5], ivPtr[4]); - nonceCounter[ 2] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[11], ivPtr[10], ivPtr[ 9], ivPtr[8]); - nonceCounter[ 3] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[15], ivPtr[14], ivPtr[13], ivPtr[12]); + blockCounter[ 0] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[ 3], ivPtr[ 2], ivPtr[ 1], ivPtr[0]); + blockCounter[ 1] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[ 7], ivPtr[ 6], ivPtr[ 5], ivPtr[4]); + blockCounter[ 2] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[11], ivPtr[10], ivPtr[ 9], ivPtr[8]); + blockCounter[ 3] = (uint32_t) CY_CRYPTO_MERGE_BYTES(ivPtr[15], ivPtr[14], ivPtr[13], ivPtr[12]); - counter = CY_SWAP_ENDIAN64(*(uint64_t*)(nonceCounter + CY_CRYPTO_AES_CTR_CNT_POS)); + counter = CY_SWAP_ENDIAN64(*(uint64_t*)(blockCounter + CY_CRYPTO_AES_CTR_CNT_POS)); Cy_Crypto_Core_V2_Aes_LoadEncKey(base, aesState); - Cy_Crypto_Core_V2_FFContinue(base, CY_CRYPTO_V2_RB_FF_LOAD1, (const uint8_t *) &nonceCounter, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_V2_FFContinue(base, CY_CRYPTO_V2_RB_FF_LOAD1, (const uint8_t *) &blockCounter, CY_CRYPTO_AES_BLOCK_SIZE); Cy_Crypto_Core_V2_BlockMov (base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_FF_LOAD1, CY_CRYPTO_AES_BLOCK_SIZE); /* CTR counter is placed into last 4 bytes of the Nonce block */ - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 4u, (uint8_t)((counter >> 24u) & 0xffu)); - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 3u, (uint8_t)((counter >> 16u) & 0xffu)); - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 2u, (uint8_t)((counter >> 8u) & 0xffu)); - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 1u, (uint8_t)((counter) & 0xffu)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 4U, (uint8_t)((counter >> 24U) & 0xffU)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 3U, (uint8_t)((counter >> 16U) & 0xffU)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 2U, (uint8_t)((counter >> 8U) & 0xffU)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 1U, (uint8_t)((counter) & 0xffU)); Cy_Crypto_Core_V2_RunAes(base); @@ -457,19 +464,19 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Aes_Ctr(CRYPTO_Type *base, /* Increment the nonce counter */ counter++; - *(uint64_t*)(nonceCounter + CY_CRYPTO_AES_CTR_CNT_POS) = CY_SWAP_ENDIAN64(counter); + *(uint64_t*)(blockCounter + CY_CRYPTO_AES_CTR_CNT_POS) = CY_SWAP_ENDIAN64(counter); /* CTR counter is placed into last 4 bytes of the Nonce block */ - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 4u, (uint8_t)((counter >> 24u) & 0xffu)); - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 3u, (uint8_t)((counter >> 16u) & 0xffu)); - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 2u, (uint8_t)((counter >> 8u) & 0xffu)); - Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 1u, (uint8_t)((counter) & 0xffu)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 4U, (uint8_t)((counter >> 24u) & 0xffU)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 3U, (uint8_t)((counter >> 16u) & 0xffU)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 2U, (uint8_t)((counter >> 8u) & 0xffU)); + Cy_Crypto_Core_V2_RBSetByte(base, CY_CRYPTO_AES_BLOCK_SIZE - 1U, (uint8_t)((counter) & 0xffU)); Cy_Crypto_Core_V2_RBXor (base, CY_CRYPTO_AES_BLOCK_SIZE, CY_CRYPTO_AES_BLOCK_SIZE); Cy_Crypto_Core_V2_RBStore(base, CY_CRYPTO_AES_BLOCK_SIZE, CY_CRYPTO_AES_BLOCK_SIZE); } - Cy_Crypto_Core_V2_MemCpy(base, ivPtr, nonceCounter, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_V2_MemCpy(base, ivPtr, blockCounter, CY_CRYPTO_AES_BLOCK_SIZE); /* Save the reminder of the last non-complete block */ *srcOffset = (uint32_t)(srcSize % CY_CRYPTO_AES_BLOCK_SIZE); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v1.c index 2a6f130c3a..59d73f6317 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v1.c @@ -56,20 +56,20 @@ static void Cy_Crypto_Core_V1_Cmac_CalcSubKey(uint8_t *srcDstPtr) { int32_t i; uint32_t c; - uint32_t msb = 0uL; + uint32_t msb = 0UL; - for (i = (int32_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1); i >= 0; i--) + for (i = (int32_t)((int32_t)CY_CRYPTO_AES_BLOCK_SIZE - 1); i >= 0; i--) { c = (uint32_t)srcDstPtr[i]; - c = (c << 1u) | msb; + c = (c << 1U) | msb; srcDstPtr[i] = (uint8_t) c; - msb = (c >> 8u) & 1uL; + msb = (c >> 8U) & 1UL; } - if (0uL != msb) + if (0UL != msb) { /* Just one byte is valuable, the rest are zeros */ - srcDstPtr[(uint8_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1u)] ^= CY_CRYPTO_CMAC_RB; + srcDstPtr[(uint8_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1U)] ^= CY_CRYPTO_CMAC_RB; } } @@ -110,13 +110,13 @@ void Cy_Crypto_Core_V1_Cmac_Init(cy_stc_crypto_v1_cmac_state_t* cmacState, * Starts CMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState * The pointer to the structure which stores the AES context. * * \param cmacState -* the pointer to the structure which stores the CMAC context. +* The pointer to the structure which stores the CMAC context. * *******************************************************************************/ void Cy_Crypto_Core_V1_Cmac_Start(CRYPTO_Type *base, @@ -127,7 +127,7 @@ void Cy_Crypto_Core_V1_Cmac_Start(CRYPTO_Type *base, uint32_t *tempTmp = cmacState->temp; /* Calculate the K1 sub-key */ - Cy_Crypto_Core_V1_MemSet(base, (void*)tempTmp, 0u, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_V1_MemSet(base, (void*)tempTmp, 0U, CY_CRYPTO_AES_BLOCK_SIZE); Cy_Crypto_Core_V1_Aes_ProcessBlock(base, aesState, CY_CRYPTO_ENCRYPT, kTmp, tempTmp); @@ -141,7 +141,7 @@ void Cy_Crypto_Core_V1_Cmac_Start(CRYPTO_Type *base, * Calculates CMAC on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState * The pointer to the structure which stores the AES context. @@ -166,7 +166,7 @@ void Cy_Crypto_Core_V1_Cmac_Update(CRYPTO_Type *base, uint32_t *tempBuff = cmacState->temp; /* Clear the argument for XOR for the first block */ - Cy_Crypto_Core_V1_MemSet(base, (void* )tempBuff, 0x00u, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_V1_MemSet(base, (void* )tempBuff, 0x00U, CY_CRYPTO_AES_BLOCK_SIZE); /* Process all blocks except last */ while (messageSize > CY_CRYPTO_AES_BLOCK_SIZE) @@ -197,7 +197,7 @@ void Cy_Crypto_Core_V1_Cmac_Update(CRYPTO_Type *base, * Completes CMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param aesState * the pointer to the structure which stores the AES context. @@ -226,11 +226,11 @@ void Cy_Crypto_Core_V1_Cmac_Finish(CRYPTO_Type *base, Cy_Crypto_Core_V1_Cmac_CalcSubKey((uint8_t* )kPtrTmp); /* Appended '1' bit to the end of message, followed by '0' */ - *((uint8_t* )blockBuff + blockIdxTmp) = 0x80u; + *((uint8_t* )blockBuff + blockIdxTmp) = 0x80U; /* Write zeros into the rest of the message */ copySize = CY_CRYPTO_AES_BLOCK_SIZE - 1u - blockIdxTmp; - Cy_Crypto_Core_V1_MemSet(base, ((uint8_t* )blockBuff + blockIdxTmp + 1), 0x00u, (uint16_t)copySize); + Cy_Crypto_Core_V1_MemSet(base, ((uint8_t* )blockBuff + blockIdxTmp + 1), 0x00U, (uint16_t)copySize); } Cy_Crypto_Core_V1_Aes_Xor(base, aesState, blockBuff, blockBuff, tempBuff); @@ -250,7 +250,7 @@ void Cy_Crypto_Core_V1_Cmac_Finish(CRYPTO_Type *base, * on a message to produce message authentication code using AES. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param message * The pointer to a source plain text. Must be 4-byte aligned. @@ -268,10 +268,11 @@ void Cy_Crypto_Core_V1_Cmac_Finish(CRYPTO_Type *base, * The pointer to the calculated CMAC. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Cmac(CRYPTO_Type *base, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v2.c index e144b20dce..cd10dde848 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_cmac_v2.c @@ -66,20 +66,20 @@ static void Cy_Crypto_Core_V2_Cmac_CalcSubKey(uint8_t *srcDstPtr) { int32_t i; uint32_t c; - uint32_t msb = 0uL; + uint32_t msb = 0UL; - for (i = (int32_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1); i >= 0; i--) + for (i = (int32_t)((int32_t)CY_CRYPTO_AES_BLOCK_SIZE - 1); i >= 0; i--) { c = (uint32_t)srcDstPtr[i]; - c = (c << 1u) | msb; + c = (c << 1U) | msb; srcDstPtr[i] = (uint8_t) c; - msb = (c >> 8u) & 1uL; + msb = (c >> 8U) & 1UL; } - if (0uL != msb) + if (0UL != msb) { /* Just one byte is valuable, the rest are zeros */ - srcDstPtr[(uint8_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1u)] ^= CY_CRYPTO_CMAC_RB; + srcDstPtr[(uint8_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1U)] ^= CY_CRYPTO_CMAC_RB; } } @@ -105,7 +105,7 @@ void Cy_Crypto_Core_V2_Cmac_Init(cy_stc_crypto_v2_cmac_state_t* cmacState, uint8 * Starts CMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param cmacState * the pointer to the structure which stores the CMAC context. @@ -114,7 +114,7 @@ void Cy_Crypto_Core_V2_Cmac_Init(cy_stc_crypto_v2_cmac_state_t* cmacState, uint8 void Cy_Crypto_Core_V2_Cmac_Start(CRYPTO_Type *base, cy_stc_crypto_v2_cmac_state_t *cmacState) { - cmacState->block_idx = 0u; + cmacState->block_idx = 0U; /* Calculate the K1 sub-key */ Cy_Crypto_Core_V2_BlockXor(base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_BLOCK0, @@ -137,7 +137,7 @@ void Cy_Crypto_Core_V2_Cmac_Start(CRYPTO_Type *base, * Calculates CMAC on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param cmacState * The pointer to the structure which stores the CMAC context. @@ -177,7 +177,7 @@ void Cy_Crypto_Core_V2_Cmac_Update(CRYPTO_Type *base, * Completes CMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param cmacState * The pointer to the structure which stores the CMAC context. @@ -226,7 +226,7 @@ void Cy_Crypto_Core_V2_Cmac_Finish(CRYPTO_Type *base, * on a message to produce message authentication code using AES. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param message * The pointer to a source plain text. Must be 4-byte aligned. @@ -244,10 +244,11 @@ void Cy_Crypto_Core_V2_Cmac_Finish(CRYPTO_Type *base, * The pointer to the calculated CMAC. * * \param aesState -* The pointer to the aesState structure which stores the AES context. +* The pointer to the AES state structure allocated by the user. The user +* must not modify anything in this structure. * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Cmac(CRYPTO_Type *base, @@ -259,7 +260,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Cmac(CRYPTO_Type *base, cy_stc_crypto_aes_state_t *aesState) { /* Allocate space for the structure which stores the CMAC context */ - cy_stc_crypto_v2_cmac_buffers_t cmacBuffersData; + cy_stc_crypto_v2_cmac_buffers_t cmacBuffersData = { 0 }; cy_stc_crypto_v2_cmac_buffers_t *cmacBuffers = &cmacBuffersData; uint8_t *myK = cmacBuffers->k; diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v1.c index eba47c10fb..b661fd2f4b 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v1.c @@ -41,7 +41,7 @@ * Initializes CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param polynomial * The polynomial (specified using 32 bits) used in the computing CRC. @@ -59,7 +59,7 @@ * Specifies a mask with which the LFSR32 register is XORed to produce a remainder. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_Init(CRYPTO_Type *base, @@ -85,7 +85,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_Init(CRYPTO_Type *base, * (this bit is always assumed '1'). */ REG_CRYPTO_CRC_POL_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_POL_CTL_POLYNOMIAL, polynomial)); - /*Specifies a mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. + /* Specifies a mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. * The XOR is performed before remainder reversal. */ REG_CRYPTO_CRC_REM_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_REM_CTL_REM_XOR, remXor)); @@ -99,7 +99,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_Init(CRYPTO_Type *base, * Performs CRC calculation on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param crc * The pointer to a computed CRC value. Must be 4-byte aligned. @@ -114,7 +114,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_Init(CRYPTO_Type *base, * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc(CRYPTO_Type *base, @@ -148,10 +148,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V1_Crc_CalcInit ****************************************************************************//** * -* Initializes CRC calculation. +* Initializes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -163,19 +163,19 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc(CRYPTO_Type *base, * The order in which data bytes are processed. 0 - MSB first; 1- LSB first. * * \param dataXor -* The byte mask for XORing data +* The byte mask for XORing data. * * \param remReverse -* A remainder reverse: 0 means the remainder is not reversed. 1 means reversed. +* A remainder reverse: 0 means the remainder is not reversed. 1 means it is reversed. * * \param remXor -* Specifies a mask with which the LFSR32 register is XORed to produce a remainder. +* Specifies the mask with which the LFSR32 register is XORed to produce a remainder. * * \param lfsrInitState * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcInit(CRYPTO_Type *base, @@ -187,30 +187,33 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcInit(CRYPTO_Type *base, uint32_t remXor, uint32_t lfsrInitState) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); - /* Specifies the bit order in which a data Byte is processed + /* Specifies the bit order in which a data byte is processed * (reversal is performed after XORing): * '0': Most significant bit (bit 1) first. * '1': Least significant bit (bit 0) first. */ REG_CRYPTO_CRC_CTL(base) = (uint32_t)( (_VAL2FLD(CRYPTO_CRC_CTL_DATA_REVERSE, dataReverse)) | (_VAL2FLD(CRYPTO_CRC_CTL_REM_REVERSE, remReverse)) ); - /* Specifies a byte mask with which each data byte is XORed. + /* Specifies the byte mask with which each data byte is XORed. * The XOR is performed before data reversal. */ REG_CRYPTO_CRC_DATA_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_DATA_CTL_DATA_XOR, dataXor)); - /* CRC polynomial. The polynomial is represented WITHOUT the high order bit + /* The CRC polynomial. The polynomial is represented WITHOUT the high-order bit * (this bit is always assumed '1'). * CRC_POLYNOMIAL << (32 - CRC_BITLEN) */ - REG_CRYPTO_CRC_POL_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_POL_CTL_POLYNOMIAL, polynomial << (32u - width))); + REG_CRYPTO_CRC_POL_CTL(base) = + (uint32_t)(_VAL2FLD(CRYPTO_CRC_POL_CTL_POLYNOMIAL, polynomial << (CY_CRYPTO_HW_REGS_WIDTH - width))); - /*Specifies a mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. + /*Specifies the mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. * The XOR is performed before remainder reversal. */ - REG_CRYPTO_CRC_REM_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_REM_CTL_REM_XOR, remXor << (32u - width))); + REG_CRYPTO_CRC_REM_CTL(base) = + (uint32_t)(_VAL2FLD(CRYPTO_CRC_REM_CTL_REM_XOR, remXor << (CY_CRYPTO_HW_REGS_WIDTH - width))); - /* A state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement CRC. */ - REG_CRYPTO_CRC_LFSR_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_LFSR_CTL_LFSR32, lfsrInitState << (32u - width))); + /* The state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement the CRC. */ + REG_CRYPTO_CRC_LFSR_CTL(base) = + (uint32_t)(_VAL2FLD(CRYPTO_CRC_LFSR_CTL_LFSR32, lfsrInitState << (CY_CRYPTO_HW_REGS_WIDTH - width))); return (CY_CRYPTO_SUCCESS); } @@ -219,10 +222,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcInit(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V1_Crc_CalcStart ****************************************************************************//** * -* Prepare CRC calculation by setting an initial seeds value. +* Prepares the CRC calculation by setting an initial seed value. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -231,15 +234,16 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcInit(CRYPTO_Type *base, * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcStart(CRYPTO_Type *base, uint32_t width, uint32_t lfsrInitState) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); - /* A state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement CRC. */ - REG_CRYPTO_CRC_LFSR_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CRC_LFSR_CTL_LFSR32, lfsrInitState << (32u - width))); + /* The state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement the CRC. */ + REG_CRYPTO_CRC_LFSR_CTL(base) = + (uint32_t)(_VAL2FLD(CRYPTO_CRC_LFSR_CTL_LFSR32, lfsrInitState << (CY_CRYPTO_HW_REGS_WIDTH - width))); return (CY_CRYPTO_SUCCESS); } @@ -248,10 +252,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcStart(CRYPTO_Type *base, uint32_ * Function Name: Cy_Crypto_Core_V1_Crc_CalcPartial ****************************************************************************//** * -* Performs CRC calculation of a message part. +* Performs the CRC calculation of a message part. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data * The pointer to the message whose CRC is being computed. @@ -260,19 +264,19 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcStart(CRYPTO_Type *base, uint32_ * The size of a message in bytes. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcPartial(CRYPTO_Type *base, void const *data, uint32_t dataSize) { - /* Fill the FIFO with the instruction parameters */ + /* Fills the FIFO with the instruction parameters. */ Cy_Crypto_SetReg2Instr(base, (uint32_t)data, dataSize ); - /* Issue the CRC instruction */ + /* Issues the CRC instruction. */ Cy_Crypto_Run2ParamInstr(base, CY_CRYPTO_V1_CRC_OPC, CY_CRYPTO_RSRC0_SHIFT, CY_CRYPTO_RSRC4_SHIFT); - /* Wait until CRC instruction is complete */ + /* Waits until the CRC instruction is complete. */ while(0uL != _FLD2VAL(CRYPTO_STATUS_CRC_BUSY, REG_CRYPTO_STATUS(base))) { } @@ -284,10 +288,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcPartial(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V1_Crc_CalcFinish ****************************************************************************//** * -* Finalizes CRC calculation. +* Finalizes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -296,22 +300,22 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcPartial(CRYPTO_Type *base, * The pointer to a computed CRC value. Must be 4-byte aligned. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcFinish(CRYPTO_Type *base, uint32_t width, uint32_t *crc) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); uint32_t calculatedCrc; - /* Copy the result from the CRC_REM_RESULT register */ + /* Copies the result from the CRC_REM_RESULT register. */ calculatedCrc = (uint32_t)_FLD2VAL(CRYPTO_CRC_REM_RESULT_REM, REG_CRYPTO_CRC_REM_RESULT(base)); - /* Note: Calculated CRC value is MSB aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ + /* NOTE The calculated CRC value is MSB-aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ if (_FLD2VAL(CRYPTO_CRC_CTL_REM_REVERSE, REG_CRYPTO_CRC_CTL(base)) == 0u) { - calculatedCrc = calculatedCrc >> (32u - width); + calculatedCrc = calculatedCrc >> (CY_CRYPTO_HW_REGS_WIDTH - width); } *crc = calculatedCrc; @@ -323,10 +327,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcFinish(CRYPTO_Type *base, uint32 * Function Name: Cy_Crypto_Core_V1_Crc_Calc ****************************************************************************//** * -* Performs CRC calculation on a message. +* Performs the CRC calculation on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -341,7 +345,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_CalcFinish(CRYPTO_Type *base, uint32 * The size of a message in bytes. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_Calc(CRYPTO_Type *base, @@ -350,28 +354,28 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Crc_Calc(CRYPTO_Type *base, void const *data, uint32_t dataSize) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); uint32_t calculatedCrc; - /* Fill the FIFO with the instruction parameters */ + /* Fills the FIFO with the instruction parameters. */ Cy_Crypto_SetReg2Instr(base, (uint32_t)data, dataSize ); - /* Issue the CRC instruction */ + /* Issues the CRC instruction. */ Cy_Crypto_Run2ParamInstr(base, CY_CRYPTO_V1_CRC_OPC, CY_CRYPTO_RSRC0_SHIFT, CY_CRYPTO_RSRC4_SHIFT); - /* Wait until CRC instruction is complete */ + /* Waits until the CRC instruction is complete. */ while(0uL != _FLD2VAL(CRYPTO_STATUS_CRC_BUSY, REG_CRYPTO_STATUS(base))) { } - /* Copy the result from the CRC_REM_RESULT register */ + /* Copies the result from the CRC_REM_RESULT register. */ calculatedCrc = (uint32_t)_FLD2VAL(CRYPTO_CRC_REM_RESULT_REM, REG_CRYPTO_CRC_REM_RESULT(base)); - /* Note: Calculated CRC value is MSB aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ + /* NOTE The calculated CRC value is MSB-aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ if (_FLD2VAL(CRYPTO_CRC_CTL_REM_REVERSE, REG_CRYPTO_CRC_CTL(base)) == 0u) { - calculatedCrc = calculatedCrc >> (32u - width); + calculatedCrc = calculatedCrc >> (CY_CRYPTO_HW_REGS_WIDTH - width); } *crc = calculatedCrc; diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v2.c index 5c5878384d..a27ce9b677 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_crc_v2.c @@ -42,7 +42,7 @@ * Initializes CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param polynomial * The polynomial (specified using 32 bits) used in the computing CRC. @@ -60,7 +60,7 @@ * Specifies a mask with which the LFSR32 register is XORed to produce a remainder. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_Init(CRYPTO_Type *base, @@ -100,7 +100,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_Init(CRYPTO_Type *base, * Performs CRC calculation on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param crc * The pointer to a computed CRC value. Must be 4-byte aligned. @@ -115,7 +115,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_Init(CRYPTO_Type *base, * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc(CRYPTO_Type *base, @@ -146,10 +146,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V2_Crc_CalcInit ****************************************************************************//** * -* Initializes CRC calculation. +* Initializes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -161,19 +161,19 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc(CRYPTO_Type *base, * The order in which data bytes are processed. 0 - MSB first; 1- LSB first. * * \param dataXor -* The byte mask for XORing data +* The byte mask for XORing data. * * \param remReverse -* A remainder reverse: 0 means the remainder is not reversed. 1 means reversed. +* The remainder reverse: 0 means the remainder is not reversed; 1 means it is reversed. * * \param remXor -* Specifies a mask with which the LFSR32 register is XORed to produce a remainder. +* Specifies the mask with which the LFSR32 register is XORed to produce a remainder. * * \param lfsrInitState * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcInit(CRYPTO_Type *base, @@ -185,29 +185,32 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcInit(CRYPTO_Type *base, uint32_t remXor, uint32_t lfsrInitState) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); - /* Specifies the bit order in which a data Byte is processed + /* Specifies the bit order in which a data byte is processed * (reversal is performed after XORing): * '0': Most significant bit (bit 1) first. * '1': Least significant bit (bit 0) first. */ REG_CRYPTO_CRC_CTL(base) = (uint32_t)( (_VAL2FLD(CRYPTO_V2_CRC_CTL_DATA_REVERSE, dataReverse)) | (_VAL2FLD(CRYPTO_V2_CRC_CTL_REM_REVERSE, remReverse)) ); - /* Specifies a byte mask with which each data byte is XORed. + /* Specifies the byte mask with which each data byte is XORed. * The XOR is performed before data reversal. */ REG_CRYPTO_CRC_DATA_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_V2_CRC_DATA_CTL_DATA_XOR, dataXor)); - /* CRC polynomial. The polynomial is represented WITHOUT the high order bit + /* The CRC polynomial. The polynomial is represented WITHOUT the high-order bit * (this bit is always assumed '1'). */ - REG_CRYPTO_CRC_POL_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_V2_CRC_POL_CTL_POLYNOMIAL, polynomial << (32u - width))); + REG_CRYPTO_CRC_POL_CTL(base) = + (uint32_t)(_VAL2FLD(CRYPTO_V2_CRC_POL_CTL_POLYNOMIAL, polynomial << (CY_CRYPTO_HW_REGS_WIDTH - width))); - /*Specifies a mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. + /*Specifies the mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. * The XOR is performed before remainder reversal. */ - REG_CRYPTO_CRC_REM_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_V2_CRC_REM_CTL_REM_XOR, remXor << (32u - width))); + REG_CRYPTO_CRC_REM_CTL(base) = + (uint32_t)(_VAL2FLD(CRYPTO_V2_CRC_REM_CTL_REM_XOR, remXor << (CY_CRYPTO_HW_REGS_WIDTH - width))); - /* A state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement CRC. */ - REG_CRYPTO_RESULT(base) = (uint32_t)(_VAL2FLD(CRYPTO_V2_RESULT_DATA, lfsrInitState << (32u - width))); + /* The state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement the CRC. */ + REG_CRYPTO_RESULT(base) = + (uint32_t)(_VAL2FLD(CRYPTO_V2_RESULT_DATA, lfsrInitState << (CY_CRYPTO_HW_REGS_WIDTH - width))); return (CY_CRYPTO_SUCCESS); } @@ -216,10 +219,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcInit(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V2_Crc_CalcStart ****************************************************************************//** * -* Prepares CRC calculation by setting an initial seeds value. +* Prepares the CRC calculation by setting an initial seed value. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -228,15 +231,15 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcInit(CRYPTO_Type *base, * The initial state of the LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcStart(CRYPTO_Type *base, uint32_t width, uint32_t lfsrInitState) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); - /* A state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement CRC. */ - REG_CRYPTO_RESULT(base) = (uint32_t)(_VAL2FLD(CRYPTO_V2_RESULT_DATA, lfsrInitState << (32u - width))); + /* The state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement the CRC. */ + REG_CRYPTO_RESULT(base) = (uint32_t)(_VAL2FLD(CRYPTO_V2_RESULT_DATA, lfsrInitState << (CY_CRYPTO_HW_REGS_WIDTH - width))); return (CY_CRYPTO_SUCCESS); } @@ -245,10 +248,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcStart(CRYPTO_Type *base, uint32_ * Function Name: Cy_Crypto_Core_V2_Crc_CalcPartial ****************************************************************************//** * -* Performs CRC calculation of a message part. +* Performs the CRC calculation of a message part. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data * The pointer to the message whose CRC is being computed. @@ -257,19 +260,19 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcStart(CRYPTO_Type *base, uint32_ * The size of a message in bytes. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcPartial(CRYPTO_Type *base, void const *data, uint32_t dataSize) { - /* Fill the FIFO with the instruction parameters */ + /* Fills the FIFO with the instruction parameters. */ Cy_Crypto_Core_V2_FFStart(base, CY_CRYPTO_V2_RB_FF_LOAD0, (uint8_t const *)data, dataSize); - /* Issue the CRC instruction */ + /* Issues the CRC instruction. */ Cy_Crypto_Core_V2_Run(base, CY_CRYPTO_V2_CRC_OPC); - /* Wait until CRC instruction is complete */ + /* Waits until the CRC instruction is complete. */ Cy_Crypto_Core_V2_Sync(base); return (CY_CRYPTO_SUCCESS); @@ -279,10 +282,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcPartial(CRYPTO_Type *base, * Function Name: Cy_Crypto_Core_V2_Crc_CalcFinish ****************************************************************************//** * -* Finalizes CRC calculation. +* Finalizes the CRC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -291,22 +294,22 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcPartial(CRYPTO_Type *base, * The pointer to a computed CRC value. Must be 4-byte aligned. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcFinish(CRYPTO_Type *base, uint32_t width, uint32_t *crc) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); uint32_t calculatedCrc; - /* Copy the result from the CRC_REM_RESULT register */ + /* Copies the result from the CRC_REM_RESULT register. */ calculatedCrc = (uint32_t)_FLD2VAL(CRYPTO_V2_CRC_REM_RESULT_REM, REG_CRYPTO_CRC_REM_RESULT(base)); - /* Note: Calculated CRC value is MSB aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ - if (_FLD2VAL(CRYPTO_V2_CRC_CTL_REM_REVERSE, REG_CRYPTO_CRC_CTL(base)) == 0u) + /* NOTE The calculated CRC value is MSB-aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ + if (_FLD2VAL(CRYPTO_V2_CRC_CTL_REM_REVERSE, REG_CRYPTO_CRC_CTL(base)) == 0U) { - calculatedCrc = calculatedCrc >> (32u - width); + calculatedCrc = calculatedCrc >> (CY_CRYPTO_HW_REGS_WIDTH - width); } *crc = calculatedCrc; @@ -318,10 +321,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcFinish(CRYPTO_Type *base, uint32 * Function Name: Cy_Crypto_Core_V2_Crc_Calc ****************************************************************************//** * -* Performs CRC calculation on a message. +* Performs the CRC calculation on a message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param width * The CRC width in bits. @@ -336,7 +339,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_CalcFinish(CRYPTO_Type *base, uint32 * The size of a message in bytes. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_Calc(CRYPTO_Type *base, @@ -345,26 +348,26 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Crc_Calc(CRYPTO_Type *base, void const *data, uint32_t dataSize) { - CY_ASSERT_L1((width >= 1) && (width <=32u)); + CY_ASSERT_L1((width >= 1U) && (width <= CY_CRYPTO_HW_REGS_WIDTH)); uint32_t calculatedCrc; - /* Fill the FIFO with the instruction parameters */ + /* Fills the FIFO with the instruction parameters. */ Cy_Crypto_Core_V2_FFStart(base, CY_CRYPTO_V2_RB_FF_LOAD0, (uint8_t const *)data, dataSize); - /* Issue the CRC instruction */ + /* Issues the CRC instruction. */ Cy_Crypto_Core_V2_Run(base, CY_CRYPTO_V2_CRC_OPC); - /* Wait until CRC instruction is complete */ + /* Waits until the CRC instruction is complete. */ Cy_Crypto_Core_V2_Sync(base); - /* Copy the result from the CRC_REM_RESULT register */ + /* Copies the result from the CRC_REM_RESULT register. */ calculatedCrc = (uint32_t)_FLD2VAL(CRYPTO_V2_CRC_REM_RESULT_REM, REG_CRYPTO_CRC_REM_RESULT(base)); - /* Note: Calculated CRC value is MSB aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ - if (_FLD2VAL(CRYPTO_V2_CRC_CTL_REM_REVERSE, REG_CRYPTO_CRC_CTL(base)) == 0u) + /* NOTE The calculated CRC value is MSB-aligned and should be shifted WHEN CRC_DATA_REVERSE is zero. */ + if (_FLD2VAL(CRYPTO_V2_CRC_CTL_REM_REVERSE, REG_CRYPTO_CRC_CTL(base)) == 0U) { - calculatedCrc = calculatedCrc >> (32u - width); + calculatedCrc = calculatedCrc >> (CY_CRYPTO_HW_REGS_WIDTH - width); } *crc = calculatedCrc; diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v1.c index 5fe50a3f38..73c53e78c1 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v1.c @@ -91,7 +91,7 @@ static void Cy_Crypto_Core_V1_Des_ProcessBlock(CRYPTO_Type *base, * srcBlock could overlap dstBlock. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * One of CRYPTO_ENCRYPT or CRYPTO_DECRYPT. @@ -145,7 +145,7 @@ static void Cy_Crypto_Core_V1_Des_ProcessBlock(CRYPTO_Type *base, * This function is independent from the previous Crypto state. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -161,7 +161,7 @@ static void Cy_Crypto_Core_V1_Des_ProcessBlock(CRYPTO_Type *base, * The pointer to a source block. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Des(CRYPTO_Type *base, @@ -176,12 +176,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Des(CRYPTO_Type *base, cy_stc_crypto_des_buffers_t *desBuffers = (cy_stc_crypto_des_buffers_t *)REG_CRYPTO_MEM_BUFF(base); /* Check weak keys */ - for (i = 0u; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) + for (i = 0U; (i < CY_CRYPTO_DES_WEAK_KEY_COUNT) && (CY_CRYPTO_SUCCESS == status); i++) { - if (memcmp(key, (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) + if (Cy_Crypto_Core_V1_MemCmp(base, key, (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0U) { status = CY_CRYPTO_DES_WEAK_KEY; - break; } } @@ -205,7 +204,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Des(CRYPTO_Type *base, * This function is independent from the previous Crypto state. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -221,7 +220,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Des(CRYPTO_Type *base, * The pointer to a source data block. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Tdes(CRYPTO_Type *base, @@ -236,30 +235,18 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Tdes(CRYPTO_Type *base, cy_stc_crypto_des_buffers_t *desBuffers = (cy_stc_crypto_des_buffers_t *)REG_CRYPTO_MEM_BUFF(base); /* Check weak keys */ - for (i = 0u; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) + for (i = 0U; (i < CY_CRYPTO_DES_WEAK_KEY_COUNT) && (CY_CRYPTO_SUCCESS == status); i++) { - if (memcmp(key, (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) + for (uint32_t keynum=0U; (keynum < (CY_CRYPTO_TDES_KEY_SIZE / CY_CRYPTO_DES_KEY_SIZE)) && (CY_CRYPTO_SUCCESS == status); keynum++) { - status = CY_CRYPTO_DES_WEAK_KEY; - break; - } - - if (memcmp(&(key[CY_CRYPTO_DES_KEY_BYTE_LENGTH]), - (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) - { - status = CY_CRYPTO_DES_WEAK_KEY; - break; - } - - if (memcmp(&(key[2u * CY_CRYPTO_DES_KEY_BYTE_LENGTH]), - (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) - { - status = CY_CRYPTO_DES_WEAK_KEY; - break; + if (Cy_Crypto_Core_V1_MemCmp(base, &(key[keynum * CY_CRYPTO_DES_KEY_BYTE_LENGTH]), (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0U) + { + status = CY_CRYPTO_DES_WEAK_KEY; + } } } - Cy_Crypto_Core_V1_MemCpy(base, desBuffers->key, key, CY_CRYPTO_DES_KEY_BYTE_LENGTH * 3u); + Cy_Crypto_Core_V1_MemCpy(base, desBuffers->key, key, CY_CRYPTO_DES_KEY_BYTE_LENGTH * 3U); Cy_Crypto_Core_V1_MemCpy(base, desBuffers->block0, src, CY_CRYPTO_DES_KEY_BYTE_LENGTH); Cy_Crypto_Core_V1_Des_ProcessBlock(base, CY_CRYPTO_DES_MODE_TRIPLE, dirMode, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v2.c index c0152db4e1..e1ea2b72d0 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_des_v2.c @@ -36,8 +36,8 @@ #if (CPUSS_CRYPTO_DES == 1) -#define CY_CRYPTO_DES_WEAK_KEY_COUNT (16u) -#define CY_CRYPTO_DES_KEY_BYTE_LENGTH (8u) +#define CY_CRYPTO_DES_WEAK_KEY_COUNT (16U) +#define CY_CRYPTO_DES_KEY_BYTE_LENGTH (8U) typedef enum { @@ -78,7 +78,7 @@ static uint8_t const cy_desWeakKeys[CY_CRYPTO_DES_WEAK_KEY_COUNT][CY_CRYPTO_DES_ * This function is independent from the previous Crypto state. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -94,7 +94,7 @@ static uint8_t const cy_desWeakKeys[CY_CRYPTO_DES_WEAK_KEY_COUNT][CY_CRYPTO_DES_ * The pointer to a source data block. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Des(CRYPTO_Type *base, @@ -107,9 +107,9 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Des(CRYPTO_Type *base, cy_en_crypto_status_t status = CY_CRYPTO_SUCCESS; /* Check weak keys */ - for (i = 0u; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) + for (i = 0U; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) { - if (Cy_Crypto_Core_V2_MemCmp(base, key, (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0u) + if (Cy_Crypto_Core_V2_MemCmp(base, key, (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0U) { status = CY_CRYPTO_DES_WEAK_KEY; break; @@ -139,7 +139,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Des(CRYPTO_Type *base, * This function is independent from the previous Crypto state. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dirMode * Can be \ref CY_CRYPTO_ENCRYPT or \ref CY_CRYPTO_DECRYPT @@ -155,7 +155,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Des(CRYPTO_Type *base, * The pointer to a source data block. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Tdes(CRYPTO_Type *base, @@ -168,36 +168,24 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Tdes(CRYPTO_Type *base, cy_en_crypto_status_t status = CY_CRYPTO_SUCCESS; /* Check weak keys */ - for (i = 0u; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) + for (i = 0U; (i < CY_CRYPTO_DES_WEAK_KEY_COUNT) && (CY_CRYPTO_SUCCESS == status); i++) { - if (Cy_Crypto_Core_V2_MemCmp(base, key, (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0u) + for (uint32_t keynum=0U; (keynum < (CY_CRYPTO_TDES_KEY_SIZE / CY_CRYPTO_DES_KEY_SIZE)) && (CY_CRYPTO_SUCCESS == status); keynum++) { - status = CY_CRYPTO_DES_WEAK_KEY; - break; - } - - if (Cy_Crypto_Core_V2_MemCmp(base, &(key[CY_CRYPTO_DES_KEY_BYTE_LENGTH]), - (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0u) - { - status = CY_CRYPTO_DES_WEAK_KEY; - break; - } - - if (Cy_Crypto_Core_V2_MemCmp(base, &(key[2u * CY_CRYPTO_DES_KEY_BYTE_LENGTH]), - (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0u) - { - status = CY_CRYPTO_DES_WEAK_KEY; - break; + if (Cy_Crypto_Core_V2_MemCmp(base, &(key[keynum * CY_CRYPTO_DES_KEY_BYTE_LENGTH]), (uint8_t const *)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0U) + { + status = CY_CRYPTO_DES_WEAK_KEY; + } } } /* Load keys */ - Cy_Crypto_Core_V2_FFContinue(base, CY_CRYPTO_V2_RB_FF_LOAD0, key, CY_CRYPTO_DES_KEY_BYTE_LENGTH * 3u); - Cy_Crypto_Core_V2_BlockMov (base, CY_CRYPTO_V2_RB_KEY0, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_DES_KEY_BYTE_LENGTH * 2u); + Cy_Crypto_Core_V2_FFContinue(base, CY_CRYPTO_V2_RB_FF_LOAD0, key, CY_CRYPTO_DES_KEY_BYTE_LENGTH * 3U); + Cy_Crypto_Core_V2_BlockMov (base, CY_CRYPTO_V2_RB_KEY0, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_DES_KEY_BYTE_LENGTH * 2U); Cy_Crypto_Core_V2_BlockMov (base, CY_CRYPTO_V2_RB_KEY1, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_DES_KEY_BYTE_LENGTH); Cy_Crypto_Core_V2_FFContinue(base, CY_CRYPTO_V2_RB_FF_LOAD0, src, CY_CRYPTO_DES_KEY_BYTE_LENGTH); - Cy_Crypto_Core_V2_FFStart (base, CY_CRYPTO_V2_RB_FF_STORE, dst, CY_CRYPTO_DES_KEY_BYTE_LENGTH); + Cy_Crypto_Core_V2_FFStart (base, CY_CRYPTO_V2_RB_FF_STORE, dst, CY_CRYPTO_DES_KEY_BYTE_LENGTH); Cy_Crypto_Core_V2_BlockMov(base, CY_CRYPTO_V2_RB_BLOCK0, CY_CRYPTO_V2_RB_FF_LOAD0, CY_CRYPTO_DES_KEY_BYTE_LENGTH); Cy_Crypto_Core_V2_Run(base, (uint32_t)((dirMode == CY_CRYPTO_ENCRYPT) ? (CY_CRYPTO_V2_TDES_OPC) : (CY_CRYPTO_V2_TDES_INV_OPC))); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_domain_params.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_domain_params.c index 2b1f0122f6..f0c41ba4eb 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_domain_params.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_domain_params.c @@ -27,445 +27,444 @@ #include "cy_crypto_core_ecc.h" #include "cy_syslib.h" -const cy_stc_crypto_ecc_dp_type eccDomainParams[]; - /******************************************************************************* * Function Name: Cy_Crypto_Core_ECC_GetCurveParams ****************************************************************************//** * -* . +* Get curve domain parameters if this curve is supported. * * \param curveID * See \ref cy_en_crypto_ecc_curve_id_t. * -* \return status code. See \ref cy_stc_crypto_ecc_dp_type. +* \return +* Pointer to curve domain parameters. See \ref cy_stc_crypto_ecc_dp_type. * *******************************************************************************/ cy_stc_crypto_ecc_dp_type *Cy_Crypto_Core_ECC_GetCurveParams(cy_en_crypto_ecc_curve_id_t curveId) { - cy_stc_crypto_ecc_dp_type *result = NULL; + /* P192 CURVE PARAMETERS */ + CY_ALIGN(4) static const uint8_t eccP192Polynomial[CY_CRYPTO_ECC_P192_BYTE_SIZE] = + { + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xfeu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + }; + + CY_ALIGN(4) static const uint8_t eccP192PolyBarrett[CY_CRYPTO_ECC_P192_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + CY_ALIGN(4) static const uint8_t eccP192Order[CY_CRYPTO_ECC_P192_BYTE_SIZE] = + { + 0x31u, 0x28u, 0xD2u, 0xB4u, 0xB1u, 0xC9u, 0x6Bu, 0x14u, + 0x36u, 0xF8u, 0xDEu, 0x99u, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu + }; + + /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */ + CY_ALIGN(4) static const uint8_t eccP192OrderBarrett[CY_CRYPTO_ECC_P192_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0xcfu, 0xd7u, 0x2du, 0x4bu, 0x4eu, 0x36u, 0x94u, 0xebu, + 0xc9u, 0x07u, 0x21u, 0x66u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + + /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */ + CY_ALIGN(4) static const uint8_t eccP192BasePointX[CY_CRYPTO_ECC_P192_BYTE_SIZE] = + { + 0x12u, 0x10u, 0xffu, 0x82u, 0xfdu, 0x0au, 0xffu, 0xf4u, + 0x00u, 0x88u, 0xa1u, 0x43u, 0xebu, 0x20u, 0xbfu, 0x7cu, + 0xf6u, 0x90u, 0x30u, 0xb0u, 0x0eu, 0xa8u, 0x8du, 0x18u + }; + + /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */ + CY_ALIGN(4) static const uint8_t eccP192BasePointY[CY_CRYPTO_ECC_P192_BYTE_SIZE] = + { + 0x11u, 0x48u, 0x79u, 0x1eu, 0xa1u, 0x77u, 0xf9u, 0x73u, + 0xd5u, 0xcdu, 0x24u, 0x6bu, 0xedu, 0x11u, 0x10u, 0x63u, + 0x78u, 0xdau, 0xc8u, 0xffu, 0x95u, 0x2bu, 0x19u, 0x07u + }; + + /* P224 CURVE PARAMETERS */ + CY_ALIGN(4) static const uint8_t eccP224Polynomial[CY_CRYPTO_ECC_P224_BYTE_SIZE] = + { + 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu + }; + + CY_ALIGN(4) static const uint8_t eccP224PolyBarrett[CY_CRYPTO_ECC_P224_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x01u + }; + + CY_ALIGN(4) static const uint8_t eccP224Order[CY_CRYPTO_ECC_P224_BYTE_SIZE] = + { + 0x3Du, 0x2Au, 0x5Cu, 0x5Cu, 0x45u, 0x29u, 0xDDu, 0x13u, + 0x3Eu, 0xF0u, 0xB8u, 0xE0u, 0xA2u, 0x16u, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu + }; + /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */ + CY_ALIGN(4) static const uint8_t eccP224OrderBarrett[CY_CRYPTO_ECC_P224_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0xc3u, 0xd5u, 0xa3u, 0xa3u, 0xbau, 0xd6u, 0x22u, 0xecu, + 0xc1u, 0x0fu, 0x47u, 0x1fu, 0x5du, 0xe9u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x01u + }; + + /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */ + CY_ALIGN(4) static const uint8_t eccP224BasePointX[CY_CRYPTO_ECC_P224_BYTE_SIZE] = + { + 0x21u, 0x1du, 0x5cu, 0x11u, 0xd6u, 0x80u, 0x32u, 0x34u, + 0x22u, 0x11u, 0xc2u, 0x56u, 0xd3u, 0xc1u, 0x03u, 0x4au, + 0xb9u, 0x90u, 0x13u, 0x32u, 0x7fu, 0xbfu, 0xb4u, 0x6bu, + 0xbdu, 0x0cu, 0x0eu, 0xb7u + }; + + /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */ + CY_ALIGN(4) static const uint8_t eccP224BasePointY[CY_CRYPTO_ECC_P224_BYTE_SIZE] = + { + 0x34u, 0x7eu, 0x00u, 0x85u, 0x99u, 0x81u, 0xd5u, 0x44u, + 0x64u, 0x47u, 0x07u, 0x5au, 0xa0u, 0x75u, 0x43u, 0xcdu, + 0xe6u, 0xdfu, 0x22u, 0x4cu, 0xfbu, 0x23u, 0xf7u, 0xb5u, + 0x88u, 0x63u, 0x37u, 0xbdu + }; + + + /* P256 CURVE PARAMETERS */ + /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */ + CY_ALIGN(4) static const uint8_t eccP256Polynomial[CY_CRYPTO_ECC_P256_BYTE_SIZE] = + { + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu + }; + + /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */ + CY_ALIGN(4) static const uint8_t eccP256PolyBarrett[CY_CRYPTO_ECC_P256_BYTE_SIZE + 1u] = + { /* pre-calculated! */ + 0x03u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0xffu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu, + 0xfeu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + + /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */ + CY_ALIGN(4) static const uint8_t eccP256Order[CY_CRYPTO_ECC_P256_BYTE_SIZE] = + { + 0x51u, 0x25u, 0x63u, 0xfcu, 0xc2u, 0xcau, 0xb9u, 0xf3u, + 0x84u, 0x9eu, 0x17u, 0xa7u, 0xadu, 0xfau, 0xe6u, 0xbcu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu + }; + + /* barrett_o: 100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */ + CY_ALIGN(4) static const uint8_t eccP256OrderBarrett[CY_CRYPTO_ECC_P256_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0xfeu, 0x9bu, 0xdfu, 0xeeu, 0x85u, 0xfdu, 0x2fu, 0x01u, + 0x21u, 0x6cu, 0x1au, 0xdfu, 0x52u, 0x05u, 0x19u, 0x43u, + 0xffu, 0xffu, 0xffu, 0xffu, 0xfeu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + + /* base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */ + CY_ALIGN(4) static const uint8_t eccP256BasePointX[CY_CRYPTO_ECC_P256_BYTE_SIZE] = + { + 0x96u, 0xc2u, 0x98u, 0xd8u, 0x45u, 0x39u, 0xa1u, 0xf4u, + 0xa0u, 0x33u, 0xebu, 0x2du, 0x81u, 0x7du, 0x03u, 0x77u, + 0xf2u, 0x40u, 0xa4u, 0x63u, 0xe5u, 0xe6u, 0xbcu, 0xf8u, + 0x47u, 0x42u, 0x2cu, 0xe1u, 0xf2u, 0xd1u, 0x17u, 0x6bu + }; + + /* base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */ + CY_ALIGN(4) static const uint8_t eccP256BasePointY[CY_CRYPTO_ECC_P256_BYTE_SIZE] = + { + 0xf5u, 0x51u, 0xbfu, 0x37u, 0x68u, 0x40u, 0xb6u, 0xcbu, + 0xceu, 0x5eu, 0x31u, 0x6bu, 0x57u, 0x33u, 0xceu, 0x2bu, + 0x16u, 0x9eu, 0x0fu, 0x7cu, 0x4au, 0xebu, 0xe7u, 0x8eu, + 0x9bu, 0x7fu, 0x1au, 0xfeu, 0xe2u, 0x42u, 0xe3u, 0x4fu, + }; + + /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */ + CY_ALIGN(4) static const uint8_t eccP384Polynomial[CY_CRYPTO_ECC_P384_BYTE_SIZE] = + { + 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu, + 0xfeu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu + }; + + /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */ + CY_ALIGN(4) static const uint8_t eccP384PolyBarrett[CY_CRYPTO_ECC_P384_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0x01u, 0x00u, 0x00u, 0x00u, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + + /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */ + CY_ALIGN(4) static const uint8_t eccP384Order[CY_CRYPTO_ECC_P384_BYTE_SIZE] = + { + 0x73u, 0x29u, 0xC5u, 0xCCu, 0x6Au, 0x19u, 0xECu, 0xECu, + 0x7Au, 0xA7u, 0xB0u, 0x48u, 0xB2u, 0x0Du, 0x1Au, 0x58u, + 0xDFu, 0x2Du, 0x37u, 0xF4u, 0x81u, 0x4Du, 0x63u, 0xC7u, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu + }; + + /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */ + CY_ALIGN(4) static const uint8_t eccP384OrderBarrett[CY_CRYPTO_ECC_P384_BYTE_SIZE + 1u] = + { /* pre-calculated */ + 0x8du, 0xd6u, 0x3au, 0x33u, 0x95u, 0xe6u, 0x13u, 0x13u, + 0x85u, 0x58u, 0x4fu, 0xb7u, 0x4du, 0xf2u, 0xe5u, 0xa7u, + 0x20u, 0xd2u, 0xc8u, 0x0bu, 0x7eu, 0xb2u, 0x9cu, 0x38u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + + /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */ + CY_ALIGN(4) static const uint8_t eccP384BasePointX[CY_CRYPTO_ECC_P384_BYTE_SIZE] = + { + 0xb7u, 0x0au, 0x76u, 0x72u, 0x38u, 0x5eu, 0x54u, 0x3au, + 0x6cu, 0x29u, 0x55u, 0xbfu, 0x5du, 0xf2u, 0x02u, 0x55u, + 0x38u, 0x2au, 0x54u, 0x82u, 0xe0u, 0x41u, 0xf7u, 0x59u, + 0x98u, 0x9bu, 0xa7u, 0x8bu, 0x62u, 0x3bu, 0x1du, 0x6eu, + 0x74u, 0xadu, 0x20u, 0xf3u, 0x1eu, 0xc7u, 0xb1u, 0x8eu, + 0x37u, 0x05u, 0x8bu, 0xbeu, 0x22u, 0xcau, 0x87u, 0xaau + }; + + /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */ + CY_ALIGN(4) static const uint8_t eccP384BasePointY[CY_CRYPTO_ECC_P384_BYTE_SIZE] = + { + 0x5fu, 0x0eu, 0xeau, 0x90u, 0x7cu, 0x1du, 0x43u, 0x7au, + 0x9du, 0x81u, 0x7eu, 0x1du, 0xceu, 0xb1u, 0x60u, 0x0au, + 0xc0u, 0xb8u, 0xf0u, 0xb5u, 0x13u, 0x31u, 0xdau, 0xe9u, + 0x7cu, 0x14u, 0x9au, 0x28u, 0xbdu, 0x1du, 0xf4u, 0xf8u, + 0x29u, 0xdcu, 0x92u, 0x92u, 0xbfu, 0x98u, 0x9eu, 0x5du, + 0x6fu, 0x2cu, 0x26u, 0x96u, 0x4au, 0xdeu, 0x17u, 0x36u + }; + + CY_ALIGN(4) static const uint8_t eccP521Polynomial[CY_CRYPTO_ECC_P521_BYTE_SIZE] = + { + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0x01u + }; + + CY_ALIGN(4) static const uint8_t eccP521PolyBarrett[CY_CRYPTO_ECC_P521_BYTE_SIZE] = + { /* pre-calculated */ + 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x02u + }; + + CY_ALIGN(4) static const uint8_t eccP521Order[CY_CRYPTO_ECC_P521_BYTE_SIZE] = + { + 0x09u, 0x64u, 0x38u, 0x91u, 0x1Eu, 0xB7u, 0x6Fu, 0xBBu, + 0xAEu, 0x47u, 0x9Cu, 0x89u, 0xB8u, 0xC9u, 0xB5u, 0x3Bu, + 0xD0u, 0xA5u, 0x09u, 0xF7u, 0x48u, 0x01u, 0xCCu, 0x7Fu, + 0x6Bu, 0x96u, 0x2Fu, 0xBFu, 0x83u, 0x87u, 0x86u, 0x51u, + 0xFAu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, + 0xffu, 0x01u + }; + + /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */ + CY_ALIGN(4) static const uint8_t eccP521OrderBarrett[CY_CRYPTO_ECC_P521_BYTE_SIZE] = + { /* pre-calculated */ + 0xf7u, 0x9bu, 0xc7u, 0x6eu, 0xe1u, 0x48u, 0x90u, 0x44u, + 0x51u, 0xb8u, 0x63u, 0x76u, 0x47u, 0x36u, 0x4au, 0xc4u, + 0x2fu, 0x5au, 0xf6u, 0x08u, 0xb7u, 0xfeu, 0x33u, 0x80u, + 0x94u, 0x69u, 0xd0u, 0x40u, 0x7cu, 0x78u, 0x79u, 0xaeu, + 0x05u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x02u + }; + + /* base point x: "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */ + CY_ALIGN(4) static const uint8_t eccP521BasePointX[CY_CRYPTO_ECC_P521_BYTE_SIZE] = + { + 0x66u, 0xbdu, 0xe5u, 0xc2u, 0x31u, 0x7eu, 0x7eu, 0xf9u, + 0x9bu, 0x42u, 0x6au, 0x85u, 0xc1u, 0xb3u, 0x48u, 0x33u, + 0xdeu, 0xa8u, 0xffu, 0xa2u, 0x27u, 0xc1u, 0x1du, 0xfeu, + 0x28u, 0x59u, 0xe7u, 0xefu, 0x77u, 0x5eu, 0x4bu, 0xa1u, + 0xbau, 0x3du, 0x4du, 0x6bu, 0x60u, 0xafu, 0x28u, 0xf8u, + 0x21u, 0xb5u, 0x3fu, 0x05u, 0x39u, 0x81u, 0x64u, 0x9cu, + 0x42u, 0xb4u, 0x95u, 0x23u, 0x66u, 0xcbu, 0x3eu, 0x9eu, + 0xcdu, 0xe9u, 0x04u, 0x04u, 0xb7u, 0x06u, 0x8eu, 0x85u, + 0xc6u, 0x00u + }; + + /* base point y: "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */ + CY_ALIGN(4) static const uint8_t eccP521BasePointY[CY_CRYPTO_ECC_P521_BYTE_SIZE] = + { + 0x50u, 0x66u, 0xd1u, 0x9fu, 0x76u, 0x94u, 0xbeu, 0x88u, + 0x40u, 0xc2u, 0x72u, 0xa2u, 0x86u, 0x70u, 0x3cu, 0x35u, + 0x61u, 0x07u, 0xadu, 0x3fu, 0x01u, 0xb9u, 0x50u, 0xc5u, + 0x40u, 0x26u, 0xf4u, 0x5eu, 0x99u, 0x72u, 0xeeu, 0x97u, + 0x2cu, 0x66u, 0x3eu, 0x27u, 0x17u, 0xbdu, 0xafu, 0x17u, + 0x68u, 0x44u, 0x9bu, 0x57u, 0x49u, 0x44u, 0xf5u, 0x98u, + 0xd9u, 0x1bu, 0x7du, 0x2cu, 0xb4u, 0x5fu, 0x8au, 0x5cu, + 0x04u, 0xc0u, 0x3bu, 0x9au, 0x78u, 0x6au, 0x29u, 0x39u, + 0x18u, 0x01u + }; + + static const cy_stc_crypto_ecc_dp_type eccDomainParams[] = + { + { + CY_CRYPTO_ECC_ECP_NONE, + 0u, + NULL, + CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + CY_CRYPTO_ECC_ECP_SECP192R1, + CY_CRYPTO_ECC_P192_SIZE, + "NIST P-192", + CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG, + /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF" */ + eccP192Polynomial, + /* barrett_p: "1000000000000000000000000000000010000000000000001" */ + eccP192PolyBarrett, + /* order: "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831" */ + eccP192Order, + /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */ + eccP192OrderBarrett, + /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */ + eccP192BasePointX, + /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */ + eccP192BasePointY + }, + { + CY_CRYPTO_ECC_ECP_SECP224R1, + CY_CRYPTO_ECC_P224_SIZE, + "NIST P-224", + CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG, + /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001" */ + eccP224Polynomial, + /* barrett_p: "100000000000000000000000000000000ffffffffffffffffffffffff" */ + eccP224PolyBarrett, + /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D" */ + eccP224Order, + /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */ + eccP224OrderBarrett, + /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */ + eccP224BasePointX, + /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */ + eccP224BasePointY + }, + { + CY_CRYPTO_ECC_ECP_SECP256R1, + CY_CRYPTO_ECC_P256_SIZE, + "NIST P-256", + CY_CRYPTO_NIST_P_BARRETT_RED_ALG, + /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */ + eccP256Polynomial, + /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */ + eccP256PolyBarrett, + /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */ + eccP256Order, + /* barrett_o: "100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */ + eccP256OrderBarrett, + /* Gx - base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */ + eccP256BasePointX, + /* Gy - base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */ + eccP256BasePointY + }, + { + CY_CRYPTO_ECC_ECP_SECP384R1, + CY_CRYPTO_ECC_P384_SIZE, + "NIST P-384", + CY_CRYPTO_NIST_P_BARRETT_RED_ALG, + /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */ + eccP384Polynomial, + /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */ + eccP384PolyBarrett, + /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */ + eccP384Order, + /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */ + eccP384OrderBarrett, + /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */ + eccP384BasePointX, + /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */ + eccP384BasePointY + }, + { + CY_CRYPTO_ECC_ECP_SECP521R1, + CY_CRYPTO_ECC_P521_SIZE, + "NIST P-521", + /* Currently driver uses CY_CRYPTO_NIST_P_BARRETT_RED_ALG algorithm instead of + curve specific CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG */ + CY_CRYPTO_NIST_P_BARRETT_RED_ALG, + /* prime: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" */ + eccP521Polynomial, + /* barrett_p: "20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" */ + eccP521PolyBarrett, + /* order: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409" */ + eccP521Order, + /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */ + eccP521OrderBarrett, + /* base point x: "0C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */ + eccP521BasePointX, + /* base point y: "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */ + eccP521BasePointY + } + }; + + cy_stc_crypto_ecc_dp_type *tmpResult = NULL; if ((curveId > CY_CRYPTO_ECC_ECP_NONE) && (curveId < CY_CRYPTO_ECC_ECP_CURVES_CNT)) { - result = (cy_stc_crypto_ecc_dp_type *)&eccDomainParams[curveId]; + tmpResult = (cy_stc_crypto_ecc_dp_type *)&eccDomainParams[curveId]; } - return result; + return tmpResult; } -/* P192 CURVE PARAMETERS */ -CY_ALIGN(4) const uint8_t eccP192Polynomial[CY_CRYPTO_ECC_P192_BYTE_SIZE] = -{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; - -CY_ALIGN(4) const uint8_t eccP192PolyBarrett[CY_CRYPTO_ECC_P192_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01 -}; -CY_ALIGN(4) const uint8_t eccP192Order[CY_CRYPTO_ECC_P192_BYTE_SIZE] = -{ - 0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14, - 0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -/* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */ -CY_ALIGN(4) const uint8_t eccP192OrderBarrett[CY_CRYPTO_ECC_P192_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0xcf, 0xd7, 0x2d, 0x4b, 0x4e, 0x36, 0x94, 0xeb, - 0xc9, 0x07, 0x21, 0x66, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01 -}; - -/* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */ -CY_ALIGN(4) const uint8_t eccP192BasePointX[CY_CRYPTO_ECC_P192_BYTE_SIZE] = -{ - 0x12, 0x10, 0xff, 0x82, 0xfd, 0x0a, 0xff, 0xf4, - 0x00, 0x88, 0xa1, 0x43, 0xeb, 0x20, 0xbf, 0x7c, - 0xf6, 0x90, 0x30, 0xb0, 0x0e, 0xa8, 0x8d, 0x18 -}; - -/* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */ -CY_ALIGN(4) const uint8_t eccP192BasePointY[CY_CRYPTO_ECC_P192_BYTE_SIZE] = -{ - 0x11, 0x48, 0x79, 0x1e, 0xa1, 0x77, 0xf9, 0x73, - 0xd5, 0xcd, 0x24, 0x6b, 0xed, 0x11, 0x10, 0x63, - 0x78, 0xda, 0xc8, 0xff, 0x95, 0x2b, 0x19, 0x07 -}; - -/* P224 CURVE PARAMETERS */ -CY_ALIGN(4) const uint8_t eccP224Polynomial[CY_CRYPTO_ECC_P224_BYTE_SIZE] = -{ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -CY_ALIGN(4) const uint8_t eccP224PolyBarrett[CY_CRYPTO_ECC_P224_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01 -}; - -CY_ALIGN(4) const uint8_t eccP224Order[CY_CRYPTO_ECC_P224_BYTE_SIZE] = -{ - 0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13, - 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF -}; -/* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */ -CY_ALIGN(4) const uint8_t eccP224OrderBarrett[CY_CRYPTO_ECC_P224_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0xc3, 0xd5, 0xa3, 0xa3, 0xba, 0xd6, 0x22, 0xec, - 0xc1, 0x0f, 0x47, 0x1f, 0x5d, 0xe9, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01 -}; - -/* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */ -CY_ALIGN(4) const uint8_t eccP224BasePointX[CY_CRYPTO_ECC_P224_BYTE_SIZE] = -{ - 0x21, 0x1d, 0x5c, 0x11, 0xd6, 0x80, 0x32, 0x34, - 0x22, 0x11, 0xc2, 0x56, 0xd3, 0xc1, 0x03, 0x4a, - 0xb9, 0x90, 0x13, 0x32, 0x7f, 0xbf, 0xb4, 0x6b, - 0xbd, 0x0c, 0x0e, 0xb7 -}; - -/* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */ -CY_ALIGN(4) const uint8_t eccP224BasePointY[CY_CRYPTO_ECC_P224_BYTE_SIZE] = -{ - 0x34, 0x7e, 0x00, 0x85, 0x99, 0x81, 0xd5, 0x44, - 0x64, 0x47, 0x07, 0x5a, 0xa0, 0x75, 0x43, 0xcd, - 0xe6, 0xdf, 0x22, 0x4c, 0xfb, 0x23, 0xf7, 0xb5, - 0x88, 0x63, 0x37, 0xbd -}; - - -/* P256 CURVE PARAMETERS */ -/* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */ -CY_ALIGN(4) const uint8_t eccP256Polynomial[CY_CRYPTO_ECC_P256_BYTE_SIZE] = -{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff -}; - -/* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */ -CY_ALIGN(4) const uint8_t eccP256PolyBarrett[CY_CRYPTO_ECC_P256_BYTE_SIZE + 1u] = -{ /* pre-calculated! */ - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x01 -}; - -/* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */ -CY_ALIGN(4) const uint8_t eccP256Order[CY_CRYPTO_ECC_P256_BYTE_SIZE] = -{ - 0x51, 0x25, 0x63, 0xfc, 0xc2, 0xca, 0xb9, 0xf3, - 0x84, 0x9e, 0x17, 0xa7, 0xad, 0xfa, 0xe6, 0xbc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff -}; - -/* barrett_o: 100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */ -CY_ALIGN(4) const uint8_t eccP256OrderBarrett[CY_CRYPTO_ECC_P256_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0xfe, 0x9b, 0xdf, 0xee, 0x85, 0xfd, 0x2f, 0x01, - 0x21, 0x6c, 0x1a, 0xdf, 0x52, 0x05, 0x19, 0x43, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x01 -}; - -/* base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */ -CY_ALIGN(4) const uint8_t eccP256BasePointX[CY_CRYPTO_ECC_P256_BYTE_SIZE] = -{ - 0x96, 0xc2, 0x98, 0xd8, 0x45, 0x39, 0xa1, 0xf4, - 0xa0, 0x33, 0xeb, 0x2d, 0x81, 0x7d, 0x03, 0x77, - 0xf2, 0x40, 0xa4, 0x63, 0xe5, 0xe6, 0xbc, 0xf8, - 0x47, 0x42, 0x2c, 0xe1, 0xf2, 0xd1, 0x17, 0x6b -}; - -/* base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */ -CY_ALIGN(4) const uint8_t eccP256BasePointY[CY_CRYPTO_ECC_P256_BYTE_SIZE] = -{ - 0xf5, 0x51, 0xbf, 0x37, 0x68, 0x40, 0xb6, 0xcb, - 0xce, 0x5e, 0x31, 0x6b, 0x57, 0x33, 0xce, 0x2b, - 0x16, 0x9e, 0x0f, 0x7c, 0x4a, 0xeb, 0xe7, 0x8e, - 0x9b, 0x7f, 0x1a, 0xfe, 0xe2, 0x42, 0xe3, 0x4f, -}; - -/* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */ -CY_ALIGN(4) const uint8_t eccP384Polynomial[CY_CRYPTO_ECC_P384_BYTE_SIZE] = -{ - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; - -/* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */ -CY_ALIGN(4) const uint8_t eccP384PolyBarrett[CY_CRYPTO_ECC_P384_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01 -}; - -/* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */ -CY_ALIGN(4) const uint8_t eccP384Order[CY_CRYPTO_ECC_P384_BYTE_SIZE] = -{ - 0x73, 0x29, 0xC5, 0xCC, 0x6A, 0x19, 0xEC, 0xEC, - 0x7A, 0xA7, 0xB0, 0x48, 0xB2, 0x0D, 0x1A, 0x58, - 0xDF, 0x2D, 0x37, 0xF4, 0x81, 0x4D, 0x63, 0xC7, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF -}; - -/* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */ -CY_ALIGN(4) const uint8_t eccP384OrderBarrett[CY_CRYPTO_ECC_P384_BYTE_SIZE + 1u] = -{ /* pre-calculated */ - 0x8d, 0xd6, 0x3a, 0x33, 0x95, 0xe6, 0x13, 0x13, - 0x85, 0x58, 0x4f, 0xb7, 0x4d, 0xf2, 0xe5, 0xa7, - 0x20, 0xd2, 0xc8, 0x0b, 0x7e, 0xb2, 0x9c, 0x38, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01 -}; - -/* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */ -CY_ALIGN(4) const uint8_t eccP384BasePointX[CY_CRYPTO_ECC_P384_BYTE_SIZE] = -{ - 0xb7, 0x0a, 0x76, 0x72, 0x38, 0x5e, 0x54, 0x3a, - 0x6c, 0x29, 0x55, 0xbf, 0x5d, 0xf2, 0x02, 0x55, - 0x38, 0x2a, 0x54, 0x82, 0xe0, 0x41, 0xf7, 0x59, - 0x98, 0x9b, 0xa7, 0x8b, 0x62, 0x3b, 0x1d, 0x6e, - 0x74, 0xad, 0x20, 0xf3, 0x1e, 0xc7, 0xb1, 0x8e, - 0x37, 0x05, 0x8b, 0xbe, 0x22, 0xca, 0x87, 0xaa -}; - -/* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */ -CY_ALIGN(4) const uint8_t eccP384BasePointY[CY_CRYPTO_ECC_P384_BYTE_SIZE] = -{ - 0x5f, 0x0e, 0xea, 0x90, 0x7c, 0x1d, 0x43, 0x7a, - 0x9d, 0x81, 0x7e, 0x1d, 0xce, 0xb1, 0x60, 0x0a, - 0xc0, 0xb8, 0xf0, 0xb5, 0x13, 0x31, 0xda, 0xe9, - 0x7c, 0x14, 0x9a, 0x28, 0xbd, 0x1d, 0xf4, 0xf8, - 0x29, 0xdc, 0x92, 0x92, 0xbf, 0x98, 0x9e, 0x5d, - 0x6f, 0x2c, 0x26, 0x96, 0x4a, 0xde, 0x17, 0x36 -}; - -CY_ALIGN(4) const uint8_t eccP521Polynomial[CY_CRYPTO_ECC_P521_BYTE_SIZE] = -{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x01 -}; - -CY_ALIGN(4) const uint8_t eccP521PolyBarrett[CY_CRYPTO_ECC_P521_BYTE_SIZE] = -{ /* pre-calculated */ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02 -}; - -CY_ALIGN(4) const uint8_t eccP521Order[CY_CRYPTO_ECC_P521_BYTE_SIZE] = -{ - 0x09, 0x64, 0x38, 0x91, 0x1E, 0xB7, 0x6F, 0xBB, - 0xAE, 0x47, 0x9C, 0x89, 0xB8, 0xC9, 0xB5, 0x3B, - 0xD0, 0xA5, 0x09, 0xF7, 0x48, 0x01, 0xCC, 0x7F, - 0x6B, 0x96, 0x2F, 0xBF, 0x83, 0x87, 0x86, 0x51, - 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x01 -}; - -/* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */ -CY_ALIGN(4) const uint8_t eccP521OrderBarrett[CY_CRYPTO_ECC_P521_BYTE_SIZE] = -{ /* pre-calculated */ - 0xf7, 0x9b, 0xc7, 0x6e, 0xe1, 0x48, 0x90, 0x44, - 0x51, 0xb8, 0x63, 0x76, 0x47, 0x36, 0x4a, 0xc4, - 0x2f, 0x5a, 0xf6, 0x08, 0xb7, 0xfe, 0x33, 0x80, - 0x94, 0x69, 0xd0, 0x40, 0x7c, 0x78, 0x79, 0xae, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02 -}; - -/* base point x: "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */ -CY_ALIGN(4) const uint8_t eccP521BasePointX[CY_CRYPTO_ECC_P521_BYTE_SIZE] = -{ - 0x66, 0xbd, 0xe5, 0xc2, 0x31, 0x7e, 0x7e, 0xf9, - 0x9b, 0x42, 0x6a, 0x85, 0xc1, 0xb3, 0x48, 0x33, - 0xde, 0xa8, 0xff, 0xa2, 0x27, 0xc1, 0x1d, 0xfe, - 0x28, 0x59, 0xe7, 0xef, 0x77, 0x5e, 0x4b, 0xa1, - 0xba, 0x3d, 0x4d, 0x6b, 0x60, 0xaf, 0x28, 0xf8, - 0x21, 0xb5, 0x3f, 0x05, 0x39, 0x81, 0x64, 0x9c, - 0x42, 0xb4, 0x95, 0x23, 0x66, 0xcb, 0x3e, 0x9e, - 0xcd, 0xe9, 0x04, 0x04, 0xb7, 0x06, 0x8e, 0x85, - 0xc6, 0x00 -}; - -/* base point y: "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */ -CY_ALIGN(4) const uint8_t eccP521BasePointY[CY_CRYPTO_ECC_P521_BYTE_SIZE] = -{ - 0x50, 0x66, 0xd1, 0x9f, 0x76, 0x94, 0xbe, 0x88, - 0x40, 0xc2, 0x72, 0xa2, 0x86, 0x70, 0x3c, 0x35, - 0x61, 0x07, 0xad, 0x3f, 0x01, 0xb9, 0x50, 0xc5, - 0x40, 0x26, 0xf4, 0x5e, 0x99, 0x72, 0xee, 0x97, - 0x2c, 0x66, 0x3e, 0x27, 0x17, 0xbd, 0xaf, 0x17, - 0x68, 0x44, 0x9b, 0x57, 0x49, 0x44, 0xf5, 0x98, - 0xd9, 0x1b, 0x7d, 0x2c, 0xb4, 0x5f, 0x8a, 0x5c, - 0x04, 0xc0, 0x3b, 0x9a, 0x78, 0x6a, 0x29, 0x39, - 0x18, 0x01 -}; - -const cy_stc_crypto_ecc_dp_type eccDomainParams[] = -{ - { - CY_CRYPTO_ECC_ECP_NONE, - 0, - NULL, - CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }, - { - CY_CRYPTO_ECC_ECP_SECP192R1, - CY_CRYPTO_ECC_P192_SIZE, - "NIST P-192", - CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG, - /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF" */ - eccP192Polynomial, - /* barrett_p: "1000000000000000000000000000000010000000000000001" */ - eccP192PolyBarrett, - /* order: "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831" */ - eccP192Order, - /* barrett_o: "1000000000000000000000000662107c9eb94364e4b2dd7cf" */ - eccP192OrderBarrett, - /* base point x: "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" */ - eccP192BasePointX, - /* base point y: "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811" */ - eccP192BasePointY - }, - { - CY_CRYPTO_ECC_ECP_SECP224R1, - CY_CRYPTO_ECC_P224_SIZE, - "NIST P-224", - CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG, - /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001" */ - eccP224Polynomial, - /* barrett_p: "100000000000000000000000000000000ffffffffffffffffffffffff" */ - eccP224PolyBarrett, - /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D" */ - eccP224Order, - /* barrett_o: "10000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3" */ - eccP224OrderBarrett, - /* Gx - base point x: "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" */ - eccP224BasePointX, - /* Gy - base point y: "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34" */ - eccP224BasePointY - }, - { - CY_CRYPTO_ECC_ECP_SECP256R1, - CY_CRYPTO_ECC_P256_SIZE, - "NIST P-256", - CY_CRYPTO_NIST_P_BARRETT_RED_ALG, - /* prime: "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF" */ - eccP256Polynomial, - /* barrett_p: "100000000fffffffffffffffefffffffefffffffeffffffff0000000000000003" */ - eccP256PolyBarrett, - /* order: "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" */ - eccP256Order, - /* barrett_o: "100000000fffffffffffffffeffffffff43190552df1a6c21012ffd85eedf9bfe" */ - eccP256OrderBarrett, - /* Gx - base point x: "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" */ - eccP256BasePointX, - /* Gy - base point y: "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" */ - eccP256BasePointY - }, - { - CY_CRYPTO_ECC_ECP_SECP384R1, - CY_CRYPTO_ECC_P384_SIZE, - "NIST P-384", - CY_CRYPTO_NIST_P_BARRETT_RED_ALG, - /* prime: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF" */ - eccP384Polynomial, - /* barrett_p: "1000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001" */ - eccP384PolyBarrett, - /* order: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973" */ - eccP384Order, - /* barrett_o: "1000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d" */ - eccP384OrderBarrett, - /* base point x: "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" */ - eccP384BasePointX, - /* base point y: "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F" */ - eccP384BasePointY - }, - { - CY_CRYPTO_ECC_ECP_SECP521R1, - CY_CRYPTO_ECC_P521_SIZE, - "NIST P-521", - /* Currently driver uses CY_CRYPTO_NIST_P_BARRETT_RED_ALG algorithm instead of - curve specific CY_CRYPTO_NIST_P_CURVE_SPECIFIC_RED_ALG */ - CY_CRYPTO_NIST_P_BARRETT_RED_ALG, - /* prime: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" */ - eccP521Polynomial, - /* barrett_p: "20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" */ - eccP521PolyBarrett, - /* order: "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409" */ - eccP521Order, - /* barrett_o: "2000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7" */ - eccP521OrderBarrett, - /* base point x: "0C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" */ - eccP521BasePointX, - /* base point y: "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650" */ - eccP521BasePointY - } -}; - /* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_ecdsa.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_ecdsa.c index aa7144819a..9ab6d7f46b 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_ecdsa.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_ecdsa.c @@ -31,16 +31,6 @@ #include -#define ECC_ECDSA_DEBUG 0 - -#if ECC_ECDSA_DEBUG -#include "cy_crypto_core_my_support.h" -#ifndef Tb_PrintStr -#include -#define Tb_PrintStr(s) printf("%s\n", s) -#endif -#endif - /******************************************************************************* * Function Name: Cy_Crypto_Core_ECC_SignHash @@ -70,22 +60,22 @@ * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8_t *hash, uint32_t hashlen, uint8_t *sig, - cy_stc_crypto_ecc_key *key, uint8_t *messageKey) + const cy_stc_crypto_ecc_key *key, const uint8_t *messageKey) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; cy_stc_crypto_ecc_key ephKey; uint8_t myKGX[CY_CRYPTO_ECC_MAX_BYTE_SIZE]; uint8_t myKGY[CY_CRYPTO_ECC_MAX_BYTE_SIZE]; const cy_stc_crypto_ecc_dp_type *eccDp; - uint32_t mallocMask = 0; + uint32_t mallocMask = 0U; uint32_t bitsize; /* NULL parameters checking */ if ((hash != NULL) && (sig != NULL) && (key != NULL) && (messageKey != NULL)) { - myResult = CY_CRYPTO_NOT_SUPPORTED; + tmpResult = CY_CRYPTO_NOT_SUPPORTED; eccDp = Cy_Crypto_Core_ECC_GetCurveParams(key->curveID); @@ -93,44 +83,27 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 { bitsize = eccDp->size; - #if ECC_ECDSA_DEBUG - Tb_PrintStr("\necc_sign_hash() for "); - Tb_PrintStr(eccDp->name); - Tb_PrintStr("\n"); - #endif /* ECC_ECDSA_DEBUG */ - /* make ephemeral key pair */ ephKey.pubkey.x = myKGX; ephKey.pubkey.y = myKGY; - myResult = Cy_Crypto_Core_ECC_MakePublicKey(base, key->curveID, messageKey, &ephKey); + tmpResult = Cy_Crypto_Core_ECC_MakePublicKey(base, key->curveID, messageKey, &ephKey); - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = CY_CRYPTO_BAD_PARAMS; + tmpResult = CY_CRYPTO_BAD_PARAMS; - int dividend = 0; /* for whatever reason Crypto_EC_DivMod only works if dividend is in register 0 */ - int p_temp = 8; - int p_r = 9; - int p_s = 10; - int p_d = 11; - - #if ECC_ECDSA_DEBUG - Tb_PrintStr("%10s: \t", "hash"); - Crypto_PrintNumber((uint8_t *)hash, hashlen); - - Tb_PrintStr("%10s: \t", "k"); - Crypto_PrintNumber(messageKey, CY_CRYPTO_BYTE_SIZE_OF_BITS(bitsize)); - - Tb_PrintStr("%10s: \t", "x1"); - Crypto_PrintNumber((uint8_t *)ephKey.pubkey.x, CY_CRYPTO_BYTE_SIZE_OF_BITS(bitsize)); - #endif /* ECC_ECDSA_DEBUG */ + uint32_t dividend = 0U; /* for whatever reason Crypto_EC_DivMod only works if dividend is in register 0 */ + uint32_t p_temp = 8U; + uint32_t p_r = 9U; + uint32_t p_s = 10U; + uint32_t p_d = 11U; /* load values needed for reduction modulo order of the base point */ CY_CRYPTO_VU_ALLOC_MEM (base, VR_P, bitsize); Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, (uint8_t *)eccDp->order, bitsize); - CY_CRYPTO_VU_ALLOC_MEM (base, VR_BARRETT, bitsize + 1); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_BARRETT, bitsize + 1U); Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, (uint8_t *)eccDp->barrett_o, bitsize); CY_CRYPTO_VU_ALLOC_MEM (base, p_r, bitsize); @@ -140,7 +113,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 if (!Cy_Crypto_Core_Vu_IsRegZero(base, p_r)) { - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; CY_CRYPTO_VU_ALLOC_MEM (base, p_d, bitsize); CY_CRYPTO_VU_ALLOC_MEM (base, p_s, bitsize); @@ -162,15 +135,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 /* r = x1 mod n */ Cy_Crypto_Core_Vu_GetMemValue (base, sig, p_r, bitsize); - #if ECC_ECDSA_DEBUG - Tb_PrintStr("x1 after reduction modulo order: "); - Crypto_RegMemNumberPrint(p_r); - #endif /* ECC_ECDSA_DEBUG */ - if (Cy_Crypto_Core_Vu_IsRegZero(base, p_r)) { /* R is zero!!! */ - myResult = CY_CRYPTO_HW_ERROR; + tmpResult = CY_CRYPTO_HW_ERROR; } } else @@ -180,14 +148,14 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 Cy_Crypto_Core_MemCpy(base, sig, ephKey.pubkey.x, (uint16_t)CY_CRYPTO_BYTE_SIZE_OF_BITS(bitsize)); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { /* find s = (e + d*r)/k */ /* load signing private key */ Cy_Crypto_Core_Vu_SetMemValue (base, p_d, (uint8_t *)key->k, bitsize); - /* use barrett reduction algorithm for operations modulo n (order of the base point) */ + /* use Barrett reduction algorithm for operations modulo n (order of the base point) */ Cy_Crypto_Core_EC_NistP_SetRedAlg(CY_CRYPTO_NIST_P_BARRETT_RED_ALG); /* d*r mod n */ @@ -202,7 +170,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 } else { - Cy_Crypto_Core_Vu_SetMemValue (base, p_d, (uint8_t *)hash, hashlen * 8); + Cy_Crypto_Core_Vu_SetMemValue (base, p_d, (uint8_t *)hash, hashlen * 8U); } Cy_Crypto_Core_Vu_SetMemValue (base, p_r, messageKey, bitsize); @@ -226,14 +194,8 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 } else { - myResult = CY_CRYPTO_HW_ERROR; + tmpResult = CY_CRYPTO_HW_ERROR; } - - #if ECC_ECDSA_DEBUG - Crypto_PrintRegister(p_r, "k"); - Crypto_PrintRegister(p_s, "(e+d*r)/k"); - #endif /* ECC_ECDSA_DEBUG */ - } } @@ -243,7 +205,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 } } - return (myResult); + return (tmpResult); } @@ -276,47 +238,40 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_SignHash(CRYPTO_Type *base, const uint8 *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, const uint8_t *sig, const uint8_t *hash, uint32_t hashlen, - uint8_t *stat, cy_stc_crypto_ecc_key *key) + uint8_t *stat, const cy_stc_crypto_ecc_key *key) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; const cy_stc_crypto_ecc_dp_type *eccDp; uint32_t bitsize; - uint32_t mallocMask = 0; + uint32_t mallocMask = 0U; /* NULL parameters checking */ if ((sig != NULL) && (hash != NULL) && (stat != NULL) && (key != NULL)) { - myResult = CY_CRYPTO_NOT_SUPPORTED; + tmpResult = CY_CRYPTO_NOT_SUPPORTED; eccDp = Cy_Crypto_Core_ECC_GetCurveParams(key->curveID); if (eccDp != NULL) { - - #if ECC_ECDSA_DEBUG - Tb_PrintStr("\necc_verify_hash() for "); - Tb_PrintStr((char *)eccDp->name); - Tb_PrintStr("\n"); - #endif /* ECC_ECDSA_DEBUG */ - bitsize = eccDp->size; - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; - int dividend = 0; /* for whatever reason Crypto_EC_DivMod only works if dividend is in register 0 */ - int p_r = 4; - int p_s = 5; - int p_u1 = 6; - int p_u2 = 7; - int p_o = 8; - int p_gx = 9; - int p_gy = 10; - int p_qx = 11; - int p_qy = 12; + uint32_t dividend = 0u; /* for whatever reason Crypto_EC_DivMod only works if dividend is in register 0 */ + uint32_t p_r = 4U; + uint32_t p_s = 5U; + uint32_t p_u1 = 6U; + uint32_t p_u2 = 7U; + uint32_t p_o = 8U; + uint32_t p_gx = 9U; + uint32_t p_gy = 10U; + uint32_t p_qx = 11U; + uint32_t p_qy = 12U; - /* use barrett reduction algorithm for operations modulo n (order of the base point) */ + /* use Barrett reduction algorithm for operations modulo n (order of the base point) */ Cy_Crypto_Core_EC_NistP_SetRedAlg(CY_CRYPTO_NIST_P_BARRETT_RED_ALG); Cy_Crypto_Core_EC_NistP_SetMode(bitsize); @@ -325,13 +280,13 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, CY_CRYPTO_VU_ALLOC_MEM (base, VR_P, bitsize); Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, (uint8_t *)eccDp->order, bitsize); - CY_CRYPTO_VU_ALLOC_MEM (base, VR_BARRETT, bitsize + 1); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, (uint8_t *)eccDp->barrett_o, bitsize + 1); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_BARRETT, bitsize + 1U); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, (uint8_t *)eccDp->barrett_o, bitsize + 1U); /*******************************************************************************/ /* check that R and S are within the valid range, i.e. 0 < R < n and 0 < S < n */ - CY_CRYPTO_VU_ALLOC_MEM (base, p_r, bitsize); - CY_CRYPTO_VU_ALLOC_MEM (base, p_s, bitsize); + CY_CRYPTO_VU_ALLOC_MEM (base, p_r, bitsize); + CY_CRYPTO_VU_ALLOC_MEM (base, p_s, bitsize); Cy_Crypto_Core_Vu_SetMemValue (base, p_r, (uint8_t *)sig, bitsize); Cy_Crypto_Core_Vu_SetMemValue (base, p_s, (uint8_t *)&sig[CY_CRYPTO_BYTE_SIZE_OF_BITS(bitsize)], bitsize); @@ -342,28 +297,28 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, if (Cy_Crypto_Core_Vu_IsRegZero(base, p_r)) { /* R is zero!!! */ - myResult = CY_CRYPTO_BAD_PARAMS; + tmpResult = CY_CRYPTO_BAD_PARAMS; } if (!Cy_Crypto_Core_Vu_IsRegLess(base, p_r, VR_P)) { /* R is not less than n!!! */ - myResult = CY_CRYPTO_BAD_PARAMS; + tmpResult = CY_CRYPTO_BAD_PARAMS; } if (Cy_Crypto_Core_Vu_IsRegZero(base, p_s)) { /* S is zero!!! */ - myResult = CY_CRYPTO_BAD_PARAMS; + tmpResult = CY_CRYPTO_BAD_PARAMS; } if (!Cy_Crypto_Core_Vu_IsRegLess(base, p_s, VR_P)) { /* S is not less than n!!! */ - myResult = CY_CRYPTO_BAD_PARAMS; + tmpResult = CY_CRYPTO_BAD_PARAMS; } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { CY_CRYPTO_VU_ALLOC_MEM (base, dividend, bitsize); - CY_CRYPTO_VU_ALLOC_MEM (base, p_o, bitsize); + CY_CRYPTO_VU_ALLOC_MEM (base, p_o, bitsize); CY_CRYPTO_VU_ALLOC_MEM (base, p_u1, bitsize); CY_CRYPTO_VU_ALLOC_MEM (base, p_u2, bitsize); @@ -386,41 +341,25 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, } else { - Cy_Crypto_Core_Vu_SetMemValue (base, p_u1, (uint8_t *)hash, hashlen * 8); + Cy_Crypto_Core_Vu_SetMemValue (base, p_u1, (uint8_t *)hash, hashlen * 8U); } - #if ECC_ECDSA_DEBUG - Crypto_PrintRegister(p_u1, "hash"); - Crypto_PrintRegister(p_r, "R"); - Crypto_PrintRegister(p_s, "S"); - Tb_PrintStr("\n"); - #endif /* ECC_ECDSA_DEBUG */ - /* w = s^-1 mod n */ CY_CRYPTO_VU_SET_TO_ONE(base, dividend); Cy_Crypto_Core_EC_DivMod(base, p_s, dividend, p_s, bitsize); - #if ECC_ECDSA_DEBUG - Crypto_PrintRegister(p_s, "w"); - #endif /* ECC_ECDSA_DEBUG */ - /* u1 = e*w mod n */ Cy_Crypto_Core_EC_MulMod(base, p_u1, p_u1, p_s, bitsize); /* u2 = r*w mod n */ - Cy_Crypto_Core_EC_MulMod(base, p_u2, p_r, p_s, bitsize); - - #if ECC_ECDSA_DEBUG - Crypto_PrintRegister(p_u1, "u1"); - Crypto_PrintRegister(p_u2, "u2"); - #endif /* ECC_ECDSA_DEBUG */ + Cy_Crypto_Core_EC_MulMod(base, p_u2, p_r, p_s, bitsize); /* Initialize point multiplication */ Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); - /* load prime, order and barrett coefficient */ - Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, (uint8_t *)eccDp->prime, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, p_o, (uint8_t *)eccDp->order, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, (uint8_t *)eccDp->barrett_p, bitsize + 1); + /* load prime, order and Barrett coefficient */ + Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, (uint8_t *)eccDp->prime, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, p_o, (uint8_t *)eccDp->order, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, (uint8_t *)eccDp->barrett_p, bitsize + 1U); /* load base Point G */ Cy_Crypto_Core_Vu_SetMemValue (base, p_gx, (uint8_t *)eccDp->Gx, bitsize); @@ -439,40 +378,22 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, /* u2 * Qa */ Cy_Crypto_Core_EC_NistP_PointMul(base, p_qx, p_qy, p_u2, p_o, bitsize); - #if ECC_ECDSA_DEBUG - Tb_PrintStr("u1 * G: \n"); - Crypto_PrintRegister(p_gx, " u1*G(x)"); - Crypto_PrintRegister(p_gy, " u1*G(y)"); - Tb_PrintStr("u2 * Q: \n"); - Crypto_PrintRegister(p_qx, " u2*Q(x)"); - Crypto_PrintRegister(p_qy, " u2*Q(x)"); - #endif /* ECC_ECDSA_DEBUG */ - /* P = u1 * G + u2 * Qa. Only Px is needed */ Cy_Crypto_Core_EC_SubMod(base, dividend, p_qy, p_gy); /* (y2-y1) */ Cy_Crypto_Core_EC_SubMod(base, p_s, p_qx, p_gx); /* (x2-x1) */ Cy_Crypto_Core_EC_DivMod(base, p_s, dividend, p_s, bitsize); /* s = (y2-y1)/(x2-x1) */ - #if ECC_ECDSA_DEBUG - Tb_PrintStr("Point addition: \n"); - Crypto_PrintRegister(p_s, "s"); - #endif /* ECC_ECDSA_DEBUG */ - Cy_Crypto_Core_EC_SquareMod (base, p_s, p_s, bitsize); /* s^2 */ Cy_Crypto_Core_EC_SubMod (base, p_s, p_s, p_gx); /* s^2 - x1 */ Cy_Crypto_Core_EC_SubMod (base, p_s, p_s, p_qx); /* s^2 - x1 - x2 which is Px mod n */ - #if ECC_ECDSA_DEBUG - Crypto_PrintRegister(p_s, "px"); - #endif /* ECC_ECDSA_DEBUG */ - if (Cy_Crypto_Core_Vu_IsRegEqual(base, p_s, p_r)) { - *stat = 1; + *stat = 1u; } else { - *stat = 0; + *stat = 0u; } } @@ -481,7 +402,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_VerifyHash(CRYPTO_Type *base, } } - return (myResult); + return (tmpResult); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_key_gen.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_key_gen.c index 2bc05400f4..43a8018b58 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_key_gen.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_key_gen.c @@ -29,11 +29,8 @@ #include "cy_crypto_core_vu.h" #include "cy_crypto_core_trng.h" -#define CY_ECC_CONFIG_TR_GARO_CTL 0x6C740B8Du -#define CY_ECC_CONFIG_TR_FIRO_CTL 0x52D246E1u - -/* print some debug information. enabling this will render meaningless all time measurements */ -#define ECC_KEY_GEN_DEBUG 0 +#define CY_ECC_CONFIG_TR_GARO_CTL 0x6C740B8DuL +#define CY_ECC_CONFIG_TR_FIRO_CTL 0x52D246E1uL /******************************************************************************* @@ -65,152 +62,135 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakeKeyPair(CRYPTO_Type *base, cy_func_get_random_data_t GetRandomDataFunc, void *randomDataInfo) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_NOT_SUPPORTED; + cy_stc_crypto_ecc_dp_type *eccDp = Cy_Crypto_Core_ECC_GetCurveParams(curveID); - if (eccDp == NULL || key == NULL) + if ((eccDp != NULL) && (key != NULL)) { - /* NULL parameter detected in Cy_Crypto_Core_ECC_MakeKeyPair()!!! */ - return CY_CRYPTO_NOT_SUPPORTED; - } + tmpResult = CY_CRYPTO_SUCCESS; -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("\necc_make_key() for "); - Tb_PrintStr((int8_t *)eccDp->name); - Tb_PrintStr("\n"); -#endif /* ECC_KEY_GEN_DEBUG */ + uint32_t bitsize = eccDp->size; - int bitsize = eccDp->size; + /* used VU registers. Same values as in crypto_NIST_P.c */ + uint32_t p_temp = 8u; /* temporal values */ + uint32_t p_order = 9u; /* order of the curve */ + uint32_t p_d = 10u; /* private key */ + uint32_t p_x = 11u; /* x coordinate */ + uint32_t p_y = 12u; /* y coordinate */ - /* used VU registers. Same values as in crypto_NIST_P.c */ - int p_temp = 8; /* temporal values */ - int p_order = 9; /* order of the curve */ - int p_d = 10; /* private key */ - int p_x = 11; /* x coordinate */ - int p_y = 12; /* y coordinate */ + CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, p_order, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1U); + CY_CRYPTO_VU_ALLOC_MEM(base, p_x, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, p_y, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, p_order, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1); - CY_CRYPTO_VU_ALLOC_MEM(base, p_x, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, p_y, bitsize); + /*************************************************************** + * Apply domain parameters + ***************************************************************/ + /* load prime and order defining the curve as well as the Barrett coefficient. */ + /* P and BARRETT_U are "globally" defined in cy_crypto_core_ecc.h */ + Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->prime, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, p_order, eccDp->order, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_p, bitsize + 1U); - /*************************************************************** - * Apply domain parameters - ***************************************************************/ - /* load prime and order defining the curve as well as the barrett coefficient. */ + /* Base Point, G = (p_x, p_y) */ + Cy_Crypto_Core_Vu_SetMemValue (base, p_x, eccDp->Gx, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, p_y, eccDp->Gy, bitsize); - /* P and BARRETT_U are "globally" defined in cy_crypto_core_ecc.h */ - Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->prime, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, p_order, eccDp->order, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_p, bitsize + 1); + Cy_Crypto_Core_EC_NistP_SetMode(bitsize); + Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); - /* Base Point, G = (p_x, p_y) */ - Cy_Crypto_Core_Vu_SetMemValue (base, p_x, eccDp->Gx, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, p_y, eccDp->Gy, bitsize); - - Cy_Crypto_Core_EC_NistP_SetMode(bitsize); - Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); - - - /*************************************************************** - * generate random string - ***************************************************************/ - if (GetRandomDataFunc != NULL) - { - GetRandomDataFunc( randomDataInfo, key->k, (bitsize + 7u) >> 3u ); - } - else - { - for (int i = 0, randomsize = bitsize; randomsize > 0; randomsize-=32, i++) + /*************************************************************** + * generate random string + ***************************************************************/ + if (GetRandomDataFunc != NULL) { - int randombits = CY_CRYPTO_MIN(randomsize, 32); + (void)GetRandomDataFunc( randomDataInfo, (uint8_t*)key->k, ((bitsize + 7U) >> 3U) ); + } + else + { + uint32_t i = 0U; + int32_t randomsize = (int32_t)bitsize; + cy_en_crypto_status_t status = CY_CRYPTO_SUCCESS; - cy_en_crypto_status_t error = Cy_Crypto_Core_Trng(base, CY_ECC_CONFIG_TR_GARO_CTL, CY_ECC_CONFIG_TR_FIRO_CTL, - randombits, &((uint32_t *)key->k)[i]); - - if (CY_CRYPTO_SUCCESS != error) + while ((randomsize > 0) && (CY_CRYPTO_SUCCESS == status)) { - return CY_CRYPTO_HW_ERROR; + uint32_t randombits = (uint32_t)CY_CRYPTO_MIN(randomsize, 32); + + status = Cy_Crypto_Core_Trng(base, CY_ECC_CONFIG_TR_GARO_CTL, CY_ECC_CONFIG_TR_FIRO_CTL, + randombits, &((uint32_t *)key->k)[i]); + randomsize -= 32; + i++; + + if (CY_CRYPTO_SUCCESS != status) + { + tmpResult = CY_CRYPTO_HW_ERROR; + } } } + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /*************************************************************** + * Load random data into VU + ***************************************************************/ + CY_CRYPTO_VU_ALLOC_MEM(base, p_d, bitsize); + Cy_Crypto_Core_Vu_SetMemValue(base, p_d, (uint8_t *)key->k, bitsize); + + /* check that the key is smaller than the order of base point */ + CY_CRYPTO_VU_CMP_SUB (base, p_d, p_order); /* C = (a >= b) */ + uint32_t status = Cy_Crypto_Core_Vu_StatusRead(base); + + if (0u != (status & CY_CRYPTO_VU_STATUS_CARRY_BIT)) + { + /* random data >= order, needs reduction */ + + CY_CRYPTO_VU_PUSH_REG(base); + + /* load values needed for reduction modulo curve order */ + CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->order, bitsize); + + CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1u); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_o, bitsize + 1u); + + CY_CRYPTO_VU_ALLOC_MEM(base, p_temp, bitsize); + CY_CRYPTO_VU_MOV(base, p_temp, p_d); + + /* z = x % mod */ + Cy_Crypto_Core_EC_Bar_MulRed(base, p_d, p_temp, bitsize); + + CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(p_temp) | CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT)); + + Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key->k, p_d, bitsize); + + /* restore previous prime and Barrett values */ + CY_CRYPTO_VU_POP_REG(base); + } + + /* + * Make the public key + * EC scalar multiplication - X,Y-only co-Z arithmetic + */ + Cy_Crypto_Core_EC_NistP_PointMul(base, p_x, p_y, p_d, p_order, bitsize); + + Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key->pubkey.x, p_x, bitsize); + Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key->pubkey.y, p_y, bitsize); + + key->type = PK_PRIVATE; + key->curveID = curveID; + + tmpResult = CY_CRYPTO_SUCCESS; + } + + CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT) | + CY_CRYPTO_VU_REG_BIT(p_x) | CY_CRYPTO_VU_REG_BIT(p_y) | + CY_CRYPTO_VU_REG_BIT(p_order) | CY_CRYPTO_VU_REG_BIT(p_d)); } - - /*************************************************************** - * Load random data into VU - ***************************************************************/ - CY_CRYPTO_VU_ALLOC_MEM(base, p_d, bitsize); - Cy_Crypto_Core_Vu_SetMemValue(base, p_d, (uint8_t *)key->k, bitsize); - -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("random data: "); - Crypto_RegMemNumberPrint(p_d); - Tb_PrintStr("p_order: "); - Crypto_RegMemNumberPrint(p_order); -#endif /*ECC_KEY_GEN_DEBUG */ - - /* check that the key is smaller than the order of base point */ - CY_CRYPTO_VU_CMP_SUB (base, p_d, p_order); /* C = (a >= b) */ - uint16_t status = Cy_Crypto_Core_Vu_StatusRead(base); - - if (status & CY_CRYPTO_VU_STATUS_CARRY_BIT) - { - /* random data >= order, needs reduction */ - - CY_CRYPTO_VU_PUSH_REG(base); - - /* load values needed for reduction modulo curve order */ - CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->order, bitsize); - - CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1u); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_o, bitsize + 1u); - - CY_CRYPTO_VU_ALLOC_MEM(base, p_temp, bitsize); - CY_CRYPTO_VU_MOV(base, p_temp, p_d); - - /* z = x % mod */ - Cy_Crypto_Core_EC_Bar_MulRed(base, p_d, p_temp, bitsize); - - CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(p_temp) | CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT)); - - Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key->k, p_d, bitsize); - - /* restore previous prime and barrett values */ - CY_CRYPTO_VU_POP_REG(base); - -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("random data after reduction modulo order: "); - Crypto_RegMemNumberPrint(p_d); -#endif /* ECC_KEY_GEN_DEBUG */ - - } - else - { - /* carry is clear, i. e. p_d < p_order */ - } - - /* make the public key - * EC scalar multiplication - X,Y-only co-Z arithmetic - */ -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("Doing scalar multiplication\n"); -#endif /* ECC_KEY_GEN_DEBUG */ - - Cy_Crypto_Core_EC_NistP_PointMul(base, p_x, p_y, p_d, p_order, bitsize); - - Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key->pubkey.x, p_x, bitsize); - Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key->pubkey.y, p_y, bitsize); - - key->type = PK_PRIVATE; - key->curveID = curveID; - - CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT) | - CY_CRYPTO_VU_REG_BIT(p_x) | CY_CRYPTO_VU_REG_BIT(p_y) | - CY_CRYPTO_VU_REG_BIT(p_order) | CY_CRYPTO_VU_REG_BIT(p_d)); - - return CY_CRYPTO_SUCCESS; + return (tmpResult); } @@ -242,105 +222,88 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakePrivateKey(CRYPTO_Type *base, uint8_t *key, cy_func_get_random_data_t GetRandomDataFunc, void *randomDataInfo) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; + const cy_stc_crypto_ecc_dp_type *eccDp = Cy_Crypto_Core_ECC_GetCurveParams(curveID); - if (eccDp == NULL || key == NULL) + if ((eccDp != NULL) && (key != NULL)) { - /* NULL parameter detected in Cy_Crypto_Core_ECC_MakeKey()!!! */ - return CY_CRYPTO_NOT_SUPPORTED; - } + tmpResult = CY_CRYPTO_SUCCESS; -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("\necc_make_key() for "); - Tb_PrintStr((int8_t *)eccDp->name); - Tb_PrintStr("\n"); -#endif /* ECC_KEY_GEN_DEBUG */ + uint32_t bitsize = eccDp->size; - int bitsize = eccDp->size; + uint32_t p_temp = 8u; /* temporal values */ + uint32_t p_d = 10u; /* private key */ - int p_temp = 8; /* temporal values */ - int p_d = 10; /* private key */ - - /* generate random string */ - if (GetRandomDataFunc != NULL) - { - GetRandomDataFunc( randomDataInfo, key, (bitsize + 7u) >> 3u ); - } - else - { - for (int i = 0, randomsize = bitsize; randomsize > 0; randomsize-=32, i++) + /* generate random string */ + if (GetRandomDataFunc != NULL) { - int randombits = CY_CRYPTO_MIN(randomsize, 32); + (void)GetRandomDataFunc( randomDataInfo, key, ((bitsize + 7U) >> 3U) ); + } + else + { + uint32_t i = 0U; + int32_t randomsize = (int32_t)bitsize; + cy_en_crypto_status_t status = CY_CRYPTO_SUCCESS; - cy_en_crypto_status_t error = Cy_Crypto_Core_Trng(base, CY_ECC_CONFIG_TR_GARO_CTL, CY_ECC_CONFIG_TR_FIRO_CTL, - randombits, &((uint32_t *)key)[i]); - - if (CY_CRYPTO_SUCCESS != error) + while ((randomsize > 0) && (CY_CRYPTO_SUCCESS == status)) { - return CY_CRYPTO_HW_ERROR; + uint32_t randombits = (uint32_t)CY_CRYPTO_MIN(randomsize, 32); + + status = Cy_Crypto_Core_Trng(base, CY_ECC_CONFIG_TR_GARO_CTL, CY_ECC_CONFIG_TR_FIRO_CTL, + randombits, &((uint32_t *)key)[i]); + randomsize -= 32; + i++; + + if (CY_CRYPTO_SUCCESS != status) + { + tmpResult = CY_CRYPTO_HW_ERROR; + } } } + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /* load prime and order defining the curve as well as the barrett coefficient. */ + /* P and BARRETT_U are "globally" defined in cy_crypto_core_ecc.h */ + CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1u); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->order, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_o, bitsize + 1u); + + /* Load random data into VU */ + CY_CRYPTO_VU_ALLOC_MEM(base, p_d, bitsize); + Cy_Crypto_Core_Vu_SetMemValue(base, p_d, (uint8_t *)key, bitsize); + + CY_CRYPTO_VU_ALLOC_MEM(base, p_temp, bitsize); + CY_CRYPTO_VU_MOV(base, p_temp, p_d); + + /* check that the key is smaller than the order of base point */ + CY_CRYPTO_VU_CMP_SUB (base, p_d, VR_P); /* C = (a >= b) */ + uint32_t status = Cy_Crypto_Core_Vu_StatusRead(base); + + if (0u != (status & CY_CRYPTO_VU_STATUS_CARRY_BIT)) + { + /* private key (random data) >= order, needs reduction */ + + /* use Barrett reduction algorithm for operations modulo n (order of the base point) */ + Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); + Cy_Crypto_Core_EC_NistP_SetMode(bitsize); + + /* z = x % mod */ + Cy_Crypto_Core_EC_Bar_MulRed(base, p_d, p_temp, bitsize); + + Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key, p_d, bitsize); + } + + CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT) | + CY_CRYPTO_VU_REG_BIT(p_d) | CY_CRYPTO_VU_REG_BIT(p_temp)); + + tmpResult = CY_CRYPTO_SUCCESS; + } } -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("private key: "); - Crypto_PrintNumber((uint8_t *)key, CY_CRYPTO_BYTE_SIZE_OF_BITS(bitsize)); -#endif /* ECC_KEY_GEN_DEBUG */ - - - /* load prime and order defining the curve as well as the barrett coefficient. */ - /* P and BARRETT_U are "globally" defined in cy_crypto_core_ecc.h */ - CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->order, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_o, bitsize + 1); - - /* Load random data into VU */ - CY_CRYPTO_VU_ALLOC_MEM(base, p_d, bitsize); - Cy_Crypto_Core_Vu_SetMemValue(base, p_d, (uint8_t *)key, bitsize); - - CY_CRYPTO_VU_ALLOC_MEM(base, p_temp, bitsize); - CY_CRYPTO_VU_MOV(base, p_temp, p_d); - -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("random data: "); - Crypto_RegMemNumberPrint(p_d); - Tb_PrintStr("p_order: "); - Crypto_RegMemNumberPrint(VR_P); -#endif /* ECC_KEY_GEN_DEBUG */ - - /* check that the key is smaller than the order of base point */ - CY_CRYPTO_VU_CMP_SUB (base, p_d, VR_P); /* C = (a >= b) */ - uint16_t status = Cy_Crypto_Core_Vu_StatusRead(base); - - if (status & CY_CRYPTO_VU_STATUS_CARRY_BIT) - { - /* private key (random data) >= order, needs reduction */ - - /* use barrett reduction algorithm for operations modulo n (order of the base point) */ - Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); - Cy_Crypto_Core_EC_NistP_SetMode(bitsize); - - /* z = x % mod */ - Cy_Crypto_Core_EC_Bar_MulRed(base, p_d, p_temp, bitsize); - - Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)key, p_d, bitsize); - -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("private key after reduction modulo order: "); - Crypto_RegMemNumberPrint(p_d); -#endif /* ECC_KEY_GEN_DEBUG */ - - } - else - { - /* carry is clear, i. e. p_d < p_order */ - } - - CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT) | - CY_CRYPTO_VU_REG_BIT(p_d) | CY_CRYPTO_VU_REG_BIT(p_temp)); - - return CY_CRYPTO_SUCCESS; + return (tmpResult); } @@ -367,71 +330,66 @@ cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakePrivateKey(CRYPTO_Type *base, *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_ECC_MakePublicKey(CRYPTO_Type *base, cy_en_crypto_ecc_curve_id_t curveID, - uint8_t *privateKey, + const uint8_t *privateKey, cy_stc_crypto_ecc_key *publicKey) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; + cy_stc_crypto_ecc_dp_type *eccDp = Cy_Crypto_Core_ECC_GetCurveParams(curveID); - if (eccDp == NULL || privateKey == NULL || publicKey == NULL) + if ((eccDp != NULL) && (privateKey != NULL) && (publicKey != NULL)) { - /* NULL parameter detected in Cy_Crypto_Core_ECC_MakeKey()!!! */ - return CY_CRYPTO_NOT_SUPPORTED; + uint32_t bitsize = eccDp->size; + + uint32_t p_order = 9u; /* order of the curve */ + uint32_t p_d = 10u; /* private key */ + uint32_t p_x = 11u; /* x coordinate */ + uint32_t p_y = 12u; /* y coordinate */ + + /* make the public key + * EC scalar multiplication - X,Y-only co-Z arithmetic + */ + CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, p_order, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1u); + CY_CRYPTO_VU_ALLOC_MEM(base, p_x, bitsize); + CY_CRYPTO_VU_ALLOC_MEM(base, p_y, bitsize); + + /* Apply domain parameters */ + + /* load prime and order defining the curve as well as the barrett coefficient. */ + + /* P and BARRETT_U are "globally" defined in cy_crypto_core_ecc.h */ + Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->prime, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, p_order, eccDp->order, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_p, bitsize + 1u); + + /*Base Point, G = (p_x, p_y) */ + Cy_Crypto_Core_Vu_SetMemValue (base, p_x, eccDp->Gx, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, p_y, eccDp->Gy, bitsize); + + Cy_Crypto_Core_EC_NistP_SetMode(bitsize); + Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); + + /* Load random data into VU */ + CY_CRYPTO_VU_ALLOC_MEM(base, p_d, bitsize); + Cy_Crypto_Core_Vu_SetMemValue(base, p_d, (uint8_t *)privateKey, bitsize); + + Cy_Crypto_Core_EC_NistP_PointMul(base, p_x, p_y, p_d, p_order, bitsize); + + Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)publicKey->pubkey.x, p_x, bitsize); + Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)publicKey->pubkey.y, p_y, bitsize); + + publicKey->type = PK_PUBLIC; + publicKey->curveID = curveID; + + CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(p_order) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT) | + CY_CRYPTO_VU_REG_BIT(p_x) | CY_CRYPTO_VU_REG_BIT(p_y) | CY_CRYPTO_VU_REG_BIT(p_d)); + + tmpResult = CY_CRYPTO_SUCCESS; } -#if ECC_KEY_GEN_DEBUG - Tb_PrintStr("\necc_make public key() for "); - Tb_PrintStr((int8_t *)eccDp->name); - Tb_PrintStr("\n"); -#endif /* ECC_KEY_GEN_DEBUG */ - - int bitsize = eccDp->size; - - int p_order = 9; /* order of the curve */ - int p_d = 10; /* private key */ - int p_x = 11; /* x coordinate */ - int p_y = 12; /* y coordinate */ - - /* make the public key - * EC scalar multiplication - X,Y-only co-Z arithmetic - */ - CY_CRYPTO_VU_ALLOC_MEM(base, VR_P, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, p_order, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, VR_BARRETT, bitsize + 1); - CY_CRYPTO_VU_ALLOC_MEM(base, p_x, bitsize); - CY_CRYPTO_VU_ALLOC_MEM(base, p_y, bitsize); - - /* Apply domain parameters */ - - /* load prime and order defining the curve as well as the barrett coefficient. */ - - /* P and BARRETT_U are "globally" defined in cy_crypto_core_ecc.h */ - Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, eccDp->prime, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, p_order, eccDp->order, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, eccDp->barrett_p, bitsize + 1); - - /*Base Point, G = (p_x, p_y) */ - Cy_Crypto_Core_Vu_SetMemValue (base, p_x, eccDp->Gx, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, p_y, eccDp->Gy, bitsize); - - Cy_Crypto_Core_EC_NistP_SetMode(bitsize); - Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); - - /* Load random data into VU */ - CY_CRYPTO_VU_ALLOC_MEM(base, p_d, bitsize); - Cy_Crypto_Core_Vu_SetMemValue(base, p_d, (uint8_t *)privateKey, bitsize); - - Cy_Crypto_Core_EC_NistP_PointMul(base, p_x, p_y, p_d, p_order, bitsize); - - Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)publicKey->pubkey.x, p_x, bitsize); - Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t *)publicKey->pubkey.y, p_y, bitsize); - - publicKey->type = PK_PUBLIC; - publicKey->curveID = curveID; - - CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(VR_P) | CY_CRYPTO_VU_REG_BIT(p_order) | CY_CRYPTO_VU_REG_BIT(VR_BARRETT) | - CY_CRYPTO_VU_REG_BIT(p_x) | CY_CRYPTO_VU_REG_BIT(p_y) | CY_CRYPTO_VU_REG_BIT(p_d)); - - return CY_CRYPTO_SUCCESS; + return (tmpResult); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_nist_p.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_nist_p.c index 17718cbbd6..e73f4ddf24 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_nist_p.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_ecc_nist_p.c @@ -52,34 +52,32 @@ /*************************************************************** * Global Variables ***************************************************************/ -static int eccMode; +static cy_en_crypto_ecc_curve_id_t eccMode; static cy_en_crypto_ecc_red_mul_algs_t mul_red_alg_select = CY_CRYPTO_NIST_P_BARRETT_RED_ALG; -/* Pre-computed coefficients for shift-multiply modular reduction for P256 and P384 */ -const uint8_t P256_ShMul_COEFF[] = { - 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, - 0x00u, 0x00u, 0x00u, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0xFFu, - 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, - 0xFEu, 0xFFu, 0xFFu, 0xFFu -}; - -const uint8_t P384_ShMul_COEFF[] = { - 0x01u, 0x00u, 0x00u, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0xFFu, - 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0x00u, 0x00u, 0x00u, 0x00u, - 0x01u -}; - - - /*************************************************************** * Collection of multiplication reduction algorithms -* Method 1 (Crypto_EC_CS_MUL_Red_Pxxx): curve specific -* reduction as proposed by NIST -* Method 2 (Crypto_EC_SM_MUL_Red_Pxxx): curve specific r -* eduction based on Mersenne prime reduction approach +* Method 1: (Crypto_EC_CS_MUL_Red_Pxxx): curve specific +* reduction as proposed by NIST +* Method 2: (Crypto_EC_SM_MUL_Red_Pxxx): curve specific r +* eduction based on Mersenne prime reduction approach * Method 3: generic Barrett reduction ***************************************************************/ +static void Cy_Crypto_Core_EC_CS_MUL_Red_P192(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_CS_MUL_Red_P224(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_CS_MUL_Red_P256(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_CS_MUL_Red_P384(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_CS_MUL_Red_P521(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_SM_MUL_Red_P192(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_SM_MUL_Red_P224(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_SM_MUL_Red_P256(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_SM_MUL_Red_P384(CRYPTO_Type *base, uint32_t z, uint32_t x); +static void Cy_Crypto_Core_EC_SM_MUL_Red_P521(CRYPTO_Type *base, uint32_t z, uint32_t x); + +static void Cy_Crypto_Core_EC_CS_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size); +static void Cy_Crypto_Core_EC_SM_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size); +static void Cy_Crypto_Core_EC_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size); /*************************************************************** @@ -91,7 +89,7 @@ const uint8_t P384_ShMul_COEFF[] = { * Function Name: Cy_Crypto_Core_EC_CS_MUL_Red_P192 ****************************************************************************//** * -* Curve-specific multiplication modular reduction for P192 +* Curve-specific multiplication modular reduction for P192. * 0 <= a, b < P192 * a5..a0 * b5..b0 % P192 = t11..t0 % P192 * P192 = 2^192-2^64-1 @@ -108,52 +106,52 @@ const uint8_t P384_ShMul_COEFF[] = { * * \param z * Product = a*b [2*192 bits]. -* +* * \param x -* Result = x mod P = a*b mod P [192 bits] +* Result = x mod P = a*b mod P [192 bits]. * *******************************************************************************/ -void Cy_Crypto_Core_EC_CS_MUL_Red_P192(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_CS_MUL_Red_P192(CRYPTO_Type *base, uint32_t z, uint32_t x) { - int sh = 0; - int t1 = 2; /* 128 */ - int t2 = 3; /* 192 */ - int my_z = 4; - int my_x = 5; + uint32_t sh = 0u; + uint32_t t1 = 2u; /* 128 */ + uint32_t t2 = 3u; /* 192 */ + uint32_t my_z = 4u; + uint32_t my_x = 5u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t1, 128); - CY_CRYPTO_VU_ALLOC_MEM (base, t2, 192); + CY_CRYPTO_VU_ALLOC_MEM (base, t1, 128u); + CY_CRYPTO_VU_ALLOC_MEM (base, t2, 192u); - CY_CRYPTO_VU_SET_REG (base, sh, 192, 1); - CY_CRYPTO_VU_LSR (base, my_z, my_x, sh); /* t11..t6 */ + CY_CRYPTO_VU_SET_REG (base, sh, 192u, 1u); + CY_CRYPTO_VU_LSR (base, my_z, my_x, sh); /* t11..t6 */ - CY_CRYPTO_VU_SET_REG (base, sh, 128, 1); - CY_CRYPTO_VU_LSR (base, t1, my_z, sh); /* t11..t10 */ - CY_CRYPTO_VU_SET_REG (base, sh, 64, 1); - CY_CRYPTO_VU_LSL (base, t2, my_z, sh); /* t9..t6 * 2^64 */ + CY_CRYPTO_VU_SET_REG (base, sh, 128u, 1u); + CY_CRYPTO_VU_LSR (base, t1, my_z, sh); /* t11..t10 */ + CY_CRYPTO_VU_SET_REG (base, sh, 64u, 1u); + CY_CRYPTO_VU_LSL (base, t2, my_z, sh); /* t9..t6 * 2^64 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, my_x); /* t11..t6 + t5..t0 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, my_x); /* t11..t6 + t5..t0 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* t9..t6 * 2^64 + t11..t6 + t5..t0 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* t9..t6 * 2^64 + t11..t6 + t5..t0 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); - CY_CRYPTO_VU_LSL (base, t2, t1, sh); /* t11..t10 * 2^64 */ - CY_CRYPTO_VU_OR (base, t1, t1, t2); /* t11..t10 * 2^64 + t11..t10 */ + CY_CRYPTO_VU_LSL (base, t2, t1, sh); /* t11..t10 * 2^64 */ + CY_CRYPTO_VU_OR (base, t1, t1, t2); /* t11..t10 * 2^64 + t11..t10 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* t11..t10 * 2^64 + t11..t10 + t9..t6 * 2^64 + t11..t6 + t5..t0 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* t11..t10 * 2^64 + t11..t10 + t9..t6 * 2^64 + t11..t6 + t5..t0 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); - CY_CRYPTO_VU_FREE_MEM (base, (1 << t1) | (1 << t2)); + CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t1) | CY_CRYPTO_VU_REG_BIT(t2)); CY_CRYPTO_VU_POP_REG (base); } @@ -174,57 +172,57 @@ void Cy_Crypto_Core_EC_CS_MUL_Red_P192(CRYPTO_Type *base, int z, int x) * * \param z * Result = x mod P = a*b mod P [224 bits]. -* +* * \param x * Product = a*b [2*224 bits]. * *******************************************************************************/ -void Cy_Crypto_Core_EC_CS_MUL_Red_P224(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_CS_MUL_Red_P224(CRYPTO_Type *base, uint32_t z, uint32_t x) { - int sh = 0; - int t1 = 1; /* 224 */ - int t2 = 2; /* 224 */ - int t3 = 3; /* 224 */ - int my_z = 4; - int my_x = 5; + uint32_t sh = 0u; + uint32_t t1 = 1u; /* 224 */ + uint32_t t2 = 2u; /* 224 */ + uint32_t t3 = 3u; /* 224 */ + uint32_t my_z = 4u; + uint32_t my_x = 5u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t1, CY_CRYPTO_ECC_P224_SIZE); /* 224 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t2, CY_CRYPTO_ECC_P224_SIZE); /* 224 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t3, CY_CRYPTO_ECC_P224_SIZE); /* 224 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t1, CY_CRYPTO_ECC_P224_SIZE); /* 224 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t2, CY_CRYPTO_ECC_P224_SIZE); /* 224 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t3, CY_CRYPTO_ECC_P224_SIZE); /* 224 */ - CY_CRYPTO_VU_SET_REG (base, sh, CY_CRYPTO_ECC_P224_SIZE, 1); /* sh = 224 */ - CY_CRYPTO_VU_LSR (base, my_z, my_x, sh); /* z = t13..t7 */ + CY_CRYPTO_VU_SET_REG (base, sh, CY_CRYPTO_ECC_P224_SIZE, 1u); /* sh = 224 */ + CY_CRYPTO_VU_LSR (base, my_z, my_x, sh); /* z = t13..t7 */ - CY_CRYPTO_VU_SET_REG (base, sh, 128, 1); - CY_CRYPTO_VU_LSR (base, t1, my_z, sh); /* t1 = t13..t11 */ + CY_CRYPTO_VU_SET_REG (base, sh, 128u, 1u); + CY_CRYPTO_VU_LSR (base, t1, my_z, sh); /* t1 = t13..t11 */ - CY_CRYPTO_VU_SET_REG (base, sh, 96, 1); - CY_CRYPTO_VU_LSL (base, t2, t1, sh); /* t2 = t13..t11*2^96 */ + CY_CRYPTO_VU_SET_REG (base, sh, 96u, 1u); + CY_CRYPTO_VU_LSL (base, t2, t1, sh); /* t2 = t13..t11*2^96 */ - CY_CRYPTO_VU_SET_REG (base, sh, 96, 1); - CY_CRYPTO_VU_LSL (base, t3, my_z, sh); /* t3 = t10..t7*2^96 */ + CY_CRYPTO_VU_SET_REG (base, sh, 96u, 1u); + CY_CRYPTO_VU_LSL (base, t3, my_z, sh); /* t3 = t10..t7*2^96 */ - CY_CRYPTO_VU_ADD (base, t2, t2, my_x); /* t2 = t13..t11*2^96 + t6..t0 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, t2, VR_P); /* C = (t2 >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, t2, t2, VR_P); /* t2 = t2 - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_ADD (base, t2, t2, my_x); /* t2 = t13..t11*2^96 + t6..t0 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, t2, VR_P); /* C = (t2 >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, t2, t2, VR_P); /* t2 = t2 - p, if C==1 (Carry is set) */ - CY_CRYPTO_VU_SUB (base, t2, t2, my_z); /* t2 = (t13..t11*2^96 + t6..t0) - t13..t7 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, t2, t2, VR_P); /* t2 = t2 + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_SUB (base, t2, t2, my_z); /* t2 = (t13..t11*2^96 + t6..t0) - t13..t7 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, t2, t2, VR_P); /* t2 = t2 + p, if C==0 (Carry is clear) */ - CY_CRYPTO_VU_SUB (base, t2, t2, t1); /* t2 = (t13..t11*2^96 + t6..t0 - t13..t7) - t13..t11 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, t2, t2, VR_P); /* t2 = t2 + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_SUB (base, t2, t2, t1); /* t2 = (t13..t11*2^96 + t6..t0 - t13..t7) - t13..t11 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, t2, t2, VR_P); /* t2 = t2 + p, if C==0 (Carry is clear) */ - CY_CRYPTO_VU_ADD (base, my_z, t2, t3); /* z = (t13..t11*2^96 + t6..t0 - t13..t7 - t13..t11) + t10..t7*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_ADD (base, my_z, t2, t3); /* z = (t13..t11*2^96 + t6..t0 - t13..t7 - t13..t11) + t10..t7*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ - CY_CRYPTO_VU_FREE_MEM (base, (1 << t1) | (1 << t2) | (1 << t3)); + CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t1) | CY_CRYPTO_VU_REG_BIT(t2) | CY_CRYPTO_VU_REG_BIT(t3)); CY_CRYPTO_VU_POP_REG (base); } @@ -247,172 +245,172 @@ void Cy_Crypto_Core_EC_CS_MUL_Red_P224(CRYPTO_Type *base, int z, int x) * * \param z * Result = x mod P = a*b mod P [256 bits]. -* +* * \param x * Product = a*b [2*256 bits]. * *******************************************************************************/ -void Cy_Crypto_Core_EC_CS_MUL_Red_P256(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_CS_MUL_Red_P256(CRYPTO_Type *base, uint32_t z, uint32_t x) { - int sh = 0; /* Variable values */ - int sh32 = 1; - int sh96 = 2; - int sh192 = 3; - int sh224 = 4; - int t0 = 5; /* 256 */ - int t1 = 6; /* 256 */ - int t2 = 7; /* 256 */ - int t3 = 8; /* 32 */ - int t4 = 9; /* 96 */ - int my_z = 10; - int my_x = 11; + uint32_t sh = 0u; /* Variable values */ + uint32_t sh32 = 1u; + uint32_t sh96 = 2u; + uint32_t sh192 = 3u; + uint32_t sh224 = 4u; + uint32_t t0 = 5u; /* 256 */ + uint32_t t1 = 6u; /* 256 */ + uint32_t t2 = 7u; /* 256 */ + uint32_t t3 = 8u; /* 32 */ + uint32_t t4 = 9u; /* 96 */ + uint32_t my_z = 10u; + uint32_t my_x = 11u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P256_SIZE); /* 256 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t1, CY_CRYPTO_ECC_P256_SIZE); /* 256 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t2, CY_CRYPTO_ECC_P256_SIZE); /* 256 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t3, 32); /* 32 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t4, 96); /* 96 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P256_SIZE); /* 256 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t1, CY_CRYPTO_ECC_P256_SIZE); /* 256 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t2, CY_CRYPTO_ECC_P256_SIZE); /* 256 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t3, 32u); /* 32 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t4, 96u); /* 96 */ - CY_CRYPTO_VU_SET_REG (base, sh, CY_CRYPTO_ECC_P256_SIZE, 1); /* sh = 256 */ - CY_CRYPTO_VU_SET_REG (base, sh32, 32, 1); /* sh = 32 */ - CY_CRYPTO_VU_SET_REG (base, sh96, 96, 1); /* sh = 96 */ - CY_CRYPTO_VU_SET_REG (base, sh192, 192, 1); /* sh = 192 */ - CY_CRYPTO_VU_SET_REG (base, sh224, 224, 1); /* sh = 224 */ + CY_CRYPTO_VU_SET_REG (base, sh, CY_CRYPTO_ECC_P256_SIZE, 1u); /* sh = 256 */ + CY_CRYPTO_VU_SET_REG (base, sh32, 32u, 1u); /* sh = 32 */ + CY_CRYPTO_VU_SET_REG (base, sh96, 96u, 1u); /* sh = 96 */ + CY_CRYPTO_VU_SET_REG (base, sh192, 192u, 1u); /* sh = 192 */ + CY_CRYPTO_VU_SET_REG (base, sh224, 224u, 1u); /* sh = 224 */ - CY_CRYPTO_VU_LSR (base, t0, my_x, sh); /* t0 = t15..t8 */ - CY_CRYPTO_VU_LSR (base, my_z, t0, sh96); /* z = t15..t11 */ - CY_CRYPTO_VU_LSR (base, t1, my_z, sh32); /* t1 = t15..t12 */ - CY_CRYPTO_VU_LSR (base, t3, my_z, sh32); /* t3 = t12 */ + CY_CRYPTO_VU_LSR (base, t0, my_x, sh); /* t0 = t15..t8 */ + CY_CRYPTO_VU_LSR (base, my_z, t0, sh96); /* z = t15..t11 */ + CY_CRYPTO_VU_LSR (base, t1, my_z, sh32); /* t1 = t15..t12 */ + CY_CRYPTO_VU_LSR (base, t3, my_z, sh32); /* t3 = t12 */ /* 2*S1 -- 2*t15..t11*2^96 */ - CY_CRYPTO_VU_LSL (base, my_z, my_z, sh96); /* z = t15..t11*2^96 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, my_z); /* z = 2*t15..t11*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, my_z, my_z, sh96); /* z = t15..t11*2^96 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, my_z); /* z = 2*t15..t11*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D3 (a) -- t12*2^224 */ - CY_CRYPTO_VU_LSL (base, t2, t3, sh224); /* t2 = t12*2^224 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t12*2^224 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t2, t3, sh224); /* t2 = t12*2^224 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t12*2^224 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* 2*S2 -- 2*t15..t12*2^96 */ - CY_CRYPTO_VU_LSL (base, t2, t1, sh96); /* t2 = t15..t12*2^96 */ + CY_CRYPTO_VU_LSL (base, t2, t1, sh96); /* t2 = t15..t12*2^96 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t15..t12*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t15..t12*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + 2*t15..t12*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + 2*t15..t12*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D4 (c) -- t15..t14 */ - CY_CRYPTO_VU_LSR (base, t2, t0, sh192); /* t2 = t15..t14 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t15..t14 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t2, t0, sh192); /* t2 = t15..t14 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t15..t14 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S3 (a) -- t15..t14*2^192 */ - CY_CRYPTO_VU_LSL (base, t2, t2, sh192); /* t2 = t15..t14*2^192 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t15..t14*2^192 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t2, t2, sh192); /* t2 = t15..t14*2^192 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t15..t14*2^192 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D2 (c) -- t15..t12 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t15..t12 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t15..t12 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S4 (b) -- t13*2^192 */ - CY_CRYPTO_VU_LSR (base, t3, t1, sh32); /* t3 = t13 */ - CY_CRYPTO_VU_LSL (base, t2, t3, sh192); /* t2 = t13*2^192 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t13*2^192 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t3, t1, sh32); /* t3 = t13 */ + CY_CRYPTO_VU_LSL (base, t2, t3, sh192); /* t2 = t13*2^192 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t13*2^192 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D4 (a) -- t13*2^224 */ - CY_CRYPTO_VU_LSL (base, t2, t2, sh32); /* t2 = t13*2^224 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t13*2^224 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t2, t2, sh32); /* t2 = t13*2^224 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t13*2^224 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* D3 (c) -- t15..t13 */ - CY_CRYPTO_VU_LSR (base, t1, t1, sh32); /* t1 = t15..t13 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t15..t13 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t1, t1, sh32); /* t1 = t15..t13 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t15..t13 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S4 (c) -- t15..t13*2^96 */ - CY_CRYPTO_VU_LSL (base, t2, t1, sh96); /* t2 = t15..t13*2^96 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t15..t13*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t2, t1, sh96); /* t2 = t15..t13*2^96 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t15..t13*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D2 (a) -- t11*2^224 */ - CY_CRYPTO_VU_LSR (base, t3, t0, sh96); /* t3 = t11 */ - CY_CRYPTO_VU_LSL (base, t2, t3, sh224); /* t2 = t11*2^224 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t11*2^224 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t3, t0, sh96); /* t3 = t11 */ + CY_CRYPTO_VU_LSL (base, t2, t3, sh224); /* t2 = t11*2^224 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t11*2^224 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* D2 (b) -- t9*2^192 */ - CY_CRYPTO_VU_LSR (base, t3, t0, sh32); /* t3 = t9 */ - CY_CRYPTO_VU_LSL (base, t2, t3, sh192); /* t2 = t9*2^192 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t9*2^192 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t3, t0, sh32); /* t3 = t9 */ + CY_CRYPTO_VU_LSL (base, t2, t3, sh192); /* t2 = t9*2^192 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t9*2^192 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* D1 (c) -- t13..t11 */ - CY_CRYPTO_VU_LSR (base, t4, t0, sh96); /* t4 = t13..t11 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t4); /* z = z - t13..t11 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t4, t0, sh96); /* t4 = t13..t11 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t4); /* z = z - t13..t11 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S4 (d) -- t11..t9 */ - CY_CRYPTO_VU_LSR (base, t4, t0, sh32); /* t4 = t11..t9 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t4); /* z = z + t11..t9 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t4, t0, sh32); /* t4 = t11..t9 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t4); /* z = z + t11..t9 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D1 (a) -- t10*2^224 */ - CY_CRYPTO_VU_LSR (base, t3, t4, sh32); /* t3 = t10 */ - CY_CRYPTO_VU_LSL (base, t2, t3, sh224); /* t2 = t10*2^224 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t10*2^224 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t3, t4, sh32); /* t3 = t10 */ + CY_CRYPTO_VU_LSL (base, t2, t3, sh224); /* t2 = t10*2^224 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t10*2^224 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* D4 (b) -- t11..t9*2^96 */ - CY_CRYPTO_VU_LSL (base, t2, t4, sh96); /* t2 = t11..t9*2^96 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t11..t9*2^96 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t2, t4, sh96); /* t2 = t11..t9*2^96 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t11..t9*2^96 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ - CY_CRYPTO_VU_SET_REG (base, sh, 0, 1); /* sh = 0; */ + CY_CRYPTO_VU_SET_REG (base, sh, 0u, 1u); /* sh = 0; */ /* S3 (b) -- t10..t8 */ - CY_CRYPTO_VU_LSR (base, t4, t0, sh); /* t4 = t10..t8 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t4); /* z = z + t10..t8 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t4, t0, sh); /* t4 = t10..t8 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t4); /* z = z + t10..t8 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D3 (b) -- t10..t8*2^96 */ - CY_CRYPTO_VU_LSL (base, t2, t4, sh96); /* t4 = t10..t8*2^96 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t10..t8*2^96 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t2, t4, sh96); /* t4 = t10..t8*2^96 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t10..t8*2^96 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S4 (a) -- t8*2^224 */ - CY_CRYPTO_VU_LSL (base, t2, t0, sh224); /* t2 = t8*2^224 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t8*2^224 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t2, t0, sh224); /* t2 = t8*2^224 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t8*2^224 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D1 (b) -- t8*2^192 */ - CY_CRYPTO_VU_LSR (base, t2, t2, sh32); /* t2 = t8*2^192 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t8*2^192 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t2, t2, sh32); /* t2 = t8*2^192 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t8*2^192 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* T -- t7..t0 */ - CY_CRYPTO_VU_LSR (base, t2, my_x, sh); /* t2 = t8*2^192 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t7..t0 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t2, my_x, sh); /* t2 = t8*2^192 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t7..t0 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t0) | CY_CRYPTO_VU_REG_BIT(t1) | @@ -438,132 +436,132 @@ void Cy_Crypto_Core_EC_CS_MUL_Red_P256(CRYPTO_Type *base, int z, int x) * * \param z * Result = x mod P = a*b mod P [384 bits] -* +* * \param x * Product = a*b [2*384 bits] * *******************************************************************************/ -void Cy_Crypto_Core_EC_CS_MUL_Red_P384(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_CS_MUL_Red_P384(CRYPTO_Type *base, uint32_t z, uint32_t x) { - int sh32 = 0; - int sh64 = 1; - int sh96 = 2; - int sh128 = 3; - int sh256 = 4; - int sh384 = 5; - int t0 = 6; /* 384 */ - int t1 = 7; /* 384 */ - int t2 = 8; /* 32 */ - int my_z = 9; - int my_x = 10; + uint32_t sh32 = 0u; + uint32_t sh64 = 1u; + uint32_t sh96 = 2u; + uint32_t sh128 = 3u; + uint32_t sh256 = 4u; + uint32_t sh384 = 5u; + uint32_t t0 = 6u; /* 384 */ + uint32_t t1 = 7u; /* 384 */ + uint32_t t2 = 8u; /* 32 */ + uint32_t my_z = 9u; + uint32_t my_x = 10u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P384_SIZE); /* 384 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t1, CY_CRYPTO_ECC_P384_SIZE); /* 384 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t2, 32); /* 32 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P384_SIZE); /* 384 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t1, CY_CRYPTO_ECC_P384_SIZE); /* 384 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t2, 32u); /* 32 */ - CY_CRYPTO_VU_SET_REG (base, sh32, 32, 1); /* sh32 = 32 */ - CY_CRYPTO_VU_SET_REG (base, sh64, 64, 1); /* sh64 = 64 */ - CY_CRYPTO_VU_SET_REG (base, sh96, 96, 1); /* sh96 = 96 */ - CY_CRYPTO_VU_SET_REG (base, sh128, 128, 1); /* sh128 = 128 */ - CY_CRYPTO_VU_SET_REG (base, sh256, 256, 1); /* sh256 = 256 */ - CY_CRYPTO_VU_SET_REG (base, sh384, CY_CRYPTO_ECC_P384_SIZE, 1); /* sh384 = 384 */ + CY_CRYPTO_VU_SET_REG (base, sh32, 32u, 1u); /* sh32 = 32 */ + CY_CRYPTO_VU_SET_REG (base, sh64, 64u, 1u); /* sh64 = 64 */ + CY_CRYPTO_VU_SET_REG (base, sh96, 96u, 1u); /* sh96 = 96 */ + CY_CRYPTO_VU_SET_REG (base, sh128, 128u, 1u); /* sh128 = 128 */ + CY_CRYPTO_VU_SET_REG (base, sh256, 256u, 1u); /* sh256 = 256 */ + CY_CRYPTO_VU_SET_REG (base, sh384, CY_CRYPTO_ECC_P384_SIZE, 1u); /* sh384 = 384 */ - CY_CRYPTO_VU_LSR (base, t0, my_x, sh384); /* t0 = t23..t12 */ + CY_CRYPTO_VU_LSR (base, t0, my_x, sh384); /* t0 = t23..t12 */ /* T + S2 -- t11..t0 + t23..t12 */ - CY_CRYPTO_VU_ADD (base, my_z, t0, my_x); /* z = t23..t12 + t11..t0 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_ADD (base, my_z, t0, my_x); /* z = t23..t12 + t11..t0 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* S6 (b) -- t_20 */ - CY_CRYPTO_VU_LSR (base, t2, t0, sh256); /* t2 = t20 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t20 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t2, t0, sh256); /* t2 = t20 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t2); /* z = z + t20 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* S4 (b) -- t20*2^96 */ - CY_CRYPTO_VU_LSL (base, t1, t2, sh96); /* t1 = t20*2^96 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t20*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t1, t2, sh96); /* t1 = t20*2^96 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t20*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* S5 -- t23..t20*2^128 */ - CY_CRYPTO_VU_LSR (base, t1, t0, sh256); /* t1 = t23..t20 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh128); /* t1 = t23..t20*2^128 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t20*2^128 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t1, t0, sh256); /* t1 = t23..t20 */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh128); /* t1 = t23..t20*2^128 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t20*2^128 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D2 -- t23..t20*2^32 */ - CY_CRYPTO_VU_LSR (base, t1, t1, sh96); /* t1 = t23..t20*2^32 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t23..t20*2^32 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t1, t1, sh96); /* t1 = t23..t20*2^32 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t23..t20*2^32 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S3 (b) -- t23..t21 */ - CY_CRYPTO_VU_LSR (base, t1, t1, sh64); /* t1 = t23..t21 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t21 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSR (base, t1, t1, sh64); /* t1 = t23..t21 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t21 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D1 (b) -- t23 */ - CY_CRYPTO_VU_LSR (base, t2, t1, sh64); /* t2 = t23 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t23 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSR (base, t2, t1, sh64); /* t2 = t23 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t2); /* z = z - t23 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S6 (a) -- t23..t21*2^96 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh96); /* t1 = t23..t21*2^96 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t21*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh96); /* t1 = t23..t21*2^96 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t21*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* 2*S1 -- 2*t23..t21*2^128 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh32); /* t1 = t23..t21*2^128 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t21*2^128 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t20..t12*2^128 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh32); /* t1 = t23..t21*2^128 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23..t21*2^128 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t20..t12*2^128 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* S4 (c) -- t23*2^32 */ - CY_CRYPTO_VU_LSL (base, t1, t2, sh32); /* t1 = t23*2^32 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23*2^32 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t1, t2, sh32); /* t1 = t23*2^32 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t23*2^32 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* D3 (b) -- t23*2^96 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh64); /* t1 = t23*2^96 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t23*2^96 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh64); /* t1 = t23*2^96 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t23*2^96 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* D3 (a) -- t23*2^128 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh32); /* t1 = t23*2^128 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t23*2^128 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh32); /* t1 = t23*2^128 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t23*2^128 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* D1 (a) -- t22..t12*2^32 */ - CY_CRYPTO_VU_LSL (base, t1, t0, sh32); /* t1 = t22..t12*2^32 */ - CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t22..t12*2^32 */ - CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ + CY_CRYPTO_VU_LSL (base, t1, t0, sh32); /* t1 = t22..t12*2^32 */ + CY_CRYPTO_VU_SUB (base, my_z, my_z, t1); /* z = z - t22..t12*2^32 */ + CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, my_z, my_z, VR_P); /* z = z + p, if C==0 (Carry is clear) */ /* S3 (a) -- t20..t12*2^96 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh64); /* t1 = t20..t12*2^96 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t20..t12*2^96 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh64); /* t1 = t20..t12*2^96 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t20..t12*2^96 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ /* S4 (a) -- t19..t12*2^128 */ - CY_CRYPTO_VU_LSL (base, t1, t1, sh32); /* t1 = t19..t12*2^128 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t19..t12*2^128 */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_LSL (base, t1, t1, sh32); /* t1 = t19..t12*2^128 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, t1); /* z = z + t19..t12*2^128 */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* z = z - p, if C==1 (Carry is set) */ - CY_CRYPTO_VU_FREE_MEM (base, (1 << t0) | (1 << t1) | (1 << t2)); + CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t0) | CY_CRYPTO_VU_REG_BIT(t1) | CY_CRYPTO_VU_REG_BIT(t2)); CY_CRYPTO_VU_POP_REG (base); } @@ -585,34 +583,34 @@ void Cy_Crypto_Core_EC_CS_MUL_Red_P384(CRYPTO_Type *base, int z, int x) * * \param z * Result = x mod P = a*b mod P [521 bits] -* +* * \param x * Product = a*b [2*521 bits] * *******************************************************************************/ -void Cy_Crypto_Core_EC_CS_MUL_Red_P521(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_CS_MUL_Red_P521(CRYPTO_Type *base, uint32_t z, uint32_t x) { - int sh521 = 0; - int t0 = 1; - int my_z = 2; - int my_x = 3; + uint32_t sh521 = 0u; + uint32_t t0 = 1u; + uint32_t my_z = 2u; + uint32_t my_x = 3u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P521_SIZE); /* 521 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P521_SIZE); /* 521 */ - CY_CRYPTO_VU_SET_REG (base, sh521, 521, 1); /* sh521 = 521 */ + CY_CRYPTO_VU_SET_REG (base, sh521, 521u, 1u); /* sh521 = 521 */ - CY_CRYPTO_VU_LSR (base, my_z, my_x, sh521); /* z = T1 */ + CY_CRYPTO_VU_LSR (base, my_z, my_x, sh521); /* z = T1 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, my_x); /* z = T1 + T0 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, my_x); /* z = T1 + T0 */ /* T0 + T1 mod p */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (t2 >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* t2 = t2 - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (t2 >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* t2 = t2 - p, if C==1 (Carry is set) */ CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t0)); @@ -630,7 +628,7 @@ void Cy_Crypto_Core_EC_CS_MUL_Red_P521(CRYPTO_Type *base, int z, int x) * * \param z * Result. -* +* * \param x * Product. * @@ -638,7 +636,7 @@ void Cy_Crypto_Core_EC_CS_MUL_Red_P521(CRYPTO_Type *base, int z, int x) * Size. * *******************************************************************************/ -void Cy_Crypto_Core_EC_CS_MulRed(CRYPTO_Type *base, int z, int x, int size) +static void Cy_Crypto_Core_EC_CS_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size) { switch (eccMode) { @@ -680,57 +678,57 @@ void Cy_Crypto_Core_EC_CS_MulRed(CRYPTO_Type *base, int z, int x, int size) * * \param z * Result = x mod P = a*b mod P [192 bits]. -* +* * \param x * Product = a*b [2*192 bits]. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SM_MUL_Red_P192(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_SM_MUL_Red_P192(CRYPTO_Type *base, uint32_t z, uint32_t x) { /* Setup */ - int partial = 0; - int hi = 1; - int sh64 = 2; - int sh192 = 3; - int my_z = 4; - int my_x = 5; + uint32_t partial = 0u; + uint32_t hi = 1u; + uint32_t sh64 = 2u; + uint32_t sh192 = 3u; + uint32_t my_z = 4u; + uint32_t my_x = 5u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P192_SIZE + 65); - CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P192_SIZE + 64); + CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P192_SIZE + 65u); + CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P192_SIZE + 64u); - CY_CRYPTO_VU_SET_REG (base, sh64, 64, 1); - CY_CRYPTO_VU_SET_REG (base, sh192, 192, 1); + CY_CRYPTO_VU_SET_REG (base, sh64, 64u, 1u); + CY_CRYPTO_VU_SET_REG (base, sh192, 192u, 1u); /* Step 2: 1st round of shift-multiply - * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi (LSL hi and add 1) and add shifted hi to lo) - * hi*(2^{64} + 1) + lo - */ - CY_CRYPTO_VU_LSR (base, hi, my_x, sh192); /* hi = prod >> CURVE_SIZE = prod[383:192] */ - CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[191:0] */ + * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi (LSL hi and add 1) and add shifted hi to lo) + * hi * (2^{64} + 1) + lo + */ + CY_CRYPTO_VU_LSR (base, hi, my_x, sh192); /* hi = prod >> CURVE_SIZE = prod[383:192] */ + CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[191:0] */ - CY_CRYPTO_VU_ADD (base, partial, hi, my_z); /* partial = (hi*1) + lo */ + CY_CRYPTO_VU_ADD (base, partial, hi, my_z); /* partial = (hi*1) + lo */ - CY_CRYPTO_VU_LSL (base, hi, hi, sh64); /* hi = hi << 64 = hi*2^{64} */ + CY_CRYPTO_VU_LSL (base, hi, hi, sh64); /* hi = hi << 64 = hi*2^{64} */ - CY_CRYPTO_VU_ADD (base, partial, partial, hi); /* partial = hi*(2^{64}+1) + lo */ + CY_CRYPTO_VU_ADD (base, partial, partial, hi); /* partial = hi*(2^{64}+1) + lo */ /* Step 3: 2nd round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh192); /* hi = partial >> CURVE_SIZE = partial[383:192] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh192); /* hi = partial >> CURVE_SIZE = partial[383:192] */ - CY_CRYPTO_VU_ADD (base, my_z, hi, partial); /* z = (hi*1) + lo (Note: partial == lo, since it will be cut to CURVE_SIZE since z = CURVE_SIZE) */ + CY_CRYPTO_VU_ADD (base, my_z, hi, partial); /* z = (hi*1) + lo (Note: partial == lo, since it will be cut to CURVE_SIZE since z = CURVE_SIZE) */ - CY_CRYPTO_VU_LSL (base, hi, hi, sh64); /* hi = hi << 64 = hi*2^{64} */ + CY_CRYPTO_VU_LSL (base, hi, hi, sh64); /* hi = hi << 64 = hi*2^{64} */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, hi); /* z = hi*(2^{64}+1) + lo */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, hi); /* z = hi*(2^{64}+1) + lo */ /* Step 4: Final reduction (compare to P-192 and reduce if necessary, based on CARRY flag) */ - CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(partial) | CY_CRYPTO_VU_REG_BIT(hi)); @@ -750,57 +748,57 @@ void Cy_Crypto_Core_EC_SM_MUL_Red_P192(CRYPTO_Type *base, int z, int x) * * \param z * Result = x mod P = a*b mod P [224 bits]. -* +* * \param x * Product = a*b [2*224 bits]. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SM_MUL_Red_P224(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_SM_MUL_Red_P224(CRYPTO_Type *base, uint32_t z, uint32_t x) { /* Setup */ - int partial = 0; - int hi = 1; - int sh96 = 2; - int sh224 = 3; - int my_z = 4; - int my_x = 5; + uint32_t partial = 0u; + uint32_t hi = 1u; + uint32_t sh96 = 2u; + uint32_t sh224 = 3u; + uint32_t my_z = 4u; + uint32_t my_x = 5u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P224_SIZE + 97); - CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P224_SIZE + 96); + CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P224_SIZE + 97u); + CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P224_SIZE + 96u); - CY_CRYPTO_VU_SET_REG (base, sh96, 96, 1); - CY_CRYPTO_VU_SET_REG (base, sh224, 224, 1); + CY_CRYPTO_VU_SET_REG (base, sh96, 96u, 1u); + CY_CRYPTO_VU_SET_REG (base, sh224, 224u, 1u); /* Step 2: 1st round of shift-multiply - * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi (LSL hi<<96 and subtract 1) and add shifted hi to lo) - * hi*(2^{96} + 1) + lo - */ - CY_CRYPTO_VU_LSR (base, hi, my_x, sh224); /* hi = prod >> CURVE_SIZE = prod[447:224] */ - CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[223:0] */ + * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi (LSL hi<<96 and subtract 1) and add shifted hi to lo) + * hi * (2^{96} + 1) + lo + */ + CY_CRYPTO_VU_LSR (base, hi, my_x, sh224); /* hi = prod >> CURVE_SIZE = prod[447:224] */ + CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[223:0] */ - CY_CRYPTO_VU_SUB (base, partial, my_z, hi); /* partial = lo - (hi*1) */ + CY_CRYPTO_VU_SUB (base, partial, my_z, hi); /* partial = lo - (hi*1) */ - CY_CRYPTO_VU_LSL (base, hi, hi, sh96); /* hi = hi << 96 = hi*2^{96} */ + CY_CRYPTO_VU_LSL (base, hi, hi, sh96); /* hi = hi << 96 = hi*2^{96} */ - CY_CRYPTO_VU_ADD (base, partial, partial, hi); /* partial = hi*(2^{96}-1) + lo */ + CY_CRYPTO_VU_ADD (base, partial, partial, hi); /* partial = hi*(2^{96}-1) + lo */ /* Step 3: 2nd round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh224); /* hi = partial>>CURVE_SIZE = partial[447:224] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh224); /* hi = partial>>CURVE_SIZE = partial[447:224] */ - CY_CRYPTO_VU_SUB (base, my_z, partial, hi); /* z = lo - (hi*1) (Note: partial == lo, since it will be cut to CURVE_SIZE since z = CURVE_SIZE) */ + CY_CRYPTO_VU_SUB (base, my_z, partial, hi); /* z = lo - (hi*1) (Note: partial == lo, since it will be cut to CURVE_SIZE since z = CURVE_SIZE) */ - CY_CRYPTO_VU_LSL (base, hi, hi, sh96); /* hi = hi<<96 = hi*2^{96} */ + CY_CRYPTO_VU_LSL (base, hi, hi, sh96); /* hi = hi<<96 = hi*2^{96} */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, hi); /* z = hi*(2^{96}-1) + lo */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, hi); /* z = hi*(2^{96}-1) + lo */ /* Step 4: Final reduction (compare to P-224 and reduce if necessary, based on CARRY flag) */ - CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(partial) | CY_CRYPTO_VU_REG_BIT(hi)); @@ -808,61 +806,6 @@ void Cy_Crypto_Core_EC_SM_MUL_Red_P224(CRYPTO_Type *base, int z, int x) } -/******************************************************************************* -* Function Name: Cy_Crypto_Core_EC_P256_ShMulRed_Coeff -****************************************************************************//** -* -* Generate multiplier for shift-multiply multiplication reduction P256. -* Multiplier coeficient = (2^{224} - 2^{192} - 2^{96} + 1) -* Multiplier coefficient = fffffffe ffffffff ffffffff ffffffff 00000000 00000000 00000001 -* -* \param base -* The pointer to a Crypto instance. -* -* \param z -* Result = x mod P = a*b mod P [224 bits]. -* -* \param x -* Product = a*b [2*224 bits]. -* -* \note Complicated swapping of t and coeff registers is to ensure coeff only -* requires 224 bits, while t requires 225 bits. Hence, the externally used -* register coeff requires one less bit. -* -*******************************************************************************/ -void Cy_Crypto_Core_EC_P256_ShMulRed_Coeff(CRYPTO_Type *base, int coeff) -{ - int sh = 0; - int t = 1; - int my_coeff = 2; - - CY_CRYPTO_VU_PUSH_REG (base); - - CY_CRYPTO_VU_LD_REG (base, my_coeff, coeff); - - CY_CRYPTO_VU_SET_REG (base, sh, 224, 1u); /* sh = 224 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t, 225u); /* t [225 bits] */ - - CY_CRYPTO_VU_SET_TO_ONE (base, t); /* t = 1 */ - CY_CRYPTO_VU_LSL (base, t, t, sh); /* t = 1<<224 */ - - CY_CRYPTO_VU_SET_REG (base, sh, 32, 1u); /* sh = 32 */ - CY_CRYPTO_VU_LSR (base, my_coeff, t, sh); /* coeff = 1<<192 */ - CY_CRYPTO_VU_SUB (base, t, t, my_coeff); /* t = 1<<224 - 1<<192 */ - - CY_CRYPTO_VU_SET_REG (base, sh, 96, 1u); /* sh = 96 */ - CY_CRYPTO_VU_LSR (base, my_coeff, my_coeff, sh); /* coeff = 1<<96 */ - CY_CRYPTO_VU_SUB (base, t, t, my_coeff); /* t = 1<<224 - 1<<192 - 1<<96 */ - - CY_CRYPTO_VU_LSR (base, my_coeff, my_coeff, sh); /* coeff = 1 */ - CY_CRYPTO_VU_ADD (base, my_coeff, my_coeff, t); /* coeff = 1<<224 - 1<<192 - 1<<96 + 1 */ - - CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t)); - CY_CRYPTO_VU_POP_REG (base); - -} - - /******************************************************************************* * Function Name: Cy_Crypto_Core_EC_SM_MUL_Red_P256 ****************************************************************************//** @@ -876,97 +819,103 @@ void Cy_Crypto_Core_EC_P256_ShMulRed_Coeff(CRYPTO_Type *base, int coeff) * * \param z * Result. -* +* * \param x * Product. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SM_MUL_Red_P256(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_SM_MUL_Red_P256(CRYPTO_Type *base, uint32_t z, uint32_t x) { + /* Pre-computed coefficient for shift-multiply modular reduction for P256 */ + const uint8_t P256_ShMul_COEFF[] = { + 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, + 0x00u, 0x00u, 0x00u, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0xFFu, + 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu, + 0xFEu, 0xFFu, 0xFFu, 0xFFu + }; + /* Setup */ - int partial = 0; - int hi = 1; - int sh256 = 2; - int my_z = 3; - int my_x = 4; - int coeff = 5; + uint32_t partial = 0u; + uint32_t hi = 1u; + uint32_t sh256 = 2u; + uint32_t my_z = 3u; + uint32_t my_x = 4u; + uint32_t coeff = 5u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, coeff, 224u); - CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P256_SIZE + 224u); - CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P256_SIZE); + CY_CRYPTO_VU_ALLOC_MEM (base, coeff, 224u); + CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P256_SIZE + 224u); + CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P256_SIZE); - CY_CRYPTO_VU_SET_REG (base, sh256, 256, 1u); + CY_CRYPTO_VU_SET_REG (base, sh256, 256u, 1u); - /* Cy_Crypto_Core_EC_P256_ShMulRed_Coeff(coeff); */ - Cy_Crypto_Core_Vu_SetMemValue (base, coeff, P256_ShMul_COEFF, 224u); + Cy_Crypto_Core_Vu_SetMemValue (base, coeff, P256_ShMul_COEFF, 224u); /* Step 2: 1st round of shift-multiply - * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi*c and add hi*coeff + lo) - * hi*coeff + lo - */ - CY_CRYPTO_VU_LSR (base, hi, my_x, sh256); /* hi = prod >> CURVE_SIZE = prod[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[255:0] */ + * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi*c and add hi*coeff + lo) + * hi*coeff + lo + */ + CY_CRYPTO_VU_LSR (base, hi, my_x, sh256); /* hi = prod >> CURVE_SIZE = prod[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* partial = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* partial = hi*coeff + lo */ /* Step 3: 2nd round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ /* Step 4: 3rd round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ /* Step 5: 4th round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ /* Step 6: 5th round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ /* Step 7: 6th round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ /* Step 8: 7th round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* z = hi*coeff + lo */ /* Step 9: 8th round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh256); /* hi = partial>>CURVE_SIZE = partial[511:256] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[255:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, my_z, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, my_z, partial, my_z); /* z = hi*coeff + lo */ /* Step 11: Final reduction (compare to P-256 and reduce if necessary, based on CARRY flag) */ - CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(partial) | CY_CRYPTO_VU_REG_BIT(hi) | CY_CRYPTO_VU_REG_BIT(coeff)); @@ -974,55 +923,6 @@ void Cy_Crypto_Core_EC_SM_MUL_Red_P256(CRYPTO_Type *base, int z, int x) } -/******************************************************************************* -* Function Name: Cy_Crypto_Core_EC_P384_ShMulRed_Coeff -****************************************************************************//** -* -* Generate multiplier for shift-multiply multiplication reduction P384. -* Multiplier coeficient = (2^{128} + 2^{96} - 2^{32} + 1) -* Multiplier coefficient = 1 00000000 FFFFFFFF FFFFFFFF 00000000 -* -* \param base -* The pointer to a Crypto instance. -* -* \param coeff -* Coeffitient. -* -*******************************************************************************/ -void Cy_Crypto_Core_EC_P384_ShMulRed_Coeff(CRYPTO_Type *base, int coeff) -{ - - int sh = 0; - int t = 1; - int my_coeff = 2; - - CY_CRYPTO_VU_PUSH_REG (base); - - CY_CRYPTO_VU_LD_REG (base, my_coeff, coeff); - - CY_CRYPTO_VU_SET_REG (base, sh, 128, 1); /* sh = 128 */ - CY_CRYPTO_VU_ALLOC_MEM (base, t, 97); /* t [96 bits] */ - - CY_CRYPTO_VU_SET_TO_ONE (base, my_coeff); /* coeff = 1 */ - CY_CRYPTO_VU_LSL (base, my_coeff, my_coeff, sh); /* coeff = 1<<128 */ - - CY_CRYPTO_VU_SET_REG (base, sh, 32, 1); /* sh = 32 */ - CY_CRYPTO_VU_LSR (base, t, my_coeff, sh); /* t = 1<<96 */ - CY_CRYPTO_VU_ADD (base, my_coeff, my_coeff, t); /* coeff = 1<<128 + 1<<96 */ - - CY_CRYPTO_VU_SET_REG (base, sh, 64, 1); /* sh = 64 */ - CY_CRYPTO_VU_LSR (base, t, t, sh); /* t = 1<<32 */ - CY_CRYPTO_VU_SUB (base, my_coeff, my_coeff, t); /* coeff = 1<<128 + 1<<96 - 1<<32 */ - - CY_CRYPTO_VU_SET_REG (base, sh, 32, 1); /* sh = 32 */ - CY_CRYPTO_VU_LSR (base, t, t, sh); /* t = 1 */ - CY_CRYPTO_VU_ADD (base, my_coeff, my_coeff, t); /* coeff = 1<<128 + 1<<96 - 1<<32 + 1 */ - - CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t)); - CY_CRYPTO_VU_POP_REG (base); -} - - /******************************************************************************* * Function Name: Cy_Crypto_Core_EC_SM_MUL_Red_P384 ****************************************************************************//** @@ -1036,55 +936,62 @@ void Cy_Crypto_Core_EC_P384_ShMulRed_Coeff(CRYPTO_Type *base, int coeff) * * \param z * Result. -* +* * \param x * Product. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SM_MUL_Red_P384(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_SM_MUL_Red_P384(CRYPTO_Type *base, uint32_t z, uint32_t x) { + /* Pre-computed coefficient for shift-multiply modular reduction for P384 */ + const uint8_t P384_ShMul_COEFF[] = { + 0x01u, 0x00u, 0x00u, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0xFFu, + 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0x00u, 0x00u, 0x00u, 0x00u, + 0x01u + }; + /* Setup */ - int partial = 0; - int hi = 1; - int sh96 = 2; - int sh384 = 3; - int my_z = 4; - int my_x = 5; - int coeff = 6; + uint32_t partial = 0u; + uint32_t hi = 1u; + uint32_t sh96 = 2u; + uint32_t sh384 = 3u; + uint32_t my_z = 4u; + uint32_t my_x = 5u; + uint32_t coeff = 6u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P384_SIZE + 129u); - CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P384_SIZE + 96u); - CY_CRYPTO_VU_ALLOC_MEM (base, coeff, 129u); + CY_CRYPTO_VU_ALLOC_MEM (base, partial, CY_CRYPTO_ECC_P384_SIZE + 129u); + CY_CRYPTO_VU_ALLOC_MEM (base, hi, CY_CRYPTO_ECC_P384_SIZE + 96u); + CY_CRYPTO_VU_ALLOC_MEM (base, coeff, 129u); - CY_CRYPTO_VU_SET_REG (base, sh96, 96, 1u); - CY_CRYPTO_VU_SET_REG (base, sh384, 384, 1u); + CY_CRYPTO_VU_SET_REG (base, sh96, 96u, 1u); + CY_CRYPTO_VU_SET_REG (base, sh384, 384u, 1u); - Cy_Crypto_Core_Vu_SetMemValue (base, coeff, P384_ShMul_COEFF, 129u); + Cy_Crypto_Core_Vu_SetMemValue (base, coeff, P384_ShMul_COEFF, 129u); /* Step 2: 1st round of shift-multiply * (Separate hi and lo (LSR hi>>CURVE_SIZE), multiply hi*c and add hi*coeff + lo) * hi*coeff + lo */ - CY_CRYPTO_VU_LSR (base, hi, my_x, sh384); /* hi = prod >> CURVE_SIZE = prod[767:384] */ - CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[383:0] */ + CY_CRYPTO_VU_LSR (base, hi, my_x, sh384); /* hi = prod >> CURVE_SIZE = prod[767:384] */ + CY_CRYPTO_VU_MOV (base, my_z, my_x); /* z == lo = prod[383:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* partial = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, partial, partial, my_z); /* partial = hi*coeff + lo */ /* Step 3: 2nd round of shift-multiply */ - CY_CRYPTO_VU_LSR (base, hi, partial, sh384); /* hi = partial>>CURVE_SIZE = partial[767:384] */ - CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[383:0] */ + CY_CRYPTO_VU_LSR (base, hi, partial, sh384); /* hi = partial>>CURVE_SIZE = partial[767:384] */ + CY_CRYPTO_VU_MOV (base, my_z, partial); /* z == lo = partial[383:0] */ - CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ - CY_CRYPTO_VU_ADD (base, my_z, partial, my_z); /* z = hi*coeff + lo */ + CY_CRYPTO_VU_UMUL (base, partial, hi, coeff); /* partial = hi*coeff */ + CY_CRYPTO_VU_ADD (base, my_z, partial, my_z); /* z = hi*coeff + lo */ /* Step 4: Final reduction (compare to P-384 and reduce if necessary, based on CARRY flag) */ - CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ + CY_CRYPTO_VU_CMP_SUB (base, my_z, VR_P); /* C = (z >= VR_P) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(partial) | CY_CRYPTO_VU_REG_BIT(hi) | CY_CRYPTO_VU_REG_BIT(coeff)); @@ -1109,34 +1016,34 @@ void Cy_Crypto_Core_EC_SM_MUL_Red_P384(CRYPTO_Type *base, int z, int x) * * \param z * Result = x mod P = a*b mod P [521 bits]. -* +* * \param x * Product = a*b [2*521 bits]. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SM_MUL_Red_P521(CRYPTO_Type *base, int z, int x) +static void Cy_Crypto_Core_EC_SM_MUL_Red_P521(CRYPTO_Type *base, uint32_t z, uint32_t x) { - int sh521 = 0; - int t0 = 1; - int my_z = 2; - int my_x = 3; + uint32_t sh521 = 0u; + uint32_t t0 = 1u; + uint32_t my_z = 2u; + uint32_t my_x = 3u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, my_x, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, my_x, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P521_SIZE); /* 521 */ + CY_CRYPTO_VU_ALLOC_MEM (base, t0, CY_CRYPTO_ECC_P521_SIZE); /* 521 */ - CY_CRYPTO_VU_SET_REG (base, sh521, 521, 1); /* sh521 = 521 */ + CY_CRYPTO_VU_SET_REG (base, sh521, 521u, 1u); /* sh521 = 521 */ - CY_CRYPTO_VU_LSR (base, my_z, my_x, sh521); /* z = T1 */ + CY_CRYPTO_VU_LSR (base, my_z, my_x, sh521); /* z = T1 */ - CY_CRYPTO_VU_ADD (base, my_z, my_z, my_x); /* z = T1 + T0 */ + CY_CRYPTO_VU_ADD (base, my_z, my_z, my_x); /* z = T1 + T0 */ /* T0 + T1 mod p */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (t2 >= VR_P) */ - CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* t2 = t2 - p, if C==1 (Carry is set) */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, my_z, VR_P); /* C = (t2 >= VR_P) */ + CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, my_z, my_z, VR_P); /* t2 = t2 - p, if C==1 (Carry is set) */ CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t0)); CY_CRYPTO_VU_POP_REG (base); @@ -1148,14 +1055,14 @@ void Cy_Crypto_Core_EC_SM_MUL_Red_P521(CRYPTO_Type *base, int z, int x) * Function Name: Cy_Crypto_Core_EC_SM_MulRed ****************************************************************************//** * -* +* * * \param base * The pointer to a Crypto instance. * * \param z * Result. -* +* * \param x * Product. * @@ -1163,7 +1070,7 @@ void Cy_Crypto_Core_EC_SM_MUL_Red_P521(CRYPTO_Type *base, int z, int x) * Size. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SM_MulRed(CRYPTO_Type *base, int z, int x, int size) +static void Cy_Crypto_Core_EC_SM_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size) { switch (eccMode) { case CY_CRYPTO_ECC_ECP_SECP192R1: @@ -1198,14 +1105,14 @@ void Cy_Crypto_Core_EC_SM_MulRed(CRYPTO_Type *base, int z, int x, int size) * * Curve-specific multiplication modular reduction for P224. * t[b-1:0] = z_double >> size -* t = t * VR_BARRETT -* t = t + ((z_double >> size) << size) - for leading '1' Barrett bit. -* t = t >> size -* t = t * mod - r2 (not reduced) -* u = z_double - t - r = r1 - r2 (not reduced) +* t = t * VR_BARRETT +* t = t + ((z_double >> size) << size) - for leading '1' Barrett bit. +* t = t >> size +* t = t * mod - r2 (not reduced) +* u = z_double - t - r = r1 - r2 (not reduced) * -* u = IF (u >= mod) u = u - mod - reduce r using mod -* u = IF (u >= mod) u = u - mod +* u = IF (u >= mod) u = u - mod - reduce r using mod +* u = IF (u >= mod) u = u - mod * * z = a_double % mod * @@ -1216,7 +1123,7 @@ void Cy_Crypto_Core_EC_SM_MulRed(CRYPTO_Type *base, int z, int x, int size) * * \param z * Register index for Barrett reduced value. -* +* * \param x * Register index for non reduced value. * @@ -1225,48 +1132,48 @@ void Cy_Crypto_Core_EC_SM_MulRed(CRYPTO_Type *base, int z, int x, int size) * *******************************************************************************/ void Cy_Crypto_Core_EC_Bar_MulRed(CRYPTO_Type *base, - int z, - int x, - int size) + uint32_t z, + uint32_t x, + uint32_t size) { - int sh = 0; - int t1 = 1; - int t1_plus2 = 1; - int t2_plus2 = 0; - int t_double = 2; - int z_double = 3; - int my_z = 4; + uint32_t sh = 0u; + uint32_t t1 = 1u; + uint32_t t1_plus2 = 1u; + uint32_t t2_plus2 = 0u; + uint32_t t_double = 2u; + uint32_t z_double = 3u; + uint32_t my_z = 4u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, my_z, z); - CY_CRYPTO_VU_LD_REG (base, z_double, x); + CY_CRYPTO_VU_LD_REG (base, my_z, z); + CY_CRYPTO_VU_LD_REG (base, z_double, x); - CY_CRYPTO_VU_ALLOC_MEM (base, t_double, 2u * size); - CY_CRYPTO_VU_ALLOC_MEM (base, t1, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t_double, 2u * size); + CY_CRYPTO_VU_ALLOC_MEM (base, t1, size); - CY_CRYPTO_VU_SET_REG (base, sh, size, 1u); /* sh = k (k \equiv size) */ - CY_CRYPTO_VU_LSR (base, my_z, z_double, sh); /* a/b^{k} (q1*b) */ + CY_CRYPTO_VU_SET_REG (base, sh, size, 1u); /* sh = k (k \equiv size) */ + CY_CRYPTO_VU_LSR (base, my_z, z_double, sh); /* a/b^{k} (q1*b) */ - CY_CRYPTO_VU_UMUL (base, t_double, my_z, VR_BARRETT); /* a/b^{k}*VR_BARRETT (q2*b) */ - CY_CRYPTO_VU_LSR (base, t1, t_double, sh); /* q2*b/b^{k} = q2/b^{k-1} */ + CY_CRYPTO_VU_UMUL (base, t_double, my_z, VR_BARRETT); /* a/b^{k}*VR_BARRETT (q2*b) */ + CY_CRYPTO_VU_LSR (base, t1, t_double, sh); /* q2*b/b^{k} = q2/b^{k-1} */ - CY_CRYPTO_VU_UMUL (base, t_double, t1, VR_P); + CY_CRYPTO_VU_UMUL (base, t_double, t1, VR_P); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t1)); - CY_CRYPTO_VU_ALLOC_MEM (base, t1_plus2, size + 2u); - CY_CRYPTO_VU_ALLOC_MEM (base, t2_plus2, size + 2u); + CY_CRYPTO_VU_ALLOC_MEM (base, t1_plus2, size + 2u); + CY_CRYPTO_VU_ALLOC_MEM (base, t2_plus2, size + 2u); - CY_CRYPTO_VU_SUB (base, t2_plus2, z_double, t_double); + CY_CRYPTO_VU_SUB (base, t2_plus2, z_double, t_double); - CY_CRYPTO_VU_SUB (base, t1_plus2, t2_plus2, VR_P); - CY_CRYPTO_VU_COND_SWAP_REG (base, CY_CRYPTO_VU_COND_CC, t1_plus2, t2_plus2); + CY_CRYPTO_VU_SUB (base, t1_plus2, t2_plus2, VR_P); + CY_CRYPTO_VU_COND_SWAP_REG (base, CY_CRYPTO_VU_COND_CC, t1_plus2, t2_plus2); - CY_CRYPTO_VU_SUB (base, t2_plus2, t1_plus2, VR_P); - CY_CRYPTO_VU_COND_MOV (base, CY_CRYPTO_VU_COND_CC, my_z, t1_plus2); - CY_CRYPTO_VU_COND_MOV (base, CY_CRYPTO_VU_COND_CS, my_z, t2_plus2); + CY_CRYPTO_VU_SUB (base, t2_plus2, t1_plus2, VR_P); + CY_CRYPTO_VU_COND_MOV (base, CY_CRYPTO_VU_COND_CC, my_z, t1_plus2); + CY_CRYPTO_VU_COND_MOV (base, CY_CRYPTO_VU_COND_CS, my_z, t2_plus2); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t2_plus2) | CY_CRYPTO_VU_REG_BIT(t1_plus2) | @@ -1291,7 +1198,7 @@ void Cy_Crypto_Core_EC_Bar_MulRed(CRYPTO_Type *base, * * \param z * Result = x mod P = a*b mod P [224 bits]. -* +* * \param x * Product = a*b [2*224 bits]. * @@ -1299,10 +1206,7 @@ void Cy_Crypto_Core_EC_Bar_MulRed(CRYPTO_Type *base, * Bit size. * *******************************************************************************/ -void Cy_Crypto_Core_EC_MulRed(CRYPTO_Type *base, - int z, - int x, - int size) +static void Cy_Crypto_Core_EC_MulRed(CRYPTO_Type *base, uint32_t z, uint32_t x, uint32_t size) { switch (mul_red_alg_select) { @@ -1334,7 +1238,7 @@ void Cy_Crypto_Core_EC_MulRed(CRYPTO_Type *base, * * \param z * Result = a * b % mod. Register index for product value. -* +* * \param a * Register index for multiplicand value. * @@ -1346,15 +1250,15 @@ void Cy_Crypto_Core_EC_MulRed(CRYPTO_Type *base, * *******************************************************************************/ void Cy_Crypto_Core_EC_MulMod( CRYPTO_Type *base, - int z, - int a, - int b, - int size) + uint32_t z, + uint32_t a, + uint32_t b, + uint32_t size) { - int ab_double = 0; - int my_z = 1; - int my_a = 2; - int my_b = 3; + uint32_t ab_double = 0u; + uint32_t my_z = 1u; + uint32_t my_a = 2u; + uint32_t my_b = 3u; CY_CRYPTO_VU_PUSH_REG (base); @@ -1362,12 +1266,12 @@ void Cy_Crypto_Core_EC_MulMod( CRYPTO_Type *base, CY_CRYPTO_VU_LD_REG(base, my_a, a); CY_CRYPTO_VU_LD_REG(base, my_b, b); - CY_CRYPTO_VU_ALLOC_MEM (base, ab_double, 2 * size); + CY_CRYPTO_VU_ALLOC_MEM (base, ab_double, 2u * size); - CY_CRYPTO_VU_UMUL (base, ab_double, my_a, my_b); + CY_CRYPTO_VU_UMUL (base, ab_double, my_a, my_b); /* Modular Reduction: Barrett reduction or curve-specific or shift-multiply */ - Cy_Crypto_Core_EC_MulRed(base, my_z, ab_double, size); + Cy_Crypto_Core_EC_MulRed(base, my_z, ab_double, size); CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(ab_double)); @@ -1387,7 +1291,7 @@ void Cy_Crypto_Core_EC_MulMod( CRYPTO_Type *base, * * \param z * Result = a + b % mod. Register index for sum value -* +* * \param a * Register index for augend a value. * @@ -1395,10 +1299,10 @@ void Cy_Crypto_Core_EC_MulMod( CRYPTO_Type *base, * Register index for addend b value. * *******************************************************************************/ -void Cy_Crypto_Core_EC_AddMod( CRYPTO_Type *base, int z, int a, int b) +void Cy_Crypto_Core_EC_AddMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t b) { - CY_CRYPTO_VU_ADD (base, z, a, b); /* C = (sum >= 2^n) */ - CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, z, VR_P); /* C = (sum >= mod) */ + CY_CRYPTO_VU_ADD (base, z, a, b); /* C = (sum >= 2^n) */ + CY_CRYPTO_VU_COND_CMP_SUB (base, CY_CRYPTO_VU_COND_CC, z, VR_P); /* C = (sum >= mod) */ CY_CRYPTO_VU_COND_SUB (base, CY_CRYPTO_VU_COND_CS, z, z, VR_P); } @@ -1414,7 +1318,7 @@ void Cy_Crypto_Core_EC_AddMod( CRYPTO_Type *base, int z, int a, int b) * * \param z * Result = a - b % mod. Register index for difference value. -* +* * \param a * Register index for minuend a value. * @@ -1422,7 +1326,7 @@ void Cy_Crypto_Core_EC_AddMod( CRYPTO_Type *base, int z, int a, int b) * RRegister index for subtrahend b value. * *******************************************************************************/ -void Cy_Crypto_Core_EC_SubMod( CRYPTO_Type *base, int z, int a, int b) +void Cy_Crypto_Core_EC_SubMod( CRYPTO_Type *base, uint32_t z, uint32_t a, uint32_t b) { CY_CRYPTO_VU_SUB (base, z, a, b); /* C = (a >= b) */ CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_CC, z, z, VR_P); @@ -1442,12 +1346,12 @@ void Cy_Crypto_Core_EC_SubMod( CRYPTO_Type *base, int z, int a, int b) * * \param z * Result = a / 2 % mod.Register index for result value. -* +* * \param a * Register index for value to be halved. * *******************************************************************************/ -void Cy_Crypto_Core_EC_HalfMod( CRYPTO_Type *base, int z, int a) +void Cy_Crypto_Core_EC_HalfMod( CRYPTO_Type *base, uint32_t z, uint32_t a) { CY_CRYPTO_VU_TST (base, a); CY_CRYPTO_VU_COND_ADD (base, CY_CRYPTO_VU_COND_ODD, a, a, VR_P); @@ -1466,7 +1370,7 @@ void Cy_Crypto_Core_EC_HalfMod( CRYPTO_Type *base, int z, int a) * * \param z * Result = a * a % mod. Register index for product value. -* +* * \param a * Register index for multiplicand and multiplier value. * @@ -1475,9 +1379,9 @@ void Cy_Crypto_Core_EC_HalfMod( CRYPTO_Type *base, int z, int a) * *******************************************************************************/ void Cy_Crypto_Core_EC_SquareMod( CRYPTO_Type *base, - int z, - int a, - int size) + uint32_t z, + uint32_t a, + uint32_t size) { Cy_Crypto_Core_EC_MulMod( base, z, a, a, size); } @@ -1489,14 +1393,15 @@ void Cy_Crypto_Core_EC_SquareMod( CRYPTO_Type *base, * * Modular division in GF(VR_P). * This algorithm works when "dividend" and "divisor" are relatively prime, -* Reference: "From Euclid's GCD to Montgomery Multiplication to the Great Divide", S.C. Schantz +* Reference: "From Euclid's GCD to Montgomery Multiplication to the Great Divide", +* S.C. Schantz * * \param base * The pointer to a Crypto instance. * * \param z * Result = a / b % mod. Register index for quotient value. -* +* * \param a * Register index for dividend value. * @@ -1508,40 +1413,40 @@ void Cy_Crypto_Core_EC_SquareMod( CRYPTO_Type *base, * *******************************************************************************/ void Cy_Crypto_Core_EC_DivMod( CRYPTO_Type *base, - int z, - int a, - int b, - int size) + uint32_t z, + uint32_t a, + uint32_t b, + uint32_t size) { - int my_dividend = 7; - int my_divisor = 8; - int my_a = 9; - int my_b = 10; - int my_u = 11; - int my_v = 12; + uint32_t my_dividend = 7u; + uint32_t my_divisor = 8u; + uint32_t my_a = 9u; + uint32_t my_b = 10u; + uint32_t my_u = 11u; + uint32_t my_v = 12u; - uint16_t zero; - uint16_t carry; - uint16_t a_even; - uint16_t b_even; + uint32_t zero; + uint32_t carry; + uint32_t a_even; + uint32_t b_even; - volatile uint16_t status0; - volatile uint16_t status1; - volatile uint16_t status2; + uint32_t status0; + uint32_t status1; + uint32_t status2; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG(base, my_dividend, a); - CY_CRYPTO_VU_LD_REG(base, my_divisor, b); - CY_CRYPTO_VU_LD_REG(base, my_u, z); + CY_CRYPTO_VU_LD_REG(base, my_dividend, a); + CY_CRYPTO_VU_LD_REG(base, my_divisor, b); + CY_CRYPTO_VU_LD_REG(base, my_u, z); - CY_CRYPTO_VU_ALLOC_MEM (base, my_a, size); - CY_CRYPTO_VU_ALLOC_MEM (base, my_b, size); - CY_CRYPTO_VU_ALLOC_MEM (base, my_v, size); + CY_CRYPTO_VU_ALLOC_MEM (base, my_a, size); + CY_CRYPTO_VU_ALLOC_MEM (base, my_b, size); + CY_CRYPTO_VU_ALLOC_MEM (base, my_v, size); - CY_CRYPTO_VU_MOV (base, my_a, my_divisor); - CY_CRYPTO_VU_MOV (base, my_b, VR_P); - CY_CRYPTO_VU_MOV (base, my_u, my_dividend); + CY_CRYPTO_VU_MOV (base, my_a, my_divisor); + CY_CRYPTO_VU_MOV (base, my_b, VR_P); + CY_CRYPTO_VU_MOV (base, my_u, my_dividend); CY_CRYPTO_VU_SET_TO_ZERO (base, my_v); @@ -1558,41 +1463,41 @@ void Cy_Crypto_Core_EC_DivMod( CRYPTO_Type *base, Cy_Crypto_Core_WaitForReady(base); - zero = status0 & (1 << CY_CRYPTO_VU_STATUS_ZERO); /* a == b */ - carry = status0 & (1 << CY_CRYPTO_VU_STATUS_CARRY); /* a >= b */ - a_even = status1 & (1 << CY_CRYPTO_VU_STATUS_EVEN); - b_even = status2 & (1 << CY_CRYPTO_VU_STATUS_EVEN); + zero = status0 & CY_CRYPTO_VU_STATUS_ZERO_BIT; /* a == b */ + carry = status0 & CY_CRYPTO_VU_STATUS_CARRY_BIT; /* a >= b */ + a_even = status1 & CY_CRYPTO_VU_STATUS_EVEN_BIT; + b_even = status2 & CY_CRYPTO_VU_STATUS_EVEN_BIT; - if (zero) + if (0u != zero) { break; } - if (a_even) + if (0u != a_even) { - CY_CRYPTO_VU_LSR1 (base, my_a, my_a); - Cy_Crypto_Core_EC_HalfMod( base, my_u, my_u); + CY_CRYPTO_VU_LSR1 (base, my_a, my_a); + Cy_Crypto_Core_EC_HalfMod( base, my_u, my_u); } - else if (b_even) + else if (0u != b_even) { - CY_CRYPTO_VU_LSR1 (base, my_b, my_b); - Cy_Crypto_Core_EC_HalfMod( base, my_v, my_v); + CY_CRYPTO_VU_LSR1 (base, my_b, my_b); + Cy_Crypto_Core_EC_HalfMod( base, my_v, my_v); } - else if (carry) + else if (0u != carry) { /* (a >= b) */ - CY_CRYPTO_VU_SUB (base, my_a, my_a, my_b); - CY_CRYPTO_VU_LSR1 (base, my_a, my_a); + CY_CRYPTO_VU_SUB (base, my_a, my_a, my_b); + CY_CRYPTO_VU_LSR1 (base, my_a, my_a); - Cy_Crypto_Core_EC_SubMod( base, my_u, my_u, my_v); - Cy_Crypto_Core_EC_HalfMod( base, my_u, my_u); + Cy_Crypto_Core_EC_SubMod( base, my_u, my_u, my_v); + Cy_Crypto_Core_EC_HalfMod( base, my_u, my_u); } else { - CY_CRYPTO_VU_SUB (base, my_b, my_b, my_a); - CY_CRYPTO_VU_LSR1 (base, my_b, my_b); + CY_CRYPTO_VU_SUB (base, my_b, my_b, my_a); + CY_CRYPTO_VU_LSR1 (base, my_b, my_b); - Cy_Crypto_Core_EC_SubMod( base, my_v, my_v, my_u); - Cy_Crypto_Core_EC_HalfMod( base, my_v, my_v); + Cy_Crypto_Core_EC_SubMod( base, my_v, my_v, my_u); + Cy_Crypto_Core_EC_HalfMod( base, my_v, my_v); } } @@ -1613,7 +1518,7 @@ void Cy_Crypto_Core_EC_DivMod( CRYPTO_Type *base, * * \param s_x * Register index for affine X coordinate and Jacobian projective X coordinate. -* +* * \param s_y * Register index for affine Y coordinate and Jacobian projective Y coordinate. * @@ -1621,12 +1526,8 @@ void Cy_Crypto_Core_EC_DivMod( CRYPTO_Type *base, * Register index for Jacobian projective Z coordinate. * *******************************************************************************/ -void Cy_Crypto_Core_JacobianTransform(CRYPTO_Type *base, - int s_x, - int s_y, - int s_z) +void Cy_Crypto_Core_JacobianTransform(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t s_z) { - CY_CRYPTO_VU_SET_TO_ONE (base, s_z); } @@ -1643,7 +1544,7 @@ void Cy_Crypto_Core_JacobianTransform(CRYPTO_Type *base, * * \param s_x * Register index for affine X coordinate and Jacobian projective X coordinate. -* +* * \param s_y * Register index for affine Y coordinate and Jacobian projective Y coordinate. * @@ -1654,38 +1555,34 @@ void Cy_Crypto_Core_JacobianTransform(CRYPTO_Type *base, * Bit size. * *******************************************************************************/ -void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, - int s_x, - int s_y, - int s_z, - int size) +void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t s_z, uint32_t size) { - int t1 = 7; - int t2 = 8; - int t3 = 9; - int my_s_x = 10; - int my_s_y = 11; - int my_s_z = 12; + uint32_t t1 = 7u; + uint32_t t2 = 8u; + uint32_t t3 = 9u; + uint32_t my_s_x = 10u; + uint32_t my_s_y = 11u; + uint32_t my_s_z = 12u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); - CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); - CY_CRYPTO_VU_LD_REG(base, my_s_z, s_z); + CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); + CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); + CY_CRYPTO_VU_LD_REG(base, my_s_z, s_z); - CY_CRYPTO_VU_ALLOC_MEM (base, t1, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t2, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t3, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t1, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t2, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t3, size); - CY_CRYPTO_VU_SET_TO_ONE (base, t1); /* t1 = 1 */ - Cy_Crypto_Core_EC_DivMod( base, t2, t1, my_s_z, size); /* t2 = 1/Z */ + CY_CRYPTO_VU_SET_TO_ONE (base, t1); /* t1 = 1 */ + Cy_Crypto_Core_EC_DivMod( base, t2, t1, my_s_z, size); /* t2 = 1/Z */ - Cy_Crypto_Core_EC_SquareMod( base, t1, t2, size); /* t1 = 1/Z^2 */ - Cy_Crypto_Core_EC_MulMod( base, my_s_x, my_s_x, t1, size); /* my_s_x = X/Z^2 */ + Cy_Crypto_Core_EC_SquareMod( base, t1, t2, size); /* t1 = 1/Z^2 */ + Cy_Crypto_Core_EC_MulMod( base, my_s_x, my_s_x, t1, size); /* my_s_x = X/Z^2 */ - Cy_Crypto_Core_EC_MulMod( base, t3, my_s_y, t1, size); /* t3 = Y/Z^2 */ - Cy_Crypto_Core_EC_MulMod( base, my_s_y, t3, t2, size); /* my_s_y = Y/Z^3 */ + Cy_Crypto_Core_EC_MulMod( base, t3, my_s_y, t1, size); /* t3 = Y/Z^2 */ + Cy_Crypto_Core_EC_MulMod( base, my_s_y, t3, t2, size); /* my_s_y = Y/Z^3 */ CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t1) | CY_CRYPTO_VU_REG_BIT(t2) | CY_CRYPTO_VU_REG_BIT(t3)); @@ -1694,7 +1591,7 @@ void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, /******************************************************************************* -* Function Name: Cy_Crypto_Core_JacobianInvTransform +* Function Name: Cy_Crypto_Core_JacobianEcAdd ****************************************************************************//** * * Elliptic curve point addition on mixed Jacobian projective (s) / affine (t) coordinates in GF(VR_P). @@ -1707,7 +1604,7 @@ void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, * * \param s_x * Register index for Jacobian projective X coordinate. -* +* * \param s_y * Register index for Jacobian projective Y coordinate. * @@ -1716,7 +1613,7 @@ void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, * * \param t_x * Register index for affine X coordinate. -* +* * \param t_y * Register index for affine Y coordinate. * @@ -1725,58 +1622,58 @@ void Cy_Crypto_Core_JacobianInvTransform(CRYPTO_Type *base, * *******************************************************************************/ void Cy_Crypto_Core_JacobianEcAdd(CRYPTO_Type *base, - int s_x, - int s_y, - int s_z, - int t_x, - int t_y, - int size + uint32_t s_x, + uint32_t s_y, + uint32_t s_z, + uint32_t t_x, + uint32_t t_y, + uint32_t size ) { - int t6 = 4; - int t7 = 5; - int t8 = 6; - int t9 = 7; - int my_s_x = 8; - int my_s_y = 9; - int my_s_z = 10; - int my_t_x = 11; - int my_t_y = 12; + uint32_t t6 = 4u; + uint32_t t7 = 5u; + uint32_t t8 = 6u; + uint32_t t9 = 7u; + uint32_t my_s_x = 8u; + uint32_t my_s_y = 9u; + uint32_t my_s_z = 10u; + uint32_t my_t_x = 11u; + uint32_t my_t_y = 12u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); - CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); - CY_CRYPTO_VU_LD_REG(base, my_s_z, s_z); - CY_CRYPTO_VU_LD_REG(base, my_t_x, t_x); - CY_CRYPTO_VU_LD_REG(base, my_t_y, t_y); + CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); + CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); + CY_CRYPTO_VU_LD_REG(base, my_s_z, s_z); + CY_CRYPTO_VU_LD_REG(base, my_t_x, t_x); + CY_CRYPTO_VU_LD_REG(base, my_t_y, t_y); - CY_CRYPTO_VU_ALLOC_MEM (base, t6, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t7, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t8, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t9, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t6, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t7, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t8, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t9, size); - Cy_Crypto_Core_EC_SquareMod( base, t6, my_s_z, size); /* t6 = ZZ */ - Cy_Crypto_Core_EC_MulMod( base, t8, my_t_x, t6, size); /* t8 = xZZ = B */ - Cy_Crypto_Core_EC_MulMod( base, t7, my_t_y, my_s_z, size); /* t7 = yZ */ - Cy_Crypto_Core_EC_SubMod( base, my_s_x, my_s_x, t8); /* my_s_x = X - B = E */ + Cy_Crypto_Core_EC_SquareMod( base, t6, my_s_z, size); /* t6 = ZZ */ + Cy_Crypto_Core_EC_MulMod( base, t8, my_t_x, t6, size); /* t8 = xZZ = B */ + Cy_Crypto_Core_EC_MulMod( base, t7, my_t_y, my_s_z, size); /* t7 = yZ */ + Cy_Crypto_Core_EC_SubMod( base, my_s_x, my_s_x, t8); /* my_s_x = X - B = E */ - Cy_Crypto_Core_EC_MulMod( base, my_s_z, my_s_x, my_s_z, size); /* my_s_z = E*Z = Z3 */ - Cy_Crypto_Core_EC_MulMod( base, t9, t7, t6, size); /* t9 = yZZZ = D */ - Cy_Crypto_Core_EC_SubMod( base, my_s_y, my_s_y, t9); /* my_s_y = Y - D = F */ - Cy_Crypto_Core_EC_SquareMod( base, t6, my_s_x, size); /* t6 = EE */ + Cy_Crypto_Core_EC_MulMod( base, my_s_z, my_s_x, my_s_z, size); /* my_s_z = E*Z = Z3 */ + Cy_Crypto_Core_EC_MulMod( base, t9, t7, t6, size); /* t9 = yZZZ = D */ + Cy_Crypto_Core_EC_SubMod( base, my_s_y, my_s_y, t9); /* my_s_y = Y - D = F */ + Cy_Crypto_Core_EC_SquareMod( base, t6, my_s_x, size); /* t6 = EE */ - Cy_Crypto_Core_EC_MulMod( base, t7, t8, t6, size); /* t7 = B*EE */ - Cy_Crypto_Core_EC_MulMod( base, t8, t6, my_s_x, size); /* t8 = EEE */ - Cy_Crypto_Core_EC_MulMod( base, t6, t9, t8, size); /* t6 = D*EEE */ - Cy_Crypto_Core_EC_SquareMod( base, my_s_x, my_s_y, size); /* my_s_x = FF */ - Cy_Crypto_Core_EC_SubMod( base, my_s_x, my_s_x, t8); /* my_s_x = FF - EEE */ - Cy_Crypto_Core_EC_AddMod( base, t9, t7, t7); /* t9 = 2*B*EE */ - Cy_Crypto_Core_EC_SubMod( base, my_s_x, my_s_x, t9); /* my_s_x = FF - EEE - 2*B*EE = X3 */ - Cy_Crypto_Core_EC_SubMod( base, t7, t7, my_s_x); /* t7 = B*EE - X3 */ - Cy_Crypto_Core_EC_MulMod( base, my_s_y, my_s_y, t7, size); /* my_s_y = F*(B*EE - X3) */ - Cy_Crypto_Core_EC_SubMod( base, my_s_y, my_s_y, t6); /* my_s_y = F*(3*B*EE - FF + EEE) - D*EEE = Y3 */ + Cy_Crypto_Core_EC_MulMod( base, t7, t8, t6, size); /* t7 = B*EE */ + Cy_Crypto_Core_EC_MulMod( base, t8, t6, my_s_x, size); /* t8 = EEE */ + Cy_Crypto_Core_EC_MulMod( base, t6, t9, t8, size); /* t6 = D*EEE */ + Cy_Crypto_Core_EC_SquareMod( base, my_s_x, my_s_y, size); /* my_s_x = FF */ + Cy_Crypto_Core_EC_SubMod( base, my_s_x, my_s_x, t8); /* my_s_x = FF - EEE */ + Cy_Crypto_Core_EC_AddMod( base, t9, t7, t7); /* t9 = 2*B*EE */ + Cy_Crypto_Core_EC_SubMod( base, my_s_x, my_s_x, t9); /* my_s_x = FF - EEE - 2*B*EE = X3 */ + Cy_Crypto_Core_EC_SubMod( base, t7, t7, my_s_x); /* t7 = B*EE - X3 */ + Cy_Crypto_Core_EC_MulMod( base, my_s_y, my_s_y, t7, size); /* my_s_y = F*(B*EE - X3) */ + Cy_Crypto_Core_EC_SubMod( base, my_s_y, my_s_y, t6); /* my_s_y = F*(3*B*EE - FF + EEE) - D*EEE = Y3 */ CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t6) | CY_CRYPTO_VU_REG_BIT(t7) | CY_CRYPTO_VU_REG_BIT(t8) | CY_CRYPTO_VU_REG_BIT(t9)); @@ -1796,7 +1693,7 @@ void Cy_Crypto_Core_JacobianEcAdd(CRYPTO_Type *base, * * \param s_x * Register index for Jacobian projective X coordinate. -* +* * \param s_y * Register index for Jacobian projective Y coordinate. * @@ -1808,80 +1705,58 @@ void Cy_Crypto_Core_JacobianEcAdd(CRYPTO_Type *base, * *******************************************************************************/ void Cy_Crypto_Core_JacobianEcDouble(CRYPTO_Type *base, - int s_x, - int s_y, - int s_z, - int size + uint32_t s_x, + uint32_t s_y, + uint32_t s_z, + uint32_t size ) /* 4M + 4S + 10A */ { - - int t1 = 1; - int t2 = 2; - int t3 = 3; - int t4 = 4; - int my_s_x = 5; - int my_s_y = 6; - int my_s_z = 7; + uint32_t t1 = 1u; + uint32_t t2 = 2u; + uint32_t t3 = 3u; + uint32_t t4 = 4u; + uint32_t my_s_x = 5u; + uint32_t my_s_y = 6u; + uint32_t my_s_z = 7u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); - CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); - CY_CRYPTO_VU_LD_REG(base, my_s_z, s_z); + CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); + CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); + CY_CRYPTO_VU_LD_REG(base, my_s_z, s_z); - CY_CRYPTO_VU_ALLOC_MEM (base, t1, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t2, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t3, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t4, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t1, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t2, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t3, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t4, size); - Cy_Crypto_Core_EC_SquareMod( base, t4, my_s_y, size); /* t4 = Y^2 */ + Cy_Crypto_Core_EC_SquareMod( base, t4, my_s_y, size); /* t4 = Y^2 */ + Cy_Crypto_Core_EC_SquareMod( base, t3, my_s_z, size); /* t3 = Z^2 */ + Cy_Crypto_Core_EC_MulMod( base, my_s_z, my_s_y, my_s_z, size); /* my_s_z = Y*Z */ - Cy_Crypto_Core_EC_SquareMod( base, t3, my_s_z, size); /* t3 = Z^2 */ + Cy_Crypto_Core_EC_MulMod( base, my_s_y, my_s_x, t4, size); /* my_s_y = X*Y^2 = A */ + Cy_Crypto_Core_EC_AddMod( base, my_s_x, my_s_x, t3); /* my_s_x = X + Z^2 */ + Cy_Crypto_Core_EC_AddMod( base, t3, t3, t3); /* t3 = 2*Z^2 */ + Cy_Crypto_Core_EC_SubMod( base, t3, my_s_x, t3); /* t3 = (X + Z^2) - 2*Z^2 = X - Z^2 */ + Cy_Crypto_Core_EC_MulMod( base, t1, my_s_x, t3, size); /* t1 = (X + Z^2) * (X - Z^2) = X^2 - Z^4 */ - Cy_Crypto_Core_EC_MulMod( base, my_s_z, my_s_y, my_s_z, size); /* my_s_z = Y*Z */ + Cy_Crypto_Core_EC_AddMod( base, t3, t1, t1); /* t3 = 2*(X^2 - Z^4) */ + Cy_Crypto_Core_EC_AddMod( base, t1, t1, t3); /* t1 = 3*(X^2 - Z^4) */ + Cy_Crypto_Core_EC_HalfMod( base, t1, t1); /* t1 = 3/2*(X^2 - Z^4) = B */ + Cy_Crypto_Core_EC_SquareMod( base, t3, t1, size); /* t3 = 9/4*(X^2 - Z^4) = B^2 */ + Cy_Crypto_Core_EC_SubMod( base, t3, t3, my_s_y); /* t3 = B^2 - A */ + Cy_Crypto_Core_EC_SubMod( base, my_s_x, t3, my_s_y); /* my_s_x = B^2 - 2*A */ + Cy_Crypto_Core_EC_SubMod( base, my_s_y, my_s_y, my_s_x); /* my_s_y = A - (B^2 - 2*A) = 3*A - B^2 */ + Cy_Crypto_Core_EC_MulMod( base, t2, t1, my_s_y, size); /* t2 = B*(3*A - B^2) */ - Cy_Crypto_Core_EC_MulMod( base, my_s_y, my_s_x, t4, size); /* my_s_y = X*Y^2 = A */ - - Cy_Crypto_Core_EC_AddMod( base, my_s_x, my_s_x, t3); /* my_s_x = X + Z^2 */ - - Cy_Crypto_Core_EC_AddMod( base, t3, t3, t3); /* t3 = 2*Z^2 */ - - Cy_Crypto_Core_EC_SubMod( base, t3, my_s_x, t3); /* t3 = (X + Z^2) - 2*Z^2 = X - Z^2 */ - - Cy_Crypto_Core_EC_MulMod( base, t1, my_s_x, t3, size); /* t1 = (X + Z^2) * (X - Z^2) = X^2 - Z^4 */ - - - Cy_Crypto_Core_EC_AddMod( base, t3, t1, t1); /* t3 = 2*(X^2 - Z^4) */ - - Cy_Crypto_Core_EC_AddMod( base, t1, t1, t3); /* t1 = 3*(X^2 - Z^4) */ - - Cy_Crypto_Core_EC_HalfMod( base, t1, t1); /* t1 = 3/2*(X^2 - Z^4) = B */ - - Cy_Crypto_Core_EC_SquareMod( base, t3, t1, size); /* t3 = 9/4*(X^2 - Z^4) = B^2 */ - - - Cy_Crypto_Core_EC_SubMod( base, t3, t3, my_s_y); /* t3 = B^2 - A */ - - Cy_Crypto_Core_EC_SubMod( base, my_s_x, t3, my_s_y); /* my_s_x = B^2 - 2*A */ - - Cy_Crypto_Core_EC_SubMod( base, my_s_y, my_s_y, my_s_x); /* my_s_y = A - (B^2 - 2*A) = 3*A - B^2 */ - - Cy_Crypto_Core_EC_MulMod( base, t2, t1, my_s_y, size); /* t2 = B*(3*A - B^2) */ - - - Cy_Crypto_Core_EC_SquareMod( base, t1, t4, size); /* t1 = Y^4 */ - - Cy_Crypto_Core_EC_SubMod( base, my_s_y, t2, t1); /* my_s_y = B*(3*A - B^2) - Y^4 */ - + Cy_Crypto_Core_EC_SquareMod( base, t1, t4, size); /* t1 = Y^4 */ + Cy_Crypto_Core_EC_SubMod( base, my_s_y, t2, t1); /* my_s_y = B*(3*A - B^2) - Y^4 */ CY_CRYPTO_VU_FREE_MEM (base, CY_CRYPTO_VU_REG_BIT(t1) | CY_CRYPTO_VU_REG_BIT(t2) | CY_CRYPTO_VU_REG_BIT(t3) | CY_CRYPTO_VU_REG_BIT(t4)); - CY_CRYPTO_VU_POP_REG (base); - - } @@ -1896,7 +1771,7 @@ void Cy_Crypto_Core_JacobianEcDouble(CRYPTO_Type *base, * * \param s_x * Register index for affine X coordinate. -* +* * \param s_y * Register index for affine Y coordinate. * @@ -1907,46 +1782,41 @@ void Cy_Crypto_Core_JacobianEcDouble(CRYPTO_Type *base, * Bit size. * *******************************************************************************/ -void Cy_Crypto_Core_JacobianEcScalarMul(CRYPTO_Type *base, - int s_x, - int s_y, - int d, - int size -) +void Cy_Crypto_Core_JacobianEcScalarMul(CRYPTO_Type *base, uint32_t s_x, uint32_t s_y, uint32_t d, uint32_t size) { - - int i; - uint16_t status; - uint16_t carry; + uint32_t i; + uint32_t status; + uint32_t carry; uint16_t clsame; - int clr = 5; - int t = 6; - int my_s_x = 7; - int my_s_y = 8; - int my_s_z = 9; - int my_t_x = 10; - int my_t_y = 11; - int my_d = 12; + uint32_t clr = 5u; + uint32_t t = 6u; + uint32_t my_s_x = 7u; + uint32_t my_s_y = 8u; + uint32_t my_s_z = 9u; + uint32_t my_t_x = 10u; + uint32_t my_t_y = 11u; + uint32_t my_d = 12u; CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); - CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); - CY_CRYPTO_VU_LD_REG(base, my_d, d); + CY_CRYPTO_VU_LD_REG(base, my_s_x, s_x); + CY_CRYPTO_VU_LD_REG(base, my_s_y, s_y); + CY_CRYPTO_VU_LD_REG(base, my_d, d); - CY_CRYPTO_VU_ALLOC_MEM (base, clr, size); - CY_CRYPTO_VU_ALLOC_MEM (base, t, size); - CY_CRYPTO_VU_ALLOC_MEM (base, my_s_z, size); - CY_CRYPTO_VU_ALLOC_MEM (base, my_t_x, size); - CY_CRYPTO_VU_ALLOC_MEM (base, my_t_y, size); + CY_CRYPTO_VU_ALLOC_MEM (base, clr, size); + CY_CRYPTO_VU_ALLOC_MEM (base, t, size); + CY_CRYPTO_VU_ALLOC_MEM (base, my_s_z, size); + CY_CRYPTO_VU_ALLOC_MEM (base, my_t_x, size); + CY_CRYPTO_VU_ALLOC_MEM (base, my_t_y, size); /* my_t_x has the same initial value of my_s_x, but does not point to the * same address in memory as my_s_x, i.e. different value after point doubling - * my_t_x and my_t_y do not change from (original Jacobian projective coordinates of) original base point + * my_t_x and my_t_y do not change from (original Jacobian projective coordinates of) + * original base point */ - CY_CRYPTO_VU_MOV (base, my_t_x, my_s_x); - CY_CRYPTO_VU_MOV (base, my_t_y, my_s_y); + CY_CRYPTO_VU_MOV (base, my_t_x, my_s_x); + CY_CRYPTO_VU_MOV (base, my_t_y, my_s_y); /* Affine-to-Jacobian Transform. */ CY_CRYPTO_VU_SET_TO_ONE (base, my_s_z); @@ -1964,12 +1834,16 @@ void Cy_Crypto_Core_JacobianEcScalarMul(CRYPTO_Type *base, /* Binary left-to-right algorithm * Perform point addition and point doubling to implement scalar multiplication - * Scan the bits of the scalar from left to right; perform point doubling for each bit, and perform point addition when the bit is set. - * Carry set if current bit is equal to 1 (hence, perform point addition - point doubling is always performed) + * Scan the bits of the scalar from left to right; perform point doubling for each bit, + * and perform point addition when the bit is set. + * Carry set if current bit is equal to 1 (hence, perform point addition - point + * doubling is always performed) */ - for (i = 0; i < (size - clsame - 1); i++) + for (i = 0u; i < (size - clsame - 1u); i++) { - /* Carry set if current bit is equal to 1 (hence, perform point addition - point doubling is always performed) */ + /* Carry set if current bit is equal to 1 (hence, perform point addition - point + * doubling is always performed) + */ CY_CRYPTO_VU_LSL1 (base, my_d, my_d); status = Cy_Crypto_Core_Vu_StatusRead(base); @@ -1977,11 +1851,10 @@ void Cy_Crypto_Core_JacobianEcScalarMul(CRYPTO_Type *base, Cy_Crypto_Core_JacobianEcDouble (base, my_s_x, my_s_y, my_s_z, size); - if (carry) + if (carry != 0U) { Cy_Crypto_Core_JacobianEcAdd (base, my_s_x, my_s_y, my_s_z, my_t_x, my_t_y, size); } - } /* Inverse transform */ @@ -2009,7 +1882,7 @@ void Cy_Crypto_Core_JacobianEcScalarMul(CRYPTO_Type *base, * bitsize of the used NIST P curve. * *******************************************************************************/ -void Cy_Crypto_Core_EC_NistP_SetMode(int bitsize) +void Cy_Crypto_Core_EC_NistP_SetMode(uint32_t bitsize) { switch (bitsize) { @@ -2042,7 +1915,8 @@ void Cy_Crypto_Core_EC_NistP_SetMode(int bitsize) * Select which reduction algorithm has to be used. * * \param alg -* one of {CURVE_SPECIFIC_RED_ALG, SHIFT_MUL_RED_ALG, BARRETT_RED_ALG}. See \ref cy_en_crypto_ecc_red_mul_algs_t. +* one of {CURVE_SPECIFIC_RED_ALG, SHIFT_MUL_RED_ALG, BARRETT_RED_ALG}. +* See \ref cy_en_crypto_ecc_red_mul_algs_t. * *******************************************************************************/ void Cy_Crypto_Core_EC_NistP_SetRedAlg(cy_en_crypto_ecc_red_mul_algs_t alg) @@ -2062,13 +1936,13 @@ void Cy_Crypto_Core_EC_NistP_SetRedAlg(cy_en_crypto_ecc_red_mul_algs_t alg) * * \param p_x * Register index for affine X coordinate of base point. -* +* * \param p_y * Register index for affine Y coordinate of base point. * * \param p_d * Register index for multiplication value. -* +* * \param p_order * Register index for order value.. * @@ -2076,14 +1950,13 @@ void Cy_Crypto_Core_EC_NistP_SetRedAlg(cy_en_crypto_ecc_red_mul_algs_t alg) * Bit size of the used curve. * *******************************************************************************/ -void Cy_Crypto_Core_EC_NistP_PointMul(CRYPTO_Type *base, int p_x, int p_y, int p_d, int p_order, int bitsize) +void Cy_Crypto_Core_EC_NistP_PointMul(CRYPTO_Type *base, uint32_t p_x, uint32_t p_y, uint32_t p_d, uint32_t p_order, uint32_t bitsize) { Cy_Crypto_Core_JacobianEcScalarMul (base, p_x, p_y, p_d, bitsize); Cy_Crypto_Core_Vu_WaitForComplete(base); } - /******************************************************************************* * Function Name: Cy_Crypto_Core_EC_NistP_PointMultiplication ****************************************************************************//** @@ -2095,13 +1968,13 @@ void Cy_Crypto_Core_EC_NistP_PointMul(CRYPTO_Type *base, int p_x, int p_y, int p * * \param curveID * Register index for affine X coordinate of base point. -* +* * \param ecpGX * Register index for affine Y coordinate of base point. * * \param ecpGY * Register index for multiplication value. -* +* * \param ecpD * Register index for order value. * @@ -2116,37 +1989,39 @@ void Cy_Crypto_Core_EC_NistP_PointMul(CRYPTO_Type *base, int p_x, int p_y, int p *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_EC_NistP_PointMultiplication(CRYPTO_Type *base, cy_en_crypto_ecc_curve_id_t curveID, - uint8_t* ecpGX, - uint8_t* ecpGY, - uint8_t* ecpD, - uint8_t* ecpQX, - uint8_t* ecpQY) + const uint8_t *ecpGX, + const uint8_t *ecpGY, + const uint8_t *ecpD, + uint8_t *ecpQX, + uint8_t *ecpQY) { /* N.b. If using test vectors from "http://point-at-infinity.org/ecc/nisttv", - * the 'k' values on the website are in decimal form, while the (x,y) result coordinates are in hexadecimal form - * Input format for 'd' scalar multiplier in this test is in hexademical form. - * Hence, convert k_{dec} to d_{hex} for comparison of test values - */ + * the 'k' values on the website are in decimal form, while the (x,y) result + * coordinates are in hexadecimal form + * Input format for 'd' scalar multiplier in this test is in hexadecimal form. + * Hence, convert k_{dec} to d_{hex} for comparison of test values + */ + /* Setup additional registers */ - int VR_ORDER = 9; + uint32_t VR_ORDER = 9u; const uint8_t *p_polynomial = NULL; const uint8_t *p_barrett = NULL; - cy_stc_crypto_ecc_dp_type *eccDp = Cy_Crypto_Core_ECC_GetCurveParams(curveID); + cy_stc_crypto_ecc_dp_type *eccDp = Cy_Crypto_Core_ECC_GetCurveParams(curveID); cy_en_crypto_status_t myStatus = CY_CRYPTO_NOT_SUPPORTED; if (eccDp != NULL) { /* Setup curve specific parameters depending on mode */ - uint32_t size; + uint32_t bitsize; p_polynomial = eccDp->prime; p_barrett = eccDp->barrett_p; - size = eccDp->size; + bitsize = eccDp->size; - /* use barrett reduction algorithm for operations modulo n (order of the base point) */ + /* use Barrett reduction algorithm for operations modulo n (order of the base point) */ Cy_Crypto_Core_EC_NistP_SetRedAlg(eccDp->algo); Cy_Crypto_Core_EC_NistP_SetMode(eccDp->size); @@ -2155,28 +2030,28 @@ cy_en_crypto_status_t Cy_Crypto_Core_EC_NistP_PointMultiplication(CRYPTO_Type *b if ((NULL != ecpGX) && (NULL != ecpGY) && (NULL != ecpD) && (NULL != ecpQX) && (NULL != ecpQY)) { /* Public parameters and characteristics of elliptic curve */ - CY_CRYPTO_VU_ALLOC_MEM (base, VR_D, size); /* Scalar factor */ - CY_CRYPTO_VU_ALLOC_MEM (base, VR_S_X, size); - CY_CRYPTO_VU_ALLOC_MEM (base, VR_S_Y, size); - CY_CRYPTO_VU_ALLOC_MEM (base, VR_P, size); - CY_CRYPTO_VU_ALLOC_MEM (base, VR_BARRETT, size + 1u); - CY_CRYPTO_VU_ALLOC_MEM (base, VR_ORDER, size); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_D, bitsize); /* Scalar factor */ + CY_CRYPTO_VU_ALLOC_MEM (base, VR_S_X, bitsize); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_S_Y, bitsize); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_P, bitsize); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_BARRETT, bitsize + 1u); + CY_CRYPTO_VU_ALLOC_MEM (base, VR_ORDER, bitsize); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, p_polynomial, size); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_P, p_polynomial, bitsize); /* Preparation (either use precalculated or calculated). */ - Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, p_barrett, size + 1u); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_BARRETT, p_barrett, bitsize + 1u); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_S_X, ecpGX, size); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_S_Y, ecpGY, size); - Cy_Crypto_Core_Vu_SetMemValue (base, VR_D, ecpD, size); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_S_X, ecpGX, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_S_Y, ecpGY, bitsize); + Cy_Crypto_Core_Vu_SetMemValue (base, VR_D, ecpD, bitsize); /* ECC calculation: d * G mod p */ - Cy_Crypto_Core_EC_NistP_PointMul(base, VR_S_X, VR_S_Y, VR_D, VR_ORDER, size); + Cy_Crypto_Core_EC_NistP_PointMul(base, VR_S_X, VR_S_Y, VR_D, VR_ORDER, bitsize); /* Get result P = (X,Y) = d.G from EC scalar multiplication */ - Cy_Crypto_Core_Vu_GetMemValue (base, ecpQX, VR_S_X, size); - Cy_Crypto_Core_Vu_GetMemValue (base, ecpQY, VR_S_Y, size); + Cy_Crypto_Core_Vu_GetMemValue (base, ecpQX, VR_S_X, bitsize); + Cy_Crypto_Core_Vu_GetMemValue (base, ecpQY, VR_S_Y, bitsize); /* Free memory */ CY_CRYPTO_VU_FREE_MEM (base, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v1.c index c504700b53..d5a6d3c1ea 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v1.c @@ -65,7 +65,7 @@ static void Cy_Crypto_Core_V1_Hmac_Init(cy_stc_crypto_v1_hmac_state_t *hmacState uint8_t *opad, uint8_t *m0Key); -static void Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, +static cy_en_crypto_status_t Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, cy_stc_crypto_v1_hmac_state_t *hmacState, cy_stc_crypto_sha_state_t *hashState, uint8_t const *key, @@ -118,7 +118,7 @@ static void Cy_Crypto_Core_V1_Hmac_Init(cy_stc_crypto_v1_hmac_state_t *hmacState * Starts HMAC (Hash-based Message Authentication Code) calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmacState * The pointer to the hmacState structure which stores internal variables @@ -144,7 +144,7 @@ static void Cy_Crypto_Core_V1_Hmac_Init(cy_stc_crypto_v1_hmac_state_t *hmacState * The pointer to the calculated HMAC. * *******************************************************************************/ -static void Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, +static cy_en_crypto_status_t Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, cy_stc_crypto_v1_hmac_state_t *hmacState, cy_stc_crypto_sha_state_t *hashState, uint8_t const *key, @@ -153,6 +153,8 @@ static void Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, uint32_t messageSize, uint8_t *hmac) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + uint32_t i = 0uL; uint8_t *ipadPtrTmp = (uint8_t*)hmacState->ipad; uint8_t *opadPtrTmp = (uint8_t*)hmacState->opad; @@ -162,13 +164,22 @@ static void Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, if (keyLength > hashState->blockSize) { /* The key is larger than the block size. Do a hash on the key. */ - Cy_Crypto_Core_V1_Sha_Start (base, hashState); - Cy_Crypto_Core_V1_Sha_Update (base, hashState, key, keyLength); - Cy_Crypto_Core_V1_Sha_Finish (base, hashState, (uint8_t*)m0KeyPtrTmp/*, keyLength*/); + tmpResult = Cy_Crypto_Core_V1_Sha_Start(base, hashState); + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Update(base, hashState, key, keyLength); + } + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Finish(base, hashState, (uint8_t*)m0KeyPtrTmp); + } - /* Append zeros */ - Cy_Crypto_Core_V1_MemSet(base, (m0KeyPtrTmp + hashState->digestSize), 0x00u, - (uint16_t)(hashState->blockSize - hashState->digestSize)); + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /* Append zeros */ + Cy_Crypto_Core_V1_MemSet(base, (m0KeyPtrTmp + hashState->digestSize), 0x00u, + (uint16_t)(hashState->blockSize - hashState->digestSize)); + } } else if (keyLength < hashState->blockSize) { @@ -181,31 +192,59 @@ static void Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, Cy_Crypto_Core_V1_MemCpy(base, m0KeyPtrTmp, key, (uint16_t)keyLength); } - /* Steps 4 and 7 according to FIPS 198-1 */ - while (i < hashState->blockSize) + if (CY_CRYPTO_SUCCESS == tmpResult) { - ipadPtrTmp[i] = CY_CRYPTO_HMAC_IPAD ^ m0KeyPtrTmp[i]; - opadPtrTmp[i] = CY_CRYPTO_HMAC_0PAD ^ m0KeyPtrTmp[i]; - i++; + /* Steps 4 and 7 according to FIPS 198-1 */ + while (i < hashState->blockSize) + { + ipadPtrTmp[i] = CY_CRYPTO_HMAC_IPAD ^ m0KeyPtrTmp[i]; + opadPtrTmp[i] = CY_CRYPTO_HMAC_0PAD ^ m0KeyPtrTmp[i]; + i++; + } + + /* Step 6 according to FIPS 198-1 */ + tmpResult = Cy_Crypto_Core_V1_Sha_Start(base, hashState); + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Update(base, hashState, ipadPtrTmp, hashState->blockSize); + } + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /* Append a message */ + tmpResult = Cy_Crypto_Core_V1_Sha_Update (base, hashState, message, messageSize); + } + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Finish (base, hashState, ipadPtrTmp); + } + + /* Here is the ready part of HASH: Hash((Key^ipad)||text) */ + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /* Steps 8, 9 according to FIPS 198-1 */ + tmpResult = Cy_Crypto_Core_V1_Sha_Start(base, hashState); + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Update(base, hashState, opadPtrTmp, hashState->blockSize); + } + + /* Append HASH from Step 6 */ + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Update(base, hashState, (uint8_t*)ipadPtrTmp, hashState->digestSize); + } + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V1_Sha_Finish(base, hashState, hmac); + } + } } - /* Step 6 according to FIPS 198-1 */ - Cy_Crypto_Core_V1_Sha_Start (base, hashState); - Cy_Crypto_Core_V1_Sha_Update(base, hashState, ipadPtrTmp, hashState->blockSize); - - /* Append a message */ - Cy_Crypto_Core_V1_Sha_Update (base, hashState, message, messageSize); - Cy_Crypto_Core_V1_Sha_Finish (base, hashState, ipadPtrTmp); - - /* Here is the ready part of HASH: Hash((Key^ipad)||text) */ - - /* Steps 8, 9 according to FIPS 198-1 */ - Cy_Crypto_Core_V1_Sha_Start (base, hashState); - Cy_Crypto_Core_V1_Sha_Update(base, hashState, opadPtrTmp, hashState->blockSize); - - /* Append HASH from Step 6 */ - Cy_Crypto_Core_V1_Sha_Update (base, hashState, (uint8_t*)ipadPtrTmp, hashState->digestSize); - Cy_Crypto_Core_V1_Sha_Finish (base, hashState, hmac); + return (tmpResult); } /******************************************************************************* @@ -215,7 +254,7 @@ static void Cy_Crypto_Core_V1_Hmac_Calculate(CRYPTO_Type *base, * Clears the used memory buffers. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmacState * The pointer to the HMAC context. @@ -236,7 +275,7 @@ static void Cy_Crypto_Core_V1_Hmac_Free(CRYPTO_Type *base, cy_stc_crypto_v1_hmac * Performs HMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmac * The pointer to the calculated HMAC. Must be 4-byte aligned. @@ -257,7 +296,7 @@ static void Cy_Crypto_Core_V1_Hmac_Free(CRYPTO_Type *base, cy_stc_crypto_v1_hmac * \ref cy_en_crypto_sha_mode_t * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Hmac(CRYPTO_Type *base, @@ -268,25 +307,30 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Hmac(CRYPTO_Type *base, uint32_t keyLength, cy_en_crypto_sha_mode_t mode) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + /* Allocating internal variables into the CRYPTO SRAM Buffer */ cy_stc_crypto_hmac_buffers_t *hmacBuffers = (cy_stc_crypto_hmac_buffers_t *)(REG_CRYPTO_MEM_BUFF(base)); cy_stc_crypto_v1_hmac_state_t *hmacStateTmp = &hmacBuffers->hmacState; - cy_stc_crypto_sha_state_t hashState; + cy_stc_crypto_sha_state_t hashStateLoc = { 0 }; uint8_t *ipadTmp = (uint8_t*)(&hmacBuffers->ipad); uint8_t *opadTmp = (uint8_t*)(&hmacBuffers->opad); uint8_t *m0KeyTmp = (uint8_t*)(&hmacBuffers->m0Key); - Cy_Crypto_Core_V1_Sha_Init (base, &hashState, mode, &hmacBuffers->shaBuffers); + tmpResult = Cy_Crypto_Core_V1_Sha_Init(base, &hashStateLoc, mode, &hmacBuffers->shaBuffers); - Cy_Crypto_Core_V1_Hmac_Init (hmacStateTmp, ipadTmp, opadTmp, m0KeyTmp); - Cy_Crypto_Core_V1_Hmac_Calculate (base, hmacStateTmp, &hashState, key, keyLength, message, messageSize, hmac); - Cy_Crypto_Core_V1_Hmac_Free (base, hmacStateTmp); + if (CY_CRYPTO_SUCCESS == tmpResult) + { + Cy_Crypto_Core_V1_Hmac_Init(hmacStateTmp, ipadTmp, opadTmp, m0KeyTmp); + tmpResult = Cy_Crypto_Core_V1_Hmac_Calculate (base, hmacStateTmp, &hashStateLoc, key, keyLength, message, messageSize, hmac); + Cy_Crypto_Core_V1_Hmac_Free(base, hmacStateTmp); + } - Cy_Crypto_Core_V1_Sha_Free (base, &hashState); + (void)Cy_Crypto_Core_V1_Sha_Free(base, &hashStateLoc); - return (CY_CRYPTO_SUCCESS); + return (tmpResult); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v2.c index 5800252bfe..d00d3a4100 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hmac_v2.c @@ -64,7 +64,7 @@ static void Cy_Crypto_Core_V2_Hmac_Init(cy_stc_crypto_v2_hmac_state_t *hmacState uint8_t *ipad, uint8_t *opad, uint8_t *m0Key); -static void Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, +static cy_en_crypto_status_t Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, cy_stc_crypto_v2_hmac_state_t *hmacState, cy_stc_crypto_sha_state_t *hashState, uint8_t const *key, @@ -116,7 +116,7 @@ static void Cy_Crypto_Core_V2_Hmac_Init(cy_stc_crypto_v2_hmac_state_t *hmacState * Starts HMAC (Hash-based Message Authentication Code) calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmacState * The pointer to the hmacState structure which stores internal variables @@ -142,7 +142,7 @@ static void Cy_Crypto_Core_V2_Hmac_Init(cy_stc_crypto_v2_hmac_state_t *hmacState * The pointer to the calculated HMAC. * *******************************************************************************/ -static void Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, +static cy_en_crypto_status_t Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, cy_stc_crypto_v2_hmac_state_t *hmacState, cy_stc_crypto_sha_state_t *hashState, uint8_t const *key, @@ -151,6 +151,8 @@ static void Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, uint32_t messageSize, uint8_t *hmac) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + uint32_t i = 0uL; uint32_t blockSizeTmp = hashState->blockSize; uint32_t digestSizeTmp = hashState->digestSize; @@ -164,9 +166,16 @@ static void Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, if (keyLength > blockSizeTmp) { /* The key is larger than the block size. Do a hash on the key. */ - Cy_Crypto_Core_V2_Sha_Start (base, hashState); - Cy_Crypto_Core_V2_Sha_Update (base, hashState, key, keyLength); - Cy_Crypto_Core_V2_Sha_Finish (base, hashState, m0KeyPtrTmp); + tmpResult = Cy_Crypto_Core_V2_Sha_Start (base, hashState); + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Update (base, hashState, key, keyLength); + } + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Finish (base, hashState, m0KeyPtrTmp); + } /* Append zeros */ Cy_Crypto_Core_V2_MemSet(base, (m0KeyPtrTmp + digestSizeTmp), 0x00u, (uint16_t)(blockSizeTmp - digestSizeTmp)); @@ -182,31 +191,59 @@ static void Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, Cy_Crypto_Core_V2_MemCpy(base, m0KeyPtrTmp, key, (uint16_t)keyLength); } - /* Steps 4 and 7 according to FIPS 198-1 */ - while (i < blockSizeTmp) + if (CY_CRYPTO_SUCCESS == tmpResult) { - ipadPtrTmp[i] = CY_CRYPTO_HMAC_IPAD ^ m0KeyPtrTmp[i]; - opadPtrTmp[i] = CY_CRYPTO_HMAC_0PAD ^ m0KeyPtrTmp[i]; - i++; + /* Steps 4 and 7 according to FIPS 198-1 */ + while (i < blockSizeTmp) + { + ipadPtrTmp[i] = CY_CRYPTO_HMAC_IPAD ^ m0KeyPtrTmp[i]; + opadPtrTmp[i] = CY_CRYPTO_HMAC_0PAD ^ m0KeyPtrTmp[i]; + i++; + } + + /* Step 6 according to FIPS 198-1 */ + tmpResult = Cy_Crypto_Core_V2_Sha_Start (base, hashState); + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Update(base, hashState, ipadPtrTmp, blockSizeTmp); + } + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /* Append a message */ + tmpResult = Cy_Crypto_Core_V2_Sha_Update(base, hashState, message, messageSize); + } + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Finish(base, hashState, ipadPtrTmp); + } + + /* Here is the ready part of HASH: Hash((Key^ipad)||text) */ + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + /* Steps 8, 9 according to FIPS 198-1 */ + tmpResult = Cy_Crypto_Core_V2_Sha_Start(base, hashState); + + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Update(base, hashState, opadPtrTmp, blockSizeTmp); + } + + /* Append HASH from Step 6 */ + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Update(base, hashState, ipadPtrTmp, digestSizeTmp); + } + if (CY_CRYPTO_SUCCESS == tmpResult) + { + tmpResult = Cy_Crypto_Core_V2_Sha_Finish(base, hashState, hmac); + } + } } - /* Step 6 according to FIPS 198-1 */ - Cy_Crypto_Core_V2_Sha_Start (base, hashState); - Cy_Crypto_Core_V2_Sha_Update(base, hashState, ipadPtrTmp, blockSizeTmp); - - /* Append a message */ - Cy_Crypto_Core_V2_Sha_Update(base, hashState, message, messageSize); - Cy_Crypto_Core_V2_Sha_Finish(base, hashState, ipadPtrTmp); - - /* Here is the ready part of HASH: Hash((Key^ipad)||text) */ - - /* Steps 8, 9 according to FIPS 198-1 */ - Cy_Crypto_Core_V2_Sha_Start(base, hashState); - Cy_Crypto_Core_V2_Sha_Update(base, hashState, opadPtrTmp, blockSizeTmp); - - /* Append HASH from Step 6 */ - Cy_Crypto_Core_V2_Sha_Update(base, hashState, ipadPtrTmp, digestSizeTmp); - Cy_Crypto_Core_V2_Sha_Finish(base, hashState, hmac); + return (tmpResult); } /******************************************************************************* @@ -216,7 +253,7 @@ static void Cy_Crypto_Core_V2_Hmac_Calculate(CRYPTO_Type *base, * Clears the used memory buffers. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmacState * The pointer to the HMAC context. @@ -235,7 +272,7 @@ static void Cy_Crypto_Core_V2_Hmac_Free(CRYPTO_Type *base, cy_stc_crypto_v2_hmac * Performs HMAC calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hmac * The pointer to the calculated HMAC. Must be 4-byte aligned. @@ -256,7 +293,7 @@ static void Cy_Crypto_Core_V2_Hmac_Free(CRYPTO_Type *base, cy_stc_crypto_v2_hmac * \ref cy_en_crypto_sha_mode_t * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Hmac(CRYPTO_Type *base, @@ -267,27 +304,32 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Hmac(CRYPTO_Type *base, uint32_t keyLength, cy_en_crypto_sha_mode_t mode) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + /* Allocating internal variables into the CRYPTO SRAM Buffer */ - cy_stc_crypto_v2_hmac_buffers_t hmacBuffersData; + cy_stc_crypto_v2_hmac_buffers_t hmacBuffersData = { 0 }; cy_stc_crypto_v2_hmac_buffers_t *hmacBuffers = &hmacBuffersData; cy_stc_crypto_v2_hmac_state_t *hmacStateTmp = &hmacBuffers->hmacState; - cy_stc_crypto_sha_state_t hashState; + cy_stc_crypto_sha_state_t hashStateLoc = { 0 }; uint8_t *ipadTmp = (uint8_t*)&hmacBuffers->ipad; uint8_t *opadTmp = (uint8_t*)&hmacBuffers->opad; uint8_t *m0KeyTmp = (uint8_t*)&hmacBuffers->m0Key; /* No any buffers needed for Crypto_ver2 IP block */ - Cy_Crypto_Core_V2_Sha_Init (base, &hashState, mode, NULL); + tmpResult = Cy_Crypto_Core_V2_Sha_Init(base, &hashStateLoc, mode, NULL); - Cy_Crypto_Core_V2_Hmac_Init (hmacStateTmp, ipadTmp, opadTmp, m0KeyTmp); - Cy_Crypto_Core_V2_Hmac_Calculate (base, hmacStateTmp, &hashState, key, keyLength, message, messageSize, hmac); - Cy_Crypto_Core_V2_Hmac_Free (base, hmacStateTmp); + if (CY_CRYPTO_SUCCESS == tmpResult) + { + Cy_Crypto_Core_V2_Hmac_Init(hmacStateTmp, ipadTmp, opadTmp, m0KeyTmp); + tmpResult = Cy_Crypto_Core_V2_Hmac_Calculate(base, hmacStateTmp, &hashStateLoc, key, keyLength, message, messageSize, hmac); + Cy_Crypto_Core_V2_Hmac_Free(base, hmacStateTmp); + } - Cy_Crypto_Core_V2_Sha_Free (base, &hashState); + (void)Cy_Crypto_Core_V2_Sha_Free(base, &hashStateLoc); - return (CY_CRYPTO_SUCCESS); + return (tmpResult); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw.c index 7e4309d88d..f8fb5f5fbb 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw.c @@ -104,6 +104,12 @@ const cy_stc_cryptoIP_t cy_cryptoIpBlockCfgPSoC6_02 = #define CY_CRYPTO_PWR_MODE_RETAINED (2UL) #define CY_CRYPTO_PWR_MODE_ENABLED (3UL) + +/** +* \addtogroup group_crypto_lld_hw_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_ClearVuRegisters ****************************************************************************//** @@ -111,7 +117,7 @@ const cy_stc_cryptoIP_t cy_cryptoIpBlockCfgPSoC6_02 = * The function to initialize the Crypto VU registers. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ void Cy_Crypto_Core_ClearVuRegisters(CRYPTO_Type *base) @@ -140,8 +146,6 @@ void Cy_Crypto_Core_ClearVuRegisters(CRYPTO_Type *base) * * The function to initialize the Crypto hardware. * -* This function is internal and should not to be called directly by user software -* *******************************************************************************/ void Cy_Crypto_Core_HwInit(void) { @@ -155,17 +159,17 @@ void Cy_Crypto_Core_HwInit(void) * The function to enable the Crypto hardware. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \return -* Crypto status \ref cy_en_crypto_status_t. +* Crypto status \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_Enable(CRYPTO_Type *base) { Cy_Crypto_Core_HwInit(); - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { /* Enable Crypto HW */ REG_CRYPTO_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CTL_PWR_MODE, CY_CRYPTO_PWR_MODE_ENABLED) | @@ -232,7 +236,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Enable(CRYPTO_Type *base) * The pointer to a variable to store gathered crypto library information. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_GetLibInfo(cy_en_crypto_lib_info_t *libInfo) @@ -249,15 +253,15 @@ cy_en_crypto_status_t Cy_Crypto_Core_GetLibInfo(cy_en_crypto_lib_info_t *libInfo * Disables the operation of the CRYPTO block. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_Disable(CRYPTO_Type *base) { - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { /* Disable Crypto HW */ REG_CRYPTO_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_CTL_PWR_MODE, CY_CRYPTO_PWR_MODE_OFF) | @@ -322,6 +326,7 @@ void Cy_Crypto_Core_InvertEndianness(void *inArrPtr, uint32_t byteSize) } } +/** \} group_crypto_lld_hw_functions */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw_v1.c index 94a661fcc7..b6b6946779 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_hw_v1.c @@ -39,7 +39,7 @@ * Writes one 32-Bit data word into Crypto FIFO. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data0 * The address of data to be placed into Crypto FIFO @@ -66,7 +66,7 @@ void Cy_Crypto_SetReg1Instr(CRYPTO_Type *base, uint32_t data0) * Writes two 32-Bit data words into Crypto FIFO. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data0 * The address of data to be placed into Crypto FIFO @@ -99,7 +99,7 @@ void Cy_Crypto_SetReg2Instr(CRYPTO_Type *base, uint32_t data0, uint32_t data1) * Writes three 32-Bit data words into Crypto FIFO. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data0 * The address of data to be placed into Crypto FIFO @@ -138,7 +138,7 @@ void Cy_Crypto_SetReg3Instr(CRYPTO_Type *base, uint32_t data0, uint32_t data1, u * Writes four 32-Bit data words into Crypto FIFO. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param data0 * The address of data to be placed into Crypto FIFO @@ -183,7 +183,7 @@ void Cy_Crypto_SetReg4Instr(CRYPTO_Type *base, uint32_t data0, uint32_t data1, u * Run the Crypto instruction without parameters. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param instr * The Opcode of the called instruction. @@ -207,7 +207,7 @@ void Cy_Crypto_Run0ParamInstr(CRYPTO_Type *base, uint8_t instr) * The parameter must be placed into register 0 * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param instr * The Opcode of the called instruction. @@ -236,7 +236,7 @@ void Cy_Crypto_Run1ParamInstr(CRYPTO_Type *base, uint8_t instr, uint32_t rdst0Sh * the first parameter must be placed into register 1. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param instr * The Opcode of the called instruction. @@ -273,7 +273,7 @@ void Cy_Crypto_Run2ParamInstr(CRYPTO_Type *base, * the second parameter must be placed into register 2. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param instr * The Opcode of the called instruction. @@ -316,7 +316,7 @@ void Cy_Crypto_Run3ParamInstr(CRYPTO_Type *base, * the third parameter must be placed into register 3. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param instr * The Opcode of the called instruction. diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v1.c index 07e1fb5b74..90c5e07ed4 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v1.c @@ -44,7 +44,7 @@ * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src * The pointer to the source of MemCpy. @@ -85,7 +85,7 @@ void Cy_Crypto_Core_V1_MemCpy(CRYPTO_Type *base, void* dst, void const *src, uin * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dst * The pointer to the destination of MemSet. @@ -125,7 +125,7 @@ void Cy_Crypto_Core_V1_MemSet(CRYPTO_Type *base, void* dst, uint8_t data, uint16 * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src0 * The pointer to the first source of MemCmp. @@ -171,7 +171,7 @@ uint32_t Cy_Crypto_Core_V1_MemCmp(CRYPTO_Type *base, void const *src0, void cons * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src0 * The pointer to the first source of MemXor. diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v2.c index 5e241ca106..487f912de8 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_mem_v2.c @@ -42,7 +42,7 @@ * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src * The pointer to the source of MemCpy. @@ -81,7 +81,7 @@ void Cy_Crypto_Core_V2_MemCpy(CRYPTO_Type *base, void* dst, void const *src, uin * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param dst * The pointer to the destination of MemSet. @@ -119,7 +119,7 @@ void Cy_Crypto_Core_V2_MemSet(CRYPTO_Type *base, void* dst, uint8_t data, uint16 * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src0 * The pointer to the first source of MemCmp. @@ -166,7 +166,7 @@ uint32_t Cy_Crypto_Core_V2_MemCmp(CRYPTO_Type *base, void const *src0, void cons * There is no alignment restriction. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param src0 * The pointer to the first source of MemXor. diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v1.c index 12771a9af7..53a1a90ea1 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v1.c @@ -43,7 +43,7 @@ * Invoking this function causes a restart of the pseudo-random sequence. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param lfsr32InitState * A non-zero seed value for the first LFSR. @@ -55,7 +55,7 @@ * A non-zero seed value for the third LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Prng_Init(CRYPTO_Type *base, @@ -79,7 +79,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Prng_Init(CRYPTO_Type *base, * Generates a Pseudo Random Number. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param max * The maximum value of a random number. @@ -88,7 +88,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Prng_Init(CRYPTO_Type *base, * The pointer to a variable to store the generated pseudo random number. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Prng(CRYPTO_Type *base, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v2.c index 4873ecb714..867fcb0f46 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_prng_v2.c @@ -43,7 +43,7 @@ * Invoking this function causes a restart of the pseudo-random sequence. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param lfsr32InitState * A non-zero seed value for the first LFSR. @@ -55,7 +55,7 @@ * A non-zero seed value for the third LFSR. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Prng_Init(CRYPTO_Type *base, @@ -79,7 +79,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Prng_Init(CRYPTO_Type *base, * Generates a Pseudo Random Number. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param max * The maximum value of a random number. @@ -88,7 +88,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Prng_Init(CRYPTO_Type *base, * The pointer to a variable to store the generated pseudo random number. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Prng(CRYPTO_Type *base, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_rsa.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_rsa.c index 6bcf766be6..73578a6e85 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_rsa.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_rsa.c @@ -57,61 +57,10 @@ static void Cy_Crypto_Core_Rsa_expModByMont(CRYPTO_Type *base, #endif /* #if (CPUSS_CRYPTO_VU == 1) */ -/* Encodings for hash functions */ - -#if (CPUSS_CRYPTO_SHA1 == 1) -static const uint8_t sha1EncStr[CY_CRYPTO_SHA1_PADDING_SIZE] = -{ - 0x30u, 0x21u, 0x30u, 0x09u, 0x06u, 0x05u, 0x2Bu, 0x0Eu, - 0x03u, 0x02u, 0x1Au, 0x05u, 0x00u, 0x04u, 0x14u -}; -#endif /* #if (CPUSS_CRYPTO_SHA1 == 1) */ - -#if (CPUSS_CRYPTO_SHA256 == 1) -static const uint8_t sha224EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = -{ - 0x30u, 0x2Du, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, - 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x04u, 0x05u, - 0x00u, 0x04u, 0x1Cu -}; - -static const uint8_t sha256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = -{ - 0x30u, 0x31u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, - 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x01u, 0x05u, - 0x00u, 0x04u, 0x20u -}; -#endif /* #if (CPUSS_CRYPTO_SHA256 == 1) */ - -#if (CPUSS_CRYPTO_SHA512 == 1) -static const uint8_t sha384EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = -{ - 0x30u, 0x41u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, - 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x02u, 0x05u, - 0x00u, 0x04u, 0x30u -}; - -static const uint8_t sha512EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = -{ - 0x30u, 0x51u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, - 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x03u, 0x05u, - 0x00u, 0x04u, 0x40u -}; - -static const uint8_t sha512_224EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = -{ - 0x30u, 0x2Du, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, - 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x05u, 0x05u, - 0x00u, 0x04u, 0x1Cu -}; - -static const uint8_t sha512_256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = -{ - 0x30u, 0x31u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, - 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x06u, 0x05u, - 0x00u, 0x04u, 0x20u -}; -#endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ +/** +* \addtogroup group_crypto_lld_asymmetric_functions +* \{ +*/ /******************************************************************************* * Function Name: Cy_Crypto_Core_Rsa_Verify @@ -127,7 +76,7 @@ static const uint8_t sha512_256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = * Returns the verification result \ref cy_en_crypto_rsa_ver_result_t. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param verResult * The pointer to the verification result \ref cy_en_crypto_rsa_ver_result_t. @@ -145,7 +94,7 @@ static const uint8_t sha512_256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = * The length of the decrypted signature to be verified (in bytes) * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, @@ -155,11 +104,67 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, uint8_t const *decryptedSignature, uint32_t decryptedSignatureLength) { - cy_en_crypto_status_t myResult = CY_CRYPTO_SUCCESS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + + /* Encodings for hash functions */ + + #if (CPUSS_CRYPTO_SHA1 == 1) + static const uint8_t sha1EncStr[CY_CRYPTO_SHA1_PADDING_SIZE] = + { + 0x30u, 0x21u, 0x30u, 0x09u, 0x06u, 0x05u, 0x2Bu, 0x0Eu, + 0x03u, 0x02u, 0x1Au, 0x05u, 0x00u, 0x04u, 0x14u + }; + #endif /* #if (CPUSS_CRYPTO_SHA1 == 1) */ + + #if (CPUSS_CRYPTO_SHA256 == 1) + static const uint8_t sha224EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = + { + 0x30u, 0x2Du, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, + 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x04u, 0x05u, + 0x00u, 0x04u, 0x1Cu + }; + + static const uint8_t sha256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = + { + 0x30u, 0x31u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, + 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x01u, 0x05u, + 0x00u, 0x04u, 0x20u + }; + #endif /* #if (CPUSS_CRYPTO_SHA256 == 1) */ + + #if (CPUSS_CRYPTO_SHA512 == 1) + static const uint8_t sha384EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = + { + 0x30u, 0x41u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, + 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x02u, 0x05u, + 0x00u, 0x04u, 0x30u + }; + + static const uint8_t sha512EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = + { + 0x30u, 0x51u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, + 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x03u, 0x05u, + 0x00u, 0x04u, 0x40u + }; + + static const uint8_t sha512_224EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = + { + 0x30u, 0x2Du, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, + 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x05u, 0x05u, + 0x00u, 0x04u, 0x1Cu + }; + + static const uint8_t sha512_256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = + { + 0x30u, 0x31u, 0x30u, 0x0Du, 0x06u, 0x09u, 0x60u, 0x86u, + 0x48u, 0x01u, 0x65u, 0x03u, 0x04u, 0x02u, 0x06u, 0x05u, + 0x00u, 0x04u, 0x20u + }; + #endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ uint8_t const *encodingArr = NULL; uint32_t encodingArrSize = 0u; - uint32_t digestSize = 0u; + uint32_t locDigestSize = 0u; uint32_t i; uint32_t psLength; uint32_t cmpRes = 0u; @@ -172,7 +177,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, case CY_CRYPTO_MODE_SHA1: encodingArr = sha1EncStr; encodingArrSize = sizeof(sha1EncStr); - digestSize = CY_CRYPTO_SHA1_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA1_DIGEST_SIZE; break; #endif /* #if (CPUSS_CRYPTO_SHA1 == 1) */ @@ -180,13 +185,13 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, case CY_CRYPTO_MODE_SHA224: encodingArr = sha224EncStr; encodingArrSize = sizeof(sha224EncStr); - digestSize = CY_CRYPTO_SHA224_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA224_DIGEST_SIZE; break; case CY_CRYPTO_MODE_SHA256: encodingArr = sha256EncStr; encodingArrSize = sizeof(sha256EncStr); - digestSize = CY_CRYPTO_SHA256_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA256_DIGEST_SIZE; break; #endif /* #if (CPUSS_CRYPTO_SHA256 == 1) */ @@ -194,25 +199,25 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, case CY_CRYPTO_MODE_SHA384: encodingArr = sha384EncStr; encodingArrSize = sizeof(sha384EncStr); - digestSize = CY_CRYPTO_SHA384_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA384_DIGEST_SIZE; break; case CY_CRYPTO_MODE_SHA512: encodingArr = sha512EncStr; encodingArrSize = sizeof(sha512EncStr); - digestSize = CY_CRYPTO_SHA512_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA512_DIGEST_SIZE; break; case CY_CRYPTO_MODE_SHA512_224: encodingArr = sha512_224EncStr; encodingArrSize = sizeof(sha512_224EncStr); - digestSize = CY_CRYPTO_SHA512_224_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA512_224_DIGEST_SIZE; break; case CY_CRYPTO_MODE_SHA512_256: encodingArr = sha512_256EncStr; encodingArrSize = sizeof(sha512_256EncStr); - digestSize = CY_CRYPTO_SHA512_256_DIGEST_SIZE; + locDigestSize = CY_CRYPTO_SHA512_256_DIGEST_SIZE; break; #endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ @@ -224,12 +229,12 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, *verResult = CY_CRYPTO_RSA_VERIFY_FAIL; /* Check size of decrypted message */ - if (decryptedSignatureLength < (encodingArrSize + digestSize + 11u)) + if (decryptedSignatureLength < (encodingArrSize + locDigestSize + 11u)) { cmpRes = 1u; /* further checking is not needed */ } - psLength = decryptedSignatureLength - digestSize - encodingArrSize - 3u; + psLength = decryptedSignatureLength - locDigestSize - encodingArrSize - 3u; /* Check whether the begin of message is 0x00, 0x01 and after PS string (before T string) is 0x00 byte.*/ if ( (0u != cmpRes) || @@ -265,8 +270,8 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, if (0u == cmpRes) { cmpRes = Cy_Crypto_Core_MemCmp(base, digest, - (decryptedSignature + (decryptedSignatureLength - digestSize)), - (uint16_t)digestSize); + (decryptedSignature + (decryptedSignatureLength - locDigestSize)), + (uint16_t)locDigestSize); } if (0u == cmpRes ) @@ -274,9 +279,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, *verResult = CY_CRYPTO_RSA_VERIFY_SUCCESS; } - return (myResult); + return (tmpResult); } +/** \} group_crypto_lld_asymmetric_functions */ #if (CPUSS_CRYPTO_VU == 1) @@ -297,7 +303,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, * where R = 1 << size. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param modDerReg * Register index for Montgomery coefficient value. @@ -306,17 +312,17 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Verify(CRYPTO_Type *base, * Register index for modulo value. * * \param size -* Size of modulo, in Bits. +* Modulo size in bits. * *******************************************************************************/ static void Cy_Crypto_Core_Rsa_MontCoeff(CRYPTO_Type *base, uint32_t modDerReg, uint32_t modReg, uint32_t size) { uint32_t myMod = 9u; uint32_t tmp = 10u; - uint32_t a = 11u; - uint32_t b = 12u; - uint32_t u = 13u; - uint32_t v = 14u; + uint32_t ra = 11u; + uint32_t rb = 12u; + uint32_t ru = 13u; + uint32_t rv = 14u; uint32_t status; uint32_t aZero; @@ -324,27 +330,27 @@ static void Cy_Crypto_Core_Rsa_MontCoeff(CRYPTO_Type *base, uint32_t modDerReg, CY_CRYPTO_VU_PUSH_REG (base); - CY_CRYPTO_VU_LD_REG (base, v, modDerReg); + CY_CRYPTO_VU_LD_REG (base, rv, modDerReg); CY_CRYPTO_VU_LD_REG (base, myMod, modReg); - CY_CRYPTO_VU_ALLOC_MEM (base, a, size); - CY_CRYPTO_VU_ALLOC_MEM (base, b, size); - CY_CRYPTO_VU_ALLOC_MEM (base, u, size); + CY_CRYPTO_VU_ALLOC_MEM (base, ra, size); + CY_CRYPTO_VU_ALLOC_MEM (base, rb, size); + CY_CRYPTO_VU_ALLOC_MEM (base, ru, size); - CY_CRYPTO_VU_SET_TO_ONE (base, u); - CY_CRYPTO_VU_SET_TO_ZERO (base, v); + CY_CRYPTO_VU_SET_TO_ONE (base, ru); + CY_CRYPTO_VU_SET_TO_ZERO (base, rv); - CY_CRYPTO_VU_SET_TO_ZERO (base, a); + CY_CRYPTO_VU_SET_TO_ZERO (base, ra); CY_CRYPTO_VU_SET_REG (base, tmp, (size - 1u), 1u); - CY_CRYPTO_VU_SET_BIT (base, a, tmp); - CY_CRYPTO_VU_MOV (base, b, myMod); + CY_CRYPTO_VU_SET_BIT (base, ra, tmp); + CY_CRYPTO_VU_MOV (base, rb, myMod); while (1) { Cy_Crypto_Core_WaitForReady(base); - CY_CRYPTO_VU_TST(base, a); + CY_CRYPTO_VU_TST(base, ra); status = Cy_Crypto_Core_Vu_StatusRead(base); aZero = status & CY_CRYPTO_VU_STATUS_ZERO_BIT; @@ -354,27 +360,27 @@ static void Cy_Crypto_Core_Rsa_MontCoeff(CRYPTO_Type *base, uint32_t modDerReg, break; } - CY_CRYPTO_VU_LSR1(base, a, a); + CY_CRYPTO_VU_LSR1(base, ra, ra); - CY_CRYPTO_VU_TST(base, u); + CY_CRYPTO_VU_TST(base, ru); status = Cy_Crypto_Core_Vu_StatusRead(base); uEven = status & CY_CRYPTO_VU_STATUS_EVEN_BIT; if (uEven != 0u) { - CY_CRYPTO_VU_LSR1(base, u, u); - CY_CRYPTO_VU_LSR1(base, v, v); + CY_CRYPTO_VU_LSR1(base, ru, ru); + CY_CRYPTO_VU_LSR1(base, rv, rv); } else { - CY_CRYPTO_VU_ADD(base, u, u, b); - CY_CRYPTO_VU_LSR1_WITH_CARRY(base, u, u); - CY_CRYPTO_VU_LSR1(base, v, v); - CY_CRYPTO_VU_SET_BIT(base, v, tmp); + CY_CRYPTO_VU_ADD(base, ru, ru, rb); + CY_CRYPTO_VU_LSR1_WITH_CARRY(base, ru, ru); + CY_CRYPTO_VU_LSR1(base, rv, rv); + CY_CRYPTO_VU_SET_BIT(base, rv, tmp); } } - CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(a) | CY_CRYPTO_VU_REG_BIT(b) | CY_CRYPTO_VU_REG_BIT(u)); + CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(ra) | CY_CRYPTO_VU_REG_BIT(rb) | CY_CRYPTO_VU_REG_BIT(ru)); CY_CRYPTO_VU_POP_REG(base); } @@ -392,7 +398,7 @@ static void Cy_Crypto_Core_Rsa_MontCoeff(CRYPTO_Type *base, uint32_t modDerReg, * barrett = (1 << (2 * size)) / mod NO!!! leading '1' Barrett bit. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param barrettUReg * Register index for Barrett reduction value. @@ -400,8 +406,8 @@ static void Cy_Crypto_Core_Rsa_MontCoeff(CRYPTO_Type *base, uint32_t modDerReg, * \param modReg * Register index for modulo value. * -* \param -* Size modulo size in Bits. +* \param size +* The modulo size in bits. * *******************************************************************************/ static void Cy_Crypto_Core_Rsa_BarrettGetU(CRYPTO_Type *base, uint32_t barrettUReg, uint32_t modReg, uint32_t size) @@ -447,7 +453,7 @@ static void Cy_Crypto_Core_Rsa_BarrettGetU(CRYPTO_Type *base, uint32_t barrettUR * z = (a << size) % mod * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param z * Register index for Montgomery representation value. @@ -521,7 +527,7 @@ static void Cy_Crypto_Core_Rsa_MontTransform(CRYPTO_Type *base, uint32_t z, uint * u = IF (u >= mod) u = u - mod * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param z * Register index for product value. @@ -561,7 +567,7 @@ static void Cy_Crypto_Core_Rsa_MontMul(CRYPTO_Type *base, CY_CRYPTO_VU_UMUL (base, tDouble, a, b); - /* Only lower 32 bits are needed */ + /* Only the lower 32 bits are needed. */ CY_CRYPTO_VU_UMUL (base, t, tDouble, montModDer); /* Clear the MSB bit (cut to size length) */ @@ -605,7 +611,7 @@ static void Cy_Crypto_Core_Rsa_MontMul(CRYPTO_Type *base, * calculation. Suitable for cases with short e. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param y * Register index for calculated value. @@ -619,8 +625,17 @@ static void Cy_Crypto_Core_Rsa_MontMul(CRYPTO_Type *base, * \param n * Register index for modulo value. * +* \param barretCoef +* Barrett coefficient. +* +* \param inverseModulo +* Binary inverse of the modulo. +* +* \param rBar +* Values of (2^moduloLength mod modulo). +* * \param size -* modulo size, in Bits +* The modulo size in bits. * *******************************************************************************/ static void Cy_Crypto_Core_Rsa_expModByMont(CRYPTO_Type *base, @@ -720,6 +735,11 @@ static void Cy_Crypto_Core_Rsa_expModByMont(CRYPTO_Type *base, CY_CRYPTO_VU_POP_REG(base); } +/** +* \addtogroup group_crypto_lld_asymmetric_functions +* \{ +*/ + /******************************************************************************* * Function Name: Cy_Crypto_Core_Rsa_Proc ****************************************************************************//** @@ -730,7 +750,7 @@ static void Cy_Crypto_Core_Rsa_expModByMont(CRYPTO_Type *base, * https://en.wikipedia.org/wiki/RSA_%28cryptosystem%29 * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param key * The pointer to the \ref cy_stc_crypto_rsa_pub_key_t structure that stores @@ -746,7 +766,7 @@ static void Cy_Crypto_Core_Rsa_expModByMont(CRYPTO_Type *base, * The pointer to processed message. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(CRYPTO_Type *base, @@ -755,7 +775,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(CRYPTO_Type *base, uint32_t messageSize, uint8_t *processedMessage) { - cy_en_crypto_status_t myResult = CY_CRYPTO_SUCCESS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; uint8_t *expPtr = key->pubExpPtr; uint32_t expBitLength = key->pubExpLength; @@ -834,7 +854,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(CRYPTO_Type *base, Cy_Crypto_Core_Vu_WaitForComplete(base); - /* Copy the myResult to output buffer */ + /* Copy the tmpResult to output buffer */ Cy_Crypto_Core_Vu_GetMemValue(base, (uint8_t*)processedMessage, yReg, nBitLength); CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(yReg) | CY_CRYPTO_VU_REG_BIT(xReg) | @@ -842,7 +862,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(CRYPTO_Type *base, CY_CRYPTO_VU_REG_BIT(inverseModuloReg) | CY_CRYPTO_VU_REG_BIT(barrettReg) | CY_CRYPTO_VU_REG_BIT(rBarReg)); - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -856,20 +876,20 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(CRYPTO_Type *base, * result of (2^moduloLength mod modulo) * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param key * The pointer to the \ref cy_stc_crypto_rsa_pub_key_t structure that stores a * public key. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Coef(CRYPTO_Type *base, cy_stc_crypto_rsa_pub_key_t const *key) { - cy_en_crypto_status_t myResult = CY_CRYPTO_SUCCESS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; uint8_t *nPtr = key->moduloPtr; uint32_t nBitLength = key->moduloLength; @@ -916,9 +936,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Coef(CRYPTO_Type *base, CY_CRYPTO_VU_FREE_MEM(base, CY_CRYPTO_VU_REG_BIT(modReg) | CY_CRYPTO_VU_REG_BIT(inverseModuloReg) | CY_CRYPTO_VU_REG_BIT(barrettReg) | CY_CRYPTO_VU_REG_BIT(rBarReg)); - return (myResult); + return (tmpResult); } +/** \} group_crypto_lld_asymmetric_functions */ + #endif /* #if (CPUSS_CRYPTO_VU == 1) */ #endif /* CY_IP_MXCRYPTO */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v1.c index 4cff247c87..6a185c0785 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v1.c @@ -39,15 +39,15 @@ typedef enum { #if (CPUSS_CRYPTO_SHA1 == 1) - CY_CRYPTO_V1_SHA_CTL_MODE_SHA1 = 0u, + CY_CRYPTO_V1_SHA_CTL_MODE_SHA1 = 0U, #endif /* #if (CPUSS_CRYPTO_SHA1 == 1) */ #if (CPUSS_CRYPTO_SHA256 == 1) - CY_CRYPTO_V1_SHA_CTL_MODE_SHA256 = 1u, + CY_CRYPTO_V1_SHA_CTL_MODE_SHA256 = 1U, #endif /* #if (CPUSS_CRYPTO_SHA256 == 1) */ #if (CPUSS_CRYPTO_SHA512 == 1) - CY_CRYPTO_V1_SHA_CTL_MODE_SHA512 = 2u, + CY_CRYPTO_V1_SHA_CTL_MODE_SHA512 = 2U, #endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ } cy_en_crypto_v1_sha_hw_mode_t; @@ -60,7 +60,7 @@ typedef enum * All addresses must be 4-Byte aligned! * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to a Hash State. @@ -99,7 +99,7 @@ void Cy_Crypto_Core_V1_Sha_ProcessBlock(CRYPTO_Type *base, * The function to initialize SHA operation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to a Hash State. @@ -109,10 +109,10 @@ void Cy_Crypto_Core_V1_Sha_ProcessBlock(CRYPTO_Type *base, * CY_CRYPTO_SHA512, CY_CRYPTO_SHA384, CY_CRYPTO_SHA512_224, CY_CRYPTO_SHA512_256 * * \param shaBuffers -* The pointer to memory buffers storage +* The pointer to the memory buffers storage. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, @@ -120,6 +120,8 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, cy_en_crypto_sha_mode_t mode, void *shaBuffers) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + /* Initialization vectors for different modes of the SHA algorithm */ #if (CPUSS_CRYPTO_SHA1 == 1) static const uint32_t sha1InitHash[] = @@ -190,7 +192,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, #if (CPUSS_CRYPTO_SHA1 == 1) case CY_CRYPTO_MODE_SHA1: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha1_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha1_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha1_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha1_buffers_t*)shaBuffers)->hash; @@ -208,7 +210,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, #if (CPUSS_CRYPTO_SHA256 == 1) case CY_CRYPTO_MODE_SHA224: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha256_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha256_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha256_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha256_buffers_t*)shaBuffers)->hash; @@ -223,7 +225,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, break; case CY_CRYPTO_MODE_SHA256: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha256_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha256_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha256_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha256_buffers_t*)shaBuffers)->hash; @@ -241,7 +243,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, #if (CPUSS_CRYPTO_SHA512 == 1) case CY_CRYPTO_MODE_SHA384: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->hash; @@ -255,7 +257,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, break; case CY_CRYPTO_MODE_SHA512: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->hash; @@ -269,7 +271,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, break; case CY_CRYPTO_MODE_SHA512_224: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->hash; @@ -283,7 +285,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, break; case CY_CRYPTO_MODE_SHA512_256: - Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00u, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); + Cy_Crypto_Core_V1_MemSet(base, shaBuffers, 0x00U, sizeof(cy_stc_crypto_v1_sha512_buffers_t)); hashState->block = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->block; hashState->hash = (uint8_t*)((cy_stc_crypto_v1_sha512_buffers_t*)shaBuffers)->hash; @@ -298,13 +300,14 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, #endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ default: + tmpResult = CY_CRYPTO_BAD_PARAMS; break; } /* Set the SHA mode */ REG_CRYPTO_SHA_CTL(base) = (uint32_t)(_VAL2FLD(CRYPTO_SHA_CTL_MODE, (uint32_t)shaHwMode)); - return (CY_CRYPTO_SUCCESS); + return (tmpResult); } /******************************************************************************* @@ -314,33 +317,33 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Init(CRYPTO_Type *base, * Initializes the initial hash vector. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Start(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState) { - hashState->blockIdx = 0u; - hashState->messageSize = 0u; - - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if (hashState != NULL) { - if (hashState->hashSize != 0) + hashState->blockIdx = 0U; + hashState->messageSize = 0U; + + if (hashState->hashSize != 0U) { Cy_Crypto_Core_V1_MemCpy(base, hashState->hash, hashState->initialHash, (uint16_t)hashState->hashSize); - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -350,7 +353,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Start(CRYPTO_Type *base, cy_stc_cryp * Performs the SHA calculation on one message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. @@ -362,12 +365,12 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Start(CRYPTO_Type *base, cy_stc_cryp * The size of the message whose Hash is being computed. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \note * This function can be called several times only with message lengths dividable -* by block size. Only the last call to the function can process a message with -* the not dividable size. +* by the block size. Only the last call to the function can process a message with +* a not-dividable size. * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Update(CRYPTO_Type *base, @@ -375,13 +378,13 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Update(CRYPTO_Type *base, uint8_t const *message, uint32_t messageSize) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if ((hashState != NULL) && (message != NULL)) { - if (hashState->blockSize != 0) + if (hashState->blockSize != 0U) { - if (messageSize > 0) + if (messageSize != 0U) { uint32_t blockSizeTmp = hashState->blockSize; hashState->messageSize += messageSize; @@ -394,28 +397,28 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Update(CRYPTO_Type *base, messageSize -= blockSizeTmp; } - /* Remaining block will be calculated in Finish function */ + /* The remaining block will be calculated in the Finish function. */ hashState->blockIdx = messageSize; /* Copy the end of the message to the block */ Cy_Crypto_Core_V1_MemCpy(base, hashState->block, message, (uint16_t)(messageSize & (blockSizeTmp - 1u))); } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } } - return (myResult); + return (tmpResult); } /******************************************************************************* * Function Name: Cy_Crypto_Core_V1_Sha_Finish ****************************************************************************//** * -* Completes SHA calculation. +* Completes the SHA calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. @@ -424,14 +427,14 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Update(CRYPTO_Type *base, * The pointer to the calculated hash digest. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Finish(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState, uint8_t *digest) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if ((hashState != NULL) && (digest != NULL)) { @@ -439,7 +442,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Finish(CRYPTO_Type *base, uint8_t *blockTmp = hashState->block; uint32_t blockSizeTmp = hashState->blockSize; uint32_t blockIdxTmp = hashState->blockIdx; - uint64_t finalMessageSizeInBits = (uint64_t)hashState->messageSize * 8u; + uint64_t finalMessageSizeInBits = (uint64_t)hashState->messageSize * 8U; uint32_t size; if (CY_CRYPTO_SHA512_BLOCK_SIZE == blockSizeTmp) @@ -452,10 +455,10 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Finish(CRYPTO_Type *base, } /* Append 1 bit to the end of the message */ - blockTmp[blockIdxTmp] = 0x80u; + blockTmp[blockIdxTmp] = 0x80U; /* Clear the rest of the block */ - Cy_Crypto_Core_V1_MemSet(base, (void* )&blockTmp[blockIdxTmp + 1u], 0x00u, (uint16_t)(blockSizeTmp - blockIdxTmp - 1u)); + Cy_Crypto_Core_V1_MemSet(base, (void* )&blockTmp[blockIdxTmp + 1U], 0x00U, (uint16_t)(blockSizeTmp - blockIdxTmp - 1U)); if (blockIdxTmp >= size) { @@ -466,32 +469,32 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Finish(CRYPTO_Type *base, Cy_Crypto_Core_V1_MemSet(base, blockTmp, 0x00u, (uint16_t)blockSizeTmp); } - blockTmp[blockSizeTmp - 4u] = (uint8_t)((finalMessageSizeInBits) >> 24u); - blockTmp[blockSizeTmp - 3u] = (uint8_t)((finalMessageSizeInBits) >> 16u); - blockTmp[blockSizeTmp - 2u] = (uint8_t)((finalMessageSizeInBits) >> 8u); - blockTmp[blockSizeTmp - 1u] = (uint8_t)(finalMessageSizeInBits); + blockTmp[blockSizeTmp - 4U] = (uint8_t)((finalMessageSizeInBits) >> 24U); + blockTmp[blockSizeTmp - 3U] = (uint8_t)((finalMessageSizeInBits) >> 16U); + blockTmp[blockSizeTmp - 2U] = (uint8_t)((finalMessageSizeInBits) >> 8U); + blockTmp[blockSizeTmp - 1U] = (uint8_t)(finalMessageSizeInBits); /* Process the last block */ Cy_Crypto_Core_V1_Sha_ProcessBlock(base, hashState, (uint8_t*)blockTmp); /* Invert endians of the hash and copy it to digest, re-use the size variable */ - size = (uint32_t)(hashState->digestSize / 4u); + size = (uint32_t)(hashState->digestSize / 4U); - for(; size != 0u; size--) + for(; size != 0U; size--) { *(digest) = *(hashTmp+3); *(digest+1) = *(hashTmp+2); *(digest+2) = *(hashTmp+1); *(digest+3) = *(hashTmp); - digest += 4; - hashTmp += 4; + digest += 4U; + hashTmp += 4U; } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -501,30 +504,30 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Finish(CRYPTO_Type *base, * Clears the used memory buffers. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Free(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if (hashState != NULL) { /* Clears the memory buffer. */ - Cy_Crypto_Core_V1_MemSet(base, hashState->block, 0x00u, (uint16_t)hashState->blockSize); - Cy_Crypto_Core_V1_MemSet(base, hashState->hash, 0x00u, (uint16_t)hashState->hashSize); - Cy_Crypto_Core_V1_MemSet(base, hashState->roundMem, 0x00u, (uint16_t)hashState->roundMemSize); + Cy_Crypto_Core_V1_MemSet(base, hashState->block, 0x00U, (uint16_t)hashState->blockSize); + Cy_Crypto_Core_V1_MemSet(base, hashState->hash, 0x00U, (uint16_t)hashState->hashSize); + Cy_Crypto_Core_V1_MemSet(base, hashState->roundMem, 0x00U, (uint16_t)hashState->roundMemSize); - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } - return (myResult); + return (tmpResult); } @@ -535,7 +538,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Free(CRYPTO_Type *base, cy_stc_crypt * Performs the SHA Hash function. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param mode * \ref cy_en_crypto_sha_mode_t @@ -550,7 +553,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha_Free(CRYPTO_Type *base, cy_stc_crypt * The pointer to the hash digest. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha(CRYPTO_Type *base, @@ -559,31 +562,31 @@ cy_en_crypto_status_t Cy_Crypto_Core_V1_Sha(CRYPTO_Type *base, uint8_t *digest, cy_en_crypto_sha_mode_t mode) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; void *shaBuffers = (void *)REG_CRYPTO_MEM_BUFF(base); - cy_stc_crypto_sha_state_t myHashState; + cy_stc_crypto_sha_state_t myHashState = { 0 }; - myResult = Cy_Crypto_Core_V1_Sha_Init (base, &myHashState, mode, shaBuffers); + tmpResult = Cy_Crypto_Core_V1_Sha_Init (base, &myHashState, mode, shaBuffers); - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V1_Sha_Start (base, &myHashState); + tmpResult = Cy_Crypto_Core_V1_Sha_Start (base, &myHashState); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V1_Sha_Update (base, &myHashState, message, messageSize); + tmpResult = Cy_Crypto_Core_V1_Sha_Update (base, &myHashState, message, messageSize); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V1_Sha_Finish (base, &myHashState, digest); + tmpResult = Cy_Crypto_Core_V1_Sha_Finish (base, &myHashState, digest); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V1_Sha_Free (base, &myHashState); + tmpResult = Cy_Crypto_Core_V1_Sha_Free (base, &myHashState); } - return (myResult); + return (tmpResult); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v2.c index 4c32c915be..aced0299ef 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_sha_v2.c @@ -42,7 +42,7 @@ * The function to initialize SHA operation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to a Hash State. @@ -52,10 +52,10 @@ * CY_CRYPTO_SHA512, CY_CRYPTO_SHA384, CY_CRYPTO_SHA512_224, CY_CRYPTO_SHA512_256 * * \param shaBuffers -* The pointer to memory buffers storage +* The pointer to the memory buffers storage. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Init(CRYPTO_Type *base, @@ -63,6 +63,8 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Init(CRYPTO_Type *base, cy_en_crypto_sha_mode_t mode, void *shaBuffers) { + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; + /* Initialization vectors for different modes of the SHA algorithm */ #if (CPUSS_CRYPTO_SHA1 == 1) static const uint8_t sha1InitHash[] = @@ -149,7 +151,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Init(CRYPTO_Type *base, CY_ASSERT_L1(hashState != NULL); - Cy_Crypto_Core_V2_MemSet(base, hashState, 0x00u, sizeof(cy_stc_crypto_sha_state_t)); + Cy_Crypto_Core_V2_MemSet(base, hashState, 0x00U, sizeof(cy_stc_crypto_sha_state_t)); switch (mode) { @@ -209,10 +211,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Init(CRYPTO_Type *base, break; #endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ default: + tmpResult = CY_CRYPTO_BAD_PARAMS; break; } - return (CY_CRYPTO_SUCCESS); + return (tmpResult); } /******************************************************************************* @@ -222,39 +225,39 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Init(CRYPTO_Type *base, * Initializes the initial hash vector. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Start(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState) { - hashState->blockIdx = 0u; - hashState->messageSize = 0u; - - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if (hashState != NULL) { - if (hashState->hashSize != 0) + hashState->blockIdx = 0U; + hashState->messageSize = 0U; + + if (hashState->hashSize != 0U) { Cy_Crypto_Core_V2_RBClear(base); Cy_Crypto_Core_V2_Sync(base); Cy_Crypto_Core_V2_FFStart(base, CY_CRYPTO_V2_RB_FF_LOAD0, hashState->initialHash, hashState->hashSize); - Cy_Crypto_Core_V2_RBXor(base, 0u, hashState->hashSize); + Cy_Crypto_Core_V2_RBXor(base, 0U, hashState->hashSize); Cy_Crypto_Core_V2_Sync(base); Cy_Crypto_Core_V2_RBSwap(base); - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -264,7 +267,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Start(CRYPTO_Type *base, cy_stc_cryp * Performs the SHA calculation on one message. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. @@ -276,12 +279,12 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Start(CRYPTO_Type *base, cy_stc_cryp * The size of the message whose Hash is being computed. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * \note * This function can be called several times only with message lengths dividable -* by block size. Only the last call to the function can process a message with -* the not dividable size. +* by the block size. Only the last call to the function can process a message with +* a not-dividable size. * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Update(CRYPTO_Type *base, @@ -289,13 +292,13 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Update(CRYPTO_Type *base, uint8_t const *message, uint32_t messageSize) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if ((hashState != NULL) && (message != NULL)) { - if (hashState->blockSize != 0) + if (hashState->blockSize != 0U) { - if (messageSize > 0) + if (messageSize != 0U) { hashState->messageSize += messageSize; @@ -303,7 +306,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Update(CRYPTO_Type *base, while (messageSize >= hashState->blockSize) { - Cy_Crypto_Core_V2_RBXor(base, 0u, hashState->blockSize); + Cy_Crypto_Core_V2_RBXor(base, 0U, hashState->blockSize); messageSize -= hashState->blockSize; @@ -314,11 +317,11 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Update(CRYPTO_Type *base, hashState->blockIdx = messageSize; } - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -328,7 +331,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Update(CRYPTO_Type *base, * Completes SHA calculation. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. @@ -337,21 +340,21 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Update(CRYPTO_Type *base, * The pointer to the calculated hash digest. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Finish(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState, uint8_t *digest) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if ((hashState != NULL) && (digest != NULL)) { uint32_t myBlockSize = hashState->blockSize; uint32_t myBlockIdx = hashState->blockIdx; - uint64_t finalMessageSizeInBits = (uint64_t)hashState->messageSize * 8u; + uint64_t finalMessageSizeInBits = (uint64_t)hashState->messageSize * 8U; uint32_t size; if (CY_CRYPTO_SHA512_BLOCK_SIZE == myBlockSize) @@ -364,13 +367,13 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Finish(CRYPTO_Type *base, } /* Load the end of the message (tail that less then block size) to the register buffer */ - Cy_Crypto_Core_V2_RBXor(base, 0u, myBlockIdx); + Cy_Crypto_Core_V2_RBXor(base, 0U, myBlockIdx); /* Sync until XOR operation is completed */ Cy_Crypto_Core_V2_Sync(base); /* Append 1 bit to the end of the message */ - Cy_Crypto_Core_V2_RBSetByte(base, myBlockIdx, 0x80u); + Cy_Crypto_Core_V2_RBSetByte(base, myBlockIdx, 0x80U); if (myBlockIdx >= size) { @@ -381,12 +384,12 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Finish(CRYPTO_Type *base, /* Append message size into last of the block */ /* In case of u32SizeInByte * 8 > u32Max */ - Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 5u, (uint8_t)(finalMessageSizeInBits >> 32u)); + Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 5U, (uint8_t)(finalMessageSizeInBits >> 32U)); - Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 4u, (uint8_t)(finalMessageSizeInBits >> 24u)); - Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 3u, (uint8_t)(finalMessageSizeInBits >> 16u)); - Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 2u, (uint8_t)(finalMessageSizeInBits >> 8u)); - Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 1u, (uint8_t)(finalMessageSizeInBits)); + Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 4U, (uint8_t)(finalMessageSizeInBits >> 24U)); + Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 3U, (uint8_t)(finalMessageSizeInBits >> 16U)); + Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 2U, (uint8_t)(finalMessageSizeInBits >> 8U)); + Cy_Crypto_Core_V2_RBSetByte(base, myBlockSize - 1U, (uint8_t)(finalMessageSizeInBits)); Cy_Crypto_Core_V2_Run(base, hashState->mode); Cy_Crypto_Core_V2_Sync(base); @@ -394,14 +397,14 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Finish(CRYPTO_Type *base, /* Write digest. */ Cy_Crypto_Core_V2_FFStart(base, CY_CRYPTO_V2_RB_FF_STORE, digest, hashState->digestSize); Cy_Crypto_Core_V2_RBSwap(base); - Cy_Crypto_Core_V2_RBStore(base, 0u, hashState->digestSize); + Cy_Crypto_Core_V2_RBStore(base, 0U, hashState->digestSize); Cy_Crypto_Core_V2_FFStoreSync(base); - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -411,31 +414,31 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Finish(CRYPTO_Type *base, * Clears the used memory buffers. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param hashState * The pointer to the SHA context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Free(CRYPTO_Type *base, cy_stc_crypto_sha_state_t *hashState) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; if (hashState != NULL) { - Cy_Crypto_Core_V2_MemSet(base, hashState, 0x00u, sizeof(cy_stc_crypto_sha_state_t)); + Cy_Crypto_Core_V2_MemSet(base, hashState, 0x00U, sizeof(cy_stc_crypto_sha_state_t)); /* Clears the memory buffer. */ Cy_Crypto_Core_V2_RBClear(base); Cy_Crypto_Core_V2_Sync(base); - myResult = CY_CRYPTO_SUCCESS; + tmpResult = CY_CRYPTO_SUCCESS; } - return (myResult); + return (tmpResult); } /******************************************************************************* @@ -445,7 +448,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Free(CRYPTO_Type *base, cy_stc_crypt * Performs the SHA Hash function. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param mode * \ref cy_en_crypto_sha_mode_t @@ -460,7 +463,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha_Free(CRYPTO_Type *base, cy_stc_crypt * The pointer to the hash digest. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha(CRYPTO_Type *base, @@ -469,32 +472,32 @@ cy_en_crypto_status_t Cy_Crypto_Core_V2_Sha(CRYPTO_Type *base, uint8_t *digest, cy_en_crypto_sha_mode_t mode) { - cy_en_crypto_status_t myResult = CY_CRYPTO_BAD_PARAMS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_BAD_PARAMS; /* Allocate space for the structure which stores the SHA context */ - cy_stc_crypto_sha_state_t hashState; + cy_stc_crypto_sha_state_t hashState = { 0 }; - /* No any buffers needed for Crypto_ver2 IP block */ - myResult = Cy_Crypto_Core_V2_Sha_Init (base, &hashState, mode, NULL); + /* No buffers are needed for the Crypto_ver2 IP block. */ + tmpResult = Cy_Crypto_Core_V2_Sha_Init (base, &hashState, mode, NULL); - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V2_Sha_Start (base, &hashState); + tmpResult = Cy_Crypto_Core_V2_Sha_Start (base, &hashState); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V2_Sha_Update (base, &hashState, message, messageSize); + tmpResult = Cy_Crypto_Core_V2_Sha_Update (base, &hashState, message, messageSize); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V2_Sha_Finish (base, &hashState, digest); + tmpResult = Cy_Crypto_Core_V2_Sha_Finish (base, &hashState, digest); } - if (CY_CRYPTO_SUCCESS == myResult) + if (CY_CRYPTO_SUCCESS == tmpResult) { - myResult = Cy_Crypto_Core_V2_Sha_Free (base, &hashState); + tmpResult = Cy_Crypto_Core_V2_Sha_Free (base, &hashState); } - return (myResult); + return (tmpResult); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v1.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v1.c index 3a43c91bb2..5275864895 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v1.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v1.c @@ -41,10 +41,10 @@ static void Cy_Crypto_Core_V1_Trng_Init(CRYPTO_Type *base); * Function Name: Cy_Crypto_Core_V1_Trng_Init ****************************************************************************//** * -* Initializes the TRND parameters. +* Initializes the TRNG parameters. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ static void Cy_Crypto_Core_V1_Trng_Init(CRYPTO_Type *base) @@ -57,15 +57,15 @@ static void Cy_Crypto_Core_V1_Trng_Init(CRYPTO_Type *base) REG_CRYPTO_TR_MON_AP_CTL(base) = CY_CRYPTO_V1_TR_AC_CUTOFF; } + /******************************************************************************* * Function Name: Cy_Crypto_Core_V1_Trng ****************************************************************************//** * -* Generates a True Random Number and returns it in the -* cfContext->trngNumPtr. +* Generates a True Random Number. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param GAROPol * The polynomial for the programmable Galois ring oscillator. @@ -80,7 +80,7 @@ static void Cy_Crypto_Core_V1_Trng_Init(CRYPTO_Type *base) * The pointer to a generated true random number. Must be 4-byte aligned. * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V1_Trng(CRYPTO_Type *base, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v2.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v2.c index e6d184a225..3c83ff2fae 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v2.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_trng_v2.c @@ -40,10 +40,10 @@ static void Cy_Crypto_Core_V2_Trng_Init(CRYPTO_Type *base); * Function Name: Cy_Crypto_Core_V2_Trng_Init ****************************************************************************//** * -* Initializes the TRND parameters. +* Initializes the TRNG parameters. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * *******************************************************************************/ static void Cy_Crypto_Core_V2_Trng_Init(CRYPTO_Type *base) @@ -56,15 +56,15 @@ static void Cy_Crypto_Core_V2_Trng_Init(CRYPTO_Type *base) REG_CRYPTO_TR_MON_AP_CTL(base) = CY_CRYPTO_V2_TR_AC_CUTOFF; } + /******************************************************************************* * Function Name: Cy_Crypto_Core_V2_Trng ****************************************************************************//** * -* Generates a True Random Number and returns it in the -* cfContext->trngNumPtr. +* Generates a True Random Number. * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param GAROPol * The polynomial for the programmable Galois ring oscillator. @@ -79,7 +79,7 @@ static void Cy_Crypto_Core_V2_Trng_Init(CRYPTO_Type *base) * The pointer to a generated true random number. Must be 4-byte aligned. * * \return -* A Crypto status \ref en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ cy_en_crypto_status_t Cy_Crypto_Core_V2_Trng(CRYPTO_Type *base, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_vu.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_vu.c index ec5df3c749..f1750927c1 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_vu.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_core_vu.c @@ -46,7 +46,7 @@ void Cy_Crypto_Core_Vu_SetMemValue(CRYPTO_Type *base, uint32_t dstReg, uint8_t c Cy_Crypto_Core_Vu_WaitForComplete(base); - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { CY_CRYPTO_VU_SAVE_REG(base, CY_CRYPTO_VU_HW_REG0, ®0_data); CY_CRYPTO_VU_SAVE_REG(base, CY_CRYPTO_VU_HW_REG1, ®1_data); @@ -61,10 +61,10 @@ void Cy_Crypto_Core_Vu_SetMemValue(CRYPTO_Type *base, uint32_t dstReg, uint8_t c CY_ASSERT_L1(size <= Cy_Crypto_Core_Vu_RegBitSizeRead(base, dstReg)); - CY_ASSERT_L1(((uint32_t)Cy_Crypto_Core_Vu_RegMemPointer(base, dstReg) + byteSize - 1) < ((uint32_t)REG_CRYPTO_MEM_BUFF(base) + CY_CRYPTO_MEM_BUFF_SIZE) ); + CY_ASSERT_L1( (((uint32_t)Cy_Crypto_Core_Vu_RegMemPointer(base, dstReg) + byteSize) - 1u) < ((uint32_t)REG_CRYPTO_MEM_BUFF(base) + CY_CRYPTO_MEM_BUFF_SIZE)); Cy_Crypto_Core_MemCpy(base, (void*)Cy_Crypto_Core_Vu_RegMemPointer(base, dstReg), (const void*)src, byteSize); - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { CY_CRYPTO_VU_RESTORE_REG(base, CY_CRYPTO_VU_HW_REG0, reg0_data); CY_CRYPTO_VU_RESTORE_REG(base, CY_CRYPTO_VU_HW_REG1, reg1_data); @@ -78,7 +78,7 @@ void Cy_Crypto_Core_Vu_GetMemValue(CRYPTO_Type *base, uint8_t *dst, uint32_t src Cy_Crypto_Core_Vu_WaitForComplete(base); - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { CY_CRYPTO_VU_SAVE_REG(base, CY_CRYPTO_VU_HW_REG0, ®0_data); CY_CRYPTO_VU_SAVE_REG(base, CY_CRYPTO_VU_HW_REG1, ®1_data); @@ -92,11 +92,11 @@ void Cy_Crypto_Core_Vu_GetMemValue(CRYPTO_Type *base, uint8_t *dst, uint32_t src } CY_ASSERT_L1(size <= Cy_Crypto_Core_Vu_RegBitSizeRead(base, srcReg)); - CY_ASSERT_L1(((uint32_t)Cy_Crypto_Core_Vu_RegMemPointer(base, srcReg) + byteSize - 1) < ((uint32_t)REG_CRYPTO_MEM_BUFF(base) + CY_CRYPTO_MEM_BUFF_SIZE) ); + CY_ASSERT_L1((((uint32_t)Cy_Crypto_Core_Vu_RegMemPointer(base, srcReg) + byteSize) - 1u) < ((uint32_t)REG_CRYPTO_MEM_BUFF(base) + CY_CRYPTO_MEM_BUFF_SIZE) ); Cy_Crypto_Core_MemCpy(base, (void*)dst, (void*)Cy_Crypto_Core_Vu_RegMemPointer(base, srcReg), byteSize); - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { CY_CRYPTO_VU_RESTORE_REG(base, CY_CRYPTO_VU_HW_REG0, reg0_data); CY_CRYPTO_VU_RESTORE_REG(base, CY_CRYPTO_VU_HW_REG1, reg1_data); @@ -129,7 +129,7 @@ cy_en_crypto_status_t Cy_Crypto_Core_Cleanup(CRYPTO_Type *base) /* AES */ REG_CRYPTO_AES_CTL(base) = 0u; - if (cy_device->cryptoVersion == 1u) + if (CY_CRYPTO_HW_V1) { REG_CRYPTO_CRC_LFSR_CTL(base) = 0u; REG_CRYPTO_SHA_CTL(base) = 0u; @@ -145,69 +145,69 @@ cy_en_crypto_status_t Cy_Crypto_Core_Cleanup(CRYPTO_Type *base) Cy_Crypto_Core_V2_RBClear(base); } - Cy_Crypto_Core_MemSet(base, (void *)REG_CRYPTO_MEM_BUFF(base), 0u, CY_CRYPTO_MEM_BUFF_SIZE); + Cy_Crypto_Core_MemSet(base, (void *)REG_CRYPTO_MEM_BUFF(base), 0u, (uint16_t)CY_CRYPTO_MEM_BUFF_SIZE); return (CY_CRYPTO_SUCCESS); } bool Cy_Crypto_Core_Vu_IsRegZero(CRYPTO_Type *base, uint32_t srcReg) { - bool result; - uint16_t status; + bool tmpResult; + uint32_t status; CY_CRYPTO_VU_TST(base, srcReg); status = Cy_Crypto_Core_Vu_StatusRead(base); - if (status & CY_CRYPTO_VU_STATUS_ZERO_BIT) + if (0u != (status & CY_CRYPTO_VU_STATUS_ZERO_BIT)) { - result = true; + tmpResult = true; } else { - result = false; + tmpResult = false; } - return result; + return tmpResult; } bool Cy_Crypto_Core_Vu_IsRegEqual(CRYPTO_Type *base, uint32_t srcReg0, uint32_t srcReg1) { - bool result; - uint16_t status; + bool tmpResult; + uint32_t status; CY_CRYPTO_VU_CMP_SUB (base, srcReg1, srcReg0); /* C = (a >= b) */ status = Cy_Crypto_Core_Vu_StatusRead(base); - if (status & CY_CRYPTO_VU_STATUS_ZERO_BIT) + if (0u != (status & CY_CRYPTO_VU_STATUS_ZERO_BIT)) { - result = true; + tmpResult = true; } else { - result = false; + tmpResult = false; } - return result; + return tmpResult; } bool Cy_Crypto_Core_Vu_IsRegLess(CRYPTO_Type *base, uint32_t srcReg0, uint32_t srcReg1) { - bool result; - uint16_t status; + bool tmpResult; + uint32_t status; CY_CRYPTO_VU_CMP_SUB (base, srcReg1, srcReg0); /* C = (a >= b) */ status = Cy_Crypto_Core_Vu_StatusRead(base); - if (status & CY_CRYPTO_VU_STATUS_CARRY_BIT) + if (0u != (status & CY_CRYPTO_VU_STATUS_CARRY_BIT)) { - result = true; + tmpResult = true; } else { - result = false; + tmpResult = false; } - return result; + return tmpResult; } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_server.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_server.c index e3da49876d..fda6402e14 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_server.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6pdl/drivers/source/cy_crypto_server.c @@ -46,7 +46,7 @@ #if defined(CY_IP_MXCRYPTO) -/* The pointer to the CRYPTO instance address. */ +/* The pointer to the CRYPTO instance. */ #define CY_CRYPTO_BASE ((CRYPTO_Type *)cy_device->cryptoBase) typedef struct @@ -724,19 +724,19 @@ void Cy_Crypto_Server_GetDataHandler(void) * This function is internal and should not to be called directly by user software * * \param base -* The pointer to the CRYPTO instance address. +* The pointer to the CRYPTO instance. * * \param cryptoContext * The pointer to cy_stc_crypto_context_t structure which stores * the Crypto driver context. * * \return -* A Crypto status \ref cy_en_crypto_status_t. +* \ref cy_en_crypto_status_t * *******************************************************************************/ static cy_en_crypto_status_t Cy_Crypto_Core_CheckHwForErrors(cy_stc_crypto_context_t *cryptoContext) { - cy_en_crypto_status_t myResult = CY_CRYPTO_SUCCESS; + cy_en_crypto_status_t tmpResult = CY_CRYPTO_SUCCESS; uint32_t myErrorStatus0; uint32_t myErrorStatus1; @@ -750,7 +750,7 @@ static cy_en_crypto_status_t Cy_Crypto_Core_CheckHwForErrors(cy_stc_crypto_conte if (_FLD2VAL(CRYPTO_ERROR_STATUS1_VALID, myErrorStatus1) == 1u) { - myResult = CY_CRYPTO_HW_ERROR; + tmpResult = CY_CRYPTO_HW_ERROR; cy_crypto_serverContext->isHwErrorOccured = true; } @@ -763,7 +763,7 @@ static cy_en_crypto_status_t Cy_Crypto_Core_CheckHwForErrors(cy_stc_crypto_conte if (_FLD2VAL(CRYPTO_ERROR_STATUS1_VALID, myErrorStatus1) == 1u) { - myResult = CY_CRYPTO_HW_ERROR; + tmpResult = CY_CRYPTO_HW_ERROR; } cy_crypto_serverContext->isHwErrorOccured = false; @@ -772,7 +772,7 @@ static cy_en_crypto_status_t Cy_Crypto_Core_CheckHwForErrors(cy_stc_crypto_conte cryptoContext->hwErrorStatus.errorStatus0 = myErrorStatus0; cryptoContext->hwErrorStatus.errorStatus1 = myErrorStatus1; - return (myResult); + return (tmpResult); } #endif /* CY_IP_MXCRYPTO */ From 42376c0d853ce89ca8924bc273877064681c9280 Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Fri, 15 Feb 2019 14:34:39 +0200 Subject: [PATCH 087/109] PSOC6: minor updates to Cypress HAL --- .../TARGET_PSOC6/analogin_api.c | 14 ++++---- targets/TARGET_Cypress/TARGET_PSOC6/crc_api.c | 33 +++++++++---------- .../TARGET_Cypress/TARGET_PSOC6/psoc6_utils.c | 31 +++++++---------- .../TARGET_Cypress/TARGET_PSOC6/psoc6_utils.h | 3 +- .../TARGET_Cypress/TARGET_PSOC6/pwmout_api.c | 4 +-- .../TARGET_Cypress/TARGET_PSOC6/serial_api.c | 22 ++++++++----- targets/TARGET_Cypress/TARGET_PSOC6/spi_api.c | 12 +++---- .../TARGET_Cypress/TARGET_PSOC6/trng_api.c | 12 +++---- 8 files changed, 61 insertions(+), 70 deletions(-) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/analogin_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/analogin_api.c index 9133e88d4c..93df2f04c6 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/analogin_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/analogin_api.c @@ -44,7 +44,7 @@ const uint32_t SAR_BASE_CLOCK_HZ = 18000000; // 18 MHz or less CY_SAR_CHAN_SAMPLE_TIME_0 \ ) -#define CY_SAR_PORT_9 (9uL) +#define CY_SAR_PORT_9 (9uL) /** Global SAR configuration data, modified as channels are configured. */ @@ -173,11 +173,10 @@ uint16_t analogin_read_u16(analogin_t *obj) if (CY_SAR_PORT_9 != port) { /* Connect the SAR Vplus input to the pin directly */ Cy_SAR_SetAnalogSwitch(obj->base, CY_SAR_MUX_SWITCH0, obj->channel_mask, CY_SAR_SWITCH_CLOSE); - } - else { + } else { /* Connect the SAR Vplus input to the AMUXA bus */ Cy_SAR_SetAnalogSwitch(obj->base, CY_SAR_MUX_SWITCH0, SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VPLUS_Msk, CY_SAR_SWITCH_CLOSE); - + /* Connect the AMUXA bus to the pin */ Cy_GPIO_SetHSIOM(portPrt, CY_PIN(obj->pin), HSIOM_SEL_AMUXA); } @@ -188,15 +187,14 @@ uint16_t analogin_read_u16(analogin_t *obj) } else { error("ANALOG IN: measurement failed!"); } - + if (CY_SAR_PORT_9 != port) { /* Disconnect the SAR Vplus input from the pin */ Cy_SAR_SetAnalogSwitch(obj->base, CY_SAR_MUX_SWITCH0, obj->channel_mask, CY_SAR_SWITCH_OPEN); - } - else { + } else { /* Disconnect the AMUXA bus from the pin */ Cy_GPIO_SetHSIOM(portPrt, CY_PIN(obj->pin), HSIOM_SEL_GPIO); - + /* Disconnect the SAR Vplus input from the AMUXA bus */ Cy_SAR_SetAnalogSwitch(obj->base, CY_SAR_MUX_SWITCH0, SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VPLUS_Msk, CY_SAR_SWITCH_OPEN); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/crc_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/crc_api.c index 9b8fba9a26..0f713984ed 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/crc_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/crc_api.c @@ -26,11 +26,11 @@ #include "cy_crypto_core_crc.h" -static uint32_t crcWidth = 0; -static uint32_t crcShift = 0; +static uint32_t crcWidth = 0UL; +static uint32_t crcShift = 0UL; static uint32_t crcXorMask; -/* Cypress CRYPTO HW supports ANY CRC algorithms from CRC-3 to CRC-32 */ +/* Cypress CRYPTO hardware supports any CRC algorithms from CRC-3 to CRC-32 */ bool hal_crc_is_supported(const crc_mbed_config_t *config) { return (config != NULL); @@ -38,20 +38,19 @@ bool hal_crc_is_supported(const crc_mbed_config_t *config) void hal_crc_compute_partial_start(const crc_mbed_config_t *config) { - uint32_t myMask = 0; + uint32_t myMask = 0UL; - if (!hal_crc_is_supported(config) || (cy_reserve_crypto(CY_CRYPTO_CRC_HW) != 0)) - { + if (!hal_crc_is_supported(config) || (cy_reserve_crypto(CY_CRYPTO_CRC_HW) != 0U)) { return; } crcWidth = config->width; - crcShift = (uint32_t)(!config->reflect_out) * (crcWidth & 7u); - if (crcShift) { - crcShift = 8u - crcShift; - for (uint32_t i = 0; i < crcShift; i++) { - myMask |= 1 << i; + crcShift = (uint32_t)(!config->reflect_out) * (crcWidth & 7U); + if (0U != crcShift) { + crcShift = 8U - crcShift; + for (uint32_t i = 0U; i < crcShift; i++) { + myMask |= 1U << i; } crcXorMask = config->final_xor & myMask; } @@ -59,7 +58,7 @@ void hal_crc_compute_partial_start(const crc_mbed_config_t *config) Cy_Crypto_Core_Crc_CalcInit(CRYPTO, config->width, config->polynomial, config->reflect_in, - 0, + 0U, config->reflect_out, config->final_xor >> crcShift, config->initial_xor); @@ -67,7 +66,7 @@ void hal_crc_compute_partial_start(const crc_mbed_config_t *config) void hal_crc_compute_partial(const uint8_t *data, const size_t size) { - if ((data == NULL) || (size <= 0) || (crcWidth == 0)) { + if ((data == NULL) || (size <= 0U) || (crcWidth == 0U)) { return; } @@ -76,10 +75,10 @@ void hal_crc_compute_partial(const uint8_t *data, const size_t size) uint32_t hal_crc_get_result(void) { - uint32_t result = 0; + uint32_t result = 0UL; - if (crcWidth == 0) { - return 0xffffffffu; + if (crcWidth == 0UL) { + return 0xFFFFFFFFUL; } Cy_Crypto_Core_Crc_CalcFinish(CRYPTO, crcWidth, &result); @@ -89,7 +88,7 @@ uint32_t hal_crc_get_result(void) result = result ^ crcXorMask; } - crcWidth = 0; + crcWidth = 0UL; cy_free_crypto(CY_CRYPTO_CRC_HW); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.c b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.c index dc88242ee3..84af989a07 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.c @@ -360,9 +360,9 @@ static uint8_t crypto_reservations[NUM_CRYPTO_HW] = { 0u }; static int cy_crypto_reserved_status(void) { return ((int)(crypto_reservations[CY_CRYPTO_TRNG_HW] | - crypto_reservations[CY_CRYPTO_CRC_HW] | - crypto_reservations[CY_CRYPTO_VU_HW] | - crypto_reservations[CY_CRYPTO_COMMON_HW])); + crypto_reservations[CY_CRYPTO_CRC_HW] | + crypto_reservations[CY_CRYPTO_VU_HW] | + crypto_reservations[CY_CRYPTO_COMMON_HW])); } @@ -370,26 +370,20 @@ int cy_reserve_crypto(cy_en_crypto_submodule_t module_num) { int result = (-1); - if (module_num < NUM_CRYPTO_HW) - { + if (module_num < NUM_CRYPTO_HW) { core_util_critical_section_enter(); - if (cy_crypto_reserved_status() == 0) - { + if (cy_crypto_reserved_status() == 0) { /* Enable Crypto IP on demand */ Cy_Crypto_Core_Enable(CRYPTO); } - if (module_num == CY_CRYPTO_COMMON_HW) - { - if (crypto_reservations[module_num] != 1) - { + if (module_num == CY_CRYPTO_COMMON_HW) { + if (crypto_reservations[module_num] != 1) { crypto_reservations[module_num] = 1; result = 0; } - } - else - { + } else { crypto_reservations[module_num] = 1; result = 0; } @@ -405,16 +399,13 @@ void cy_free_crypto(cy_en_crypto_submodule_t module_num) { int result = (-1); - if (module_num < NUM_CRYPTO_HW) - { + if (module_num < NUM_CRYPTO_HW) { core_util_critical_section_enter(); - if (crypto_reservations[module_num] == 1) - { + if (crypto_reservations[module_num] == 1) { crypto_reservations[module_num] = 0; - if (cy_crypto_reserved_status() == 0) - { + if (cy_crypto_reserved_status() == 0) { /* Crypto hardware is still in enabled state; to disable: Cy_Crypto_Core_Disable(CRYPTO) */ } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.h b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.h index b9adf938d9..452940542a 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/psoc6_utils.h @@ -215,8 +215,7 @@ static inline uint32_t gpio_get_cy_drive_mode(PinDirection dir, PinMode mode) return cymode; } -typedef enum -{ +typedef enum { CY_CRYPTO_TRNG_HW, CY_CRYPTO_CRC_HW, CY_CRYPTO_VU_HW, diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/pwmout_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/pwmout_api.c index 1f39903179..915d267df9 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/pwmout_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/pwmout_api.c @@ -73,7 +73,7 @@ static void pwm_start_32b(pwmout_t *obj, uint32_t new_period, uint32_t new_width Cy_TCPWM_PWM_SetPeriod0(obj->base, obj->counter_id, obj->period - 1); Cy_TCPWM_PWM_SetCompare0(obj->base, obj->counter_id, obj->pulse_width); Cy_TCPWM_PWM_Enable(obj->base, obj->counter_id); - Cy_TCPWM_TriggerStart(obj->base, 1UL << obj->counter_id); + Cy_TCPWM_TriggerReloadOrIndex(obj->base, 1UL << obj->counter_id); } static void pwm_start_16b(pwmout_t *obj, uint32_t period, uint32_t width) @@ -101,7 +101,7 @@ static void pwm_start_16b(pwmout_t *obj, uint32_t period, uint32_t width) Cy_TCPWM_PWM_SetPrescaler(obj->base, obj->counter_id, prescaler); Cy_TCPWM_PWM_SetCompare0(obj->base, obj->counter_id, width); Cy_TCPWM_PWM_Enable(obj->base, obj->counter_id); - Cy_TCPWM_TriggerStart(obj->base, 1UL << obj->counter_id); + Cy_TCPWM_TriggerReloadOrIndex(obj->base, 1UL << obj->counter_id); } static void pwm_start(pwmout_t *obj, uint32_t new_period, uint32_t new_pulse_width) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/serial_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/serial_api.c index dc01883ce8..9f7c686ec1 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/serial_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/serial_api.c @@ -383,13 +383,16 @@ static void serial_init_peripheral(serial_obj_t *obj) } +/* + * Callback function to handle into and out of deep sleep state transitions. + */ #if DEVICE_SLEEP && DEVICE_LPTICKER && SERIAL_PM_CALLBACK_ENABLED -static cy_en_syspm_status_t serial_pm_callback(cy_stc_syspm_callback_params_t *params) +static cy_en_syspm_status_t serial_pm_callback(cy_stc_syspm_callback_params_t *callbackParams, cy_en_syspm_callback_mode_t mode) { - serial_obj_t *obj = (serial_obj_t *)params->context; + serial_obj_t *obj = (serial_obj_t *) callbackParams->context; cy_en_syspm_status_t status = CY_SYSPM_FAIL; - switch (params->mode) { + switch (mode) { case CY_SYSPM_CHECK_READY: /* If all data elements are transmitted from the TX FIFO and * shifter and the RX FIFO is empty: the UART is ready to enter @@ -432,7 +435,7 @@ static cy_en_syspm_status_t serial_pm_callback(cy_stc_syspm_callback_params_t *p return status; } -#endif /* (DEVICE_SLEEP && DEVICE_LPTICKER && SERIAL_PM_CALLBACK_ENABLED) */ +#endif /* DEVICE_SLEEP && DEVICE_LPTICKER && SERIAL_PM_CALLBACK_ENABLED */ void serial_init(serial_t *obj_in, PinName tx, PinName rx) @@ -492,16 +495,16 @@ void serial_init(serial_t *obj_in, PinName tx, PinName rx) #if DEVICE_SLEEP && DEVICE_LPTICKER && SERIAL_PM_CALLBACK_ENABLED /* Register callback once */ obj->pm_callback_handler.callback = serial_pm_callback; - obj->pm_callback_handler.type = CY_SYSPM_DEEPSLEEP; + obj->pm_callback_handler.type = CY_SYSPM_DEEPSLEEP; obj->pm_callback_handler.skipMode = 0; obj->pm_callback_handler.callbackParams = &obj->pm_callback_params; - obj->pm_callback_params.base = obj->base; + obj->pm_callback_params.base = obj->base; obj->pm_callback_params.context = obj; if (!Cy_SysPm_RegisterCallback(&obj->pm_callback_handler)) { error("PM callback registration failed!"); } -#endif /* (DEVICE_SLEEP && DEVICE_LPTICKER && SERIAL_PM_CALLBACK_ENABLED) */ +#endif /* DEVICE_SLEEP && DEVICE_LPTICKER && SERIAL_PM_CALLBACK_ENABLED */ } /* Configure hardware resources */ @@ -666,9 +669,10 @@ void serial_set_flow_control(serial_t *obj_in, FlowControl type, PinName rxflow, { serial_obj_t *obj = OBJ_P(obj_in); - /* Do not perform pins reservation second time for the same pins */ - if ((obj->pin_rts == rxflow) && (obj->pin_cts == txflow)) + /* Do not perform pins reservation second time for the same pins */ + if ((obj->pin_rts == rxflow) && (obj->pin_cts == txflow)) { return; + } Cy_SCB_UART_Disable(obj->base, NULL); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/spi_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/spi_api.c index fb4a50bbfa..8bb5b4336d 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/spi_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/spi_api.c @@ -237,16 +237,16 @@ static void spi_init_peripheral(spi_obj_t *obj) /* Callback function to handle into and out of deep sleep state transitions. * */ -#if DEVICE_SLEEP && DEVICE_LOWPOWERTIMER -static cy_en_syspm_status_t spi_pm_callback(cy_stc_syspm_callback_params_t *callback_params) +#if DEVICE_SLEEP && DEVICE_LPTICKER +static cy_en_syspm_status_t spi_pm_callback(cy_stc_syspm_callback_params_t *callback_params, cy_en_syspm_callback_mode_t mode) { cy_stc_syspm_callback_params_t params = *callback_params; spi_obj_t *obj = (spi_obj_t *)params.context; params.context = &obj->context; - return Cy_SCB_SPI_DeepSleepCallback(¶ms); + return Cy_SCB_SPI_DeepSleepCallback(¶ms, mode); } -#endif /* DEVICE_SLEEP && DEVICE_LOWPOWERTIMER */ +#endif /* DEVICE_SLEEP && DEVICE_LPTICKER */ void spi_init(spi_t *obj_in, PinName mosi, PinName miso, PinName sclk, PinName ssel) @@ -314,7 +314,7 @@ void spi_init(spi_t *obj_in, PinName mosi, PinName miso, PinName sclk, PinName s obj->div_num = _FLD2VAL(CY_PERI_CLOCK_CTL_DIV_SEL, map); obj->div_type = (cy_en_divider_types_t) _FLD2VAL(CY_PERI_CLOCK_CTL_TYPE_SEL, map); } else { -#if DEVICE_SLEEP && DEVICE_LOWPOWERTIMER +#if DEVICE_SLEEP && DEVICE_LPTICKER /* Register callback once */ obj->pm_callback_handler.callback = spi_pm_callback; obj->pm_callback_handler.type = CY_SYSPM_DEEPSLEEP; @@ -326,7 +326,7 @@ void spi_init(spi_t *obj_in, PinName mosi, PinName miso, PinName sclk, PinName s if (!Cy_SysPm_RegisterCallback(&obj->pm_callback_handler)) { error("PM callback registration failed!"); } -#endif /* DEVICE_SLEEP && DEVICE_LOWPOWERTIMER */ +#endif /* DEVICE_SLEEP && DEVICE_LPTICKER */ } /* Configure hardware resources */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/trng_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/trng_api.c index 49bb1ae26a..92f751670d 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/trng_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/trng_api.c @@ -24,8 +24,8 @@ #include "cy_crypto_core_trng.h" /* Initialization polynomial values fro True Random Generator */ -#define GARO31_INITSTATE (0x04c11db7u) -#define FIRO31_INITSTATE (0x04c11db7u) +#define GARO31_INITSTATE (0x04c11db7UL) +#define FIRO31_INITSTATE (0x04c11db7UL) #define MAX_TRNG_BIT_SIZE (32UL) @@ -47,7 +47,7 @@ void trng_free(trng_t *obj) int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) { int ret = 0; - *output_length = 0; + *output_length = 0U; /* temporary random data buffer */ uint32_t random; @@ -59,13 +59,13 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l if (Cy_Crypto_Core_Trng(CRYPTO, GARO31_INITSTATE, FIRO31_INITSTATE, MAX_TRNG_BIT_SIZE, &random) != CY_CRYPTO_SUCCESS) { ret = -1; } else { - for (uint8_t i = 0; (i < 4) && (*output_length < length) ; i++) { + for (uint8_t i = 0; (i < 4U) && (*output_length < length) ; i++) { *output++ = ((uint8_t *)&random)[i]; - *output_length += 1; + *output_length += 1U; } } } - random = 0uL; + random = 0UL; return (ret); } From 91df4c9187e4de64b2b536c5d570a7adb04af65a Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Fri, 15 Feb 2019 14:35:52 +0200 Subject: [PATCH 088/109] PSOC6: do not reconfigure BT GPIO pins in CYW43XXX HCIDriver --- .../targets/TARGET_Cypress/TARGET_CYW43XXX/HCIDriver.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/features/FEATURE_BLE/targets/TARGET_Cypress/TARGET_CYW43XXX/HCIDriver.cpp b/features/FEATURE_BLE/targets/TARGET_Cypress/TARGET_CYW43XXX/HCIDriver.cpp index 3b5bf8ef50..3288b568e0 100644 --- a/features/FEATURE_BLE/targets/TARGET_Cypress/TARGET_CYW43XXX/HCIDriver.cpp +++ b/features/FEATURE_BLE/targets/TARGET_Cypress/TARGET_CYW43XXX/HCIDriver.cpp @@ -75,11 +75,10 @@ public: virtual void do_initialize() { - - Cy_GPIO_Clr(BT_DEVICE_WAKE_PORT, BT_DEVICE_WAKE_PIN); + bt_device_wake = 0; wait_ms(500); - Cy_GPIO_Set(BT_POWER_PORT, BT_POWER_PIN); + bt_power = 1; wait_ms(500); } From cd4165bae8948f553a0424320e4af26f90d72d89 Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Fri, 15 Feb 2019 19:48:29 +0200 Subject: [PATCH 089/109] PSOC6: update BSP generated sources with latest configurator Use ModusToolbox Device Configurator 1.1.0.284 to generate the BSP low-level initialization code. Compatible version of Device Configurator to be released with ModusToolbox 1.1. Notable changes: * rename cycfg_connectivity -> cycfg_routing * switch LF_CLK clock source from ILO to WCO on CY8CPROTO-062-4343W and CYW943012P6EVB-01 --- .../GeneratedSource/cycfg.c | 2 +- .../GeneratedSource/cycfg.h | 2 +- .../GeneratedSource/cycfg_peripherals.h | 2 +- .../GeneratedSource/cycfg_pins.h | 2 +- .../{cycfg_connectivity.c => cycfg_routing.c} | 6 ++-- .../{cycfg_connectivity.h => cycfg_routing.h} | 12 +++---- .../GeneratedSource/cycfg.c | 2 +- .../GeneratedSource/cycfg.h | 2 +- .../GeneratedSource/cycfg_pins.h | 2 +- .../GeneratedSource/cycfg_platform.c | 2 +- .../GeneratedSource/cycfg_platform.h | 2 +- .../{cycfg_connectivity.c => cycfg_routing.c} | 6 ++-- .../{cycfg_connectivity.h => cycfg_routing.h} | 34 +++++++++---------- .../GeneratedSource/cycfg.c | 2 +- .../GeneratedSource/cycfg.h | 2 +- .../GeneratedSource/cycfg_peripherals.h | 2 +- .../GeneratedSource/cycfg_pins.h | 2 +- .../GeneratedSource/cycfg_platform.c | 2 +- .../GeneratedSource/cycfg_platform.h | 2 +- .../{cycfg_connectivity.c => cycfg_routing.c} | 22 ++++++------ .../{cycfg_connectivity.h => cycfg_routing.h} | 20 +++++------ .../GeneratedSource/cycfg.c | 2 +- .../GeneratedSource/cycfg.h | 2 +- .../GeneratedSource/cycfg_peripherals.h | 2 +- .../GeneratedSource/cycfg_pins.h | 2 +- .../GeneratedSource/cycfg_platform.c | 14 ++------ .../GeneratedSource/cycfg_platform.h | 2 +- .../{cycfg_connectivity.c => cycfg_routing.c} | 6 ++-- .../{cycfg_connectivity.h => cycfg_routing.h} | 12 +++---- .../GeneratedSource/cycfg.c | 2 +- .../GeneratedSource/cycfg.h | 2 +- .../GeneratedSource/cycfg_peripherals.h | 2 +- .../GeneratedSource/cycfg_pins.h | 2 +- .../GeneratedSource/cycfg_platform.c | 4 +-- .../GeneratedSource/cycfg_platform.h | 2 +- .../{cycfg_connectivity.c => cycfg_routing.c} | 6 ++-- .../{cycfg_connectivity.h => cycfg_routing.h} | 12 +++---- 37 files changed, 98 insertions(+), 106 deletions(-) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/{cycfg_connectivity.c => cycfg_routing.c} (93%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/{cycfg_connectivity.h => cycfg_routing.h} (93%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/{cycfg_connectivity.c => cycfg_routing.c} (93%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/{cycfg_connectivity.h => cycfg_routing.h} (70%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/{cycfg_connectivity.c => cycfg_routing.c} (86%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/{cycfg_connectivity.h => cycfg_routing.h} (88%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/{cycfg_connectivity.c => cycfg_routing.c} (93%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/{cycfg_connectivity.h => cycfg_routing.h} (93%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/{cycfg_connectivity.c => cycfg_routing.c} (95%) rename targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/{cycfg_connectivity.h => cycfg_routing.h} (95%) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.c index cf7ac0229a..74c28aba2c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.c @@ -30,5 +30,5 @@ void init_cycfg_all(void) init_cycfg_peripherals(); init_cycfg_pins(); init_cycfg_platform(); - init_cycfg_connectivity(); + init_cycfg_routing(); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.h index 68bb40bf09..ac6033d2bd 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg.h @@ -34,7 +34,7 @@ extern "C" { #include "cycfg_peripherals.h" #include "cycfg_pins.h" #include "cycfg_platform.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" void init_cycfg_all(void); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_peripherals.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_peripherals.h index 558a12aade..d3b2015e80 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_peripherals.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_peripherals.h @@ -35,7 +35,7 @@ #include "cy_mcwdt.h" #include "cy_rtc.h" #include "cy_tcpwm_pwm.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_usbfs_dev_drv.h" #if defined(__cplusplus) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_pins.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_pins.h index c2f019c59e..edfb6d7fce 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_pins.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_pins.h @@ -27,7 +27,7 @@ #include "cycfg_notices.h" #include "cy_gpio.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #if defined(__cplusplus) extern "C" { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_connectivity.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_routing.c similarity index 93% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_connectivity.c rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_routing.c index c389562da2..ae79008829 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_connectivity.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_routing.c @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.c +* File Name: cycfg_routing.c * * Description: * Establishes all necessary connections between hardware elements. @@ -22,11 +22,11 @@ * limitations under the License. ********************************************************************************/ -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_device_headers.h" -void init_cycfg_connectivity(void) +void init_cycfg_routing(void) { HSIOM->AMUX_SPLIT_CTL[2] = HSIOM_V2_AMUX_SPLIT_CTL_SWITCH_AA_SL_Msk | HSIOM_V2_AMUX_SPLIT_CTL_SWITCH_AA_SR_Msk | diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_connectivity.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_routing.h similarity index 93% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_connectivity.h rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_routing.h index a8554f2843..76a886ce97 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_connectivity.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_4343W/GeneratedSource/cycfg_routing.h @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.h +* File Name: cycfg_routing.h * * Description: * Establishes all necessary connections between hardware elements. @@ -22,16 +22,16 @@ * limitations under the License. ********************************************************************************/ -#if !defined(CYCFG_CONNECTIVITY_H) -#define CYCFG_CONNECTIVITY_H +#if !defined(CYCFG_ROUTING_H) +#define CYCFG_ROUTING_H #if defined(__cplusplus) extern "C" { #endif #include "cycfg_notices.h" -void init_cycfg_connectivity(void); - +void init_cycfg_routing(void); +#define init_cycfg_connectivity() init_cycfg_routing() #define ioss_0_port_11_pin_1_HSIOM P11_1_TCPWM1_LINE_COMPL1 #define ioss_0_port_11_pin_2_HSIOM P11_2_SMIF_SPI_SELECT0 #define ioss_0_port_11_pin_3_HSIOM P11_3_SMIF_SPI_DATA3 @@ -73,4 +73,4 @@ void init_cycfg_connectivity(void); #endif -#endif /* CYCFG_CONNECTIVITY_H */ +#endif /* CYCFG_ROUTING_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.c index cf7ac0229a..74c28aba2c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.c @@ -30,5 +30,5 @@ void init_cycfg_all(void) init_cycfg_peripherals(); init_cycfg_pins(); init_cycfg_platform(); - init_cycfg_connectivity(); + init_cycfg_routing(); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.h index 68bb40bf09..ac6033d2bd 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg.h @@ -34,7 +34,7 @@ extern "C" { #include "cycfg_peripherals.h" #include "cycfg_pins.h" #include "cycfg_platform.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" void init_cycfg_all(void); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_pins.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_pins.h index 39f5ff9f5e..874eac99dc 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_pins.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_pins.h @@ -27,7 +27,7 @@ #include "cycfg_notices.h" #include "cy_gpio.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #if defined(__cplusplus) extern "C" { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.c index 9e81fbf418..9cd3f7692b 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.c @@ -119,7 +119,7 @@ __STATIC_INLINE void Cy_SysClk_IloInit() __STATIC_INLINE void Cy_SysClk_ClkLfInit() { /* The WDT is unlocked in the default startup code */ - Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO); + Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO); } __STATIC_INLINE void Cy_SysClk_ClkPath0Init() { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.h index 8db1d577b5..391f01a0be 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_platform.h @@ -35,7 +35,7 @@ extern "C" { #endif -#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32000 +#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32768 #define CY_CFG_PWR_VDDA_MV 3300 #define CY_CFG_PWR_VDDD_MV 3300 #define CY_CFG_PWR_VBACKUP_MV 3300 diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_connectivity.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_routing.c similarity index 93% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_connectivity.c rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_routing.c index d4beee5fd1..a1dadb2d0b 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_connectivity.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_routing.c @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.c +* File Name: cycfg_routing.c * * Description: * Establishes all necessary connections between hardware elements. @@ -22,11 +22,11 @@ * limitations under the License. ********************************************************************************/ -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_device_headers.h" -void init_cycfg_connectivity(void) +void init_cycfg_routing(void) { HSIOM->AMUX_SPLIT_CTL[2] = HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_Msk | HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SR_Msk | diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_connectivity.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_routing.h similarity index 70% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_connectivity.h rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_routing.h index ad5cb15c79..92fbc92d25 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_connectivity.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_BLE/GeneratedSource/cycfg_routing.h @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.h +* File Name: cycfg_routing.h * * Description: * Establishes all necessary connections between hardware elements. @@ -22,43 +22,43 @@ * limitations under the License. ********************************************************************************/ -#if !defined(CYCFG_CONNECTIVITY_H) -#define CYCFG_CONNECTIVITY_H +#if !defined(CYCFG_ROUTING_H) +#define CYCFG_ROUTING_H #if defined(__cplusplus) extern "C" { #endif #include "cycfg_notices.h" -void init_cycfg_connectivity(void); - +void init_cycfg_routing(void); +#define init_cycfg_connectivity() init_cycfg_routing() #define ioss_0_port_11_pin_2_HSIOM P11_2_SMIF_SPI_SELECT0 #define ioss_0_port_11_pin_3_HSIOM P11_3_SMIF_SPI_DATA3 #define ioss_0_port_11_pin_4_HSIOM P11_4_SMIF_SPI_DATA2 #define ioss_0_port_11_pin_5_HSIOM P11_5_SMIF_SPI_DATA1 #define ioss_0_port_11_pin_6_HSIOM P11_6_SMIF_SPI_DATA0 #define ioss_0_port_11_pin_7_HSIOM P11_7_SMIF_SPI_CLK -#define ioss_0_port_1_pin_0_HSIOM HSIOM_SEL_AMUXB +#define ioss_0_port_1_pin_0_HSIOM HSIOM_SEL_AMUXA #define ioss_0_port_5_pin_1_HSIOM P5_1_SCB5_UART_TX #define ioss_0_port_6_pin_0_HSIOM P6_0_SCB3_I2C_SCL #define ioss_0_port_6_pin_1_HSIOM P6_1_SCB3_I2C_SDA #define ioss_0_port_6_pin_4_HSIOM P6_4_CPUSS_SWJ_SWO_TDO #define ioss_0_port_6_pin_6_HSIOM P6_6_CPUSS_SWJ_SWDIO_TMS #define ioss_0_port_6_pin_7_HSIOM P6_7_CPUSS_SWJ_SWCLK_TCLK -#define ioss_0_port_7_pin_1_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_7_pin_2_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_7_pin_7_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_1_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_2_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_3_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_4_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_5_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_6_HSIOM HSIOM_SEL_AMUXB -#define ioss_0_port_8_pin_7_HSIOM HSIOM_SEL_AMUXB +#define ioss_0_port_7_pin_1_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_7_pin_2_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_7_pin_7_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_1_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_2_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_3_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_4_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_5_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_6_HSIOM HSIOM_SEL_AMUXA +#define ioss_0_port_8_pin_7_HSIOM HSIOM_SEL_AMUXA #if defined(__cplusplus) } #endif -#endif /* CYCFG_CONNECTIVITY_H */ +#endif /* CYCFG_ROUTING_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.c index cf7ac0229a..74c28aba2c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.c @@ -30,5 +30,5 @@ void init_cycfg_all(void) init_cycfg_peripherals(); init_cycfg_pins(); init_cycfg_platform(); - init_cycfg_connectivity(); + init_cycfg_routing(); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.h index faa061e3c2..1709481df2 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg.h @@ -35,7 +35,7 @@ extern "C" { #include "cycfg_peripherals.h" #include "cycfg_pins.h" #include "cycfg_platform.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" void init_cycfg_all(void); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_peripherals.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_peripherals.h index 2170ac28c6..beadadac39 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_peripherals.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_peripherals.h @@ -34,7 +34,7 @@ #include "cy_mcwdt.h" #include "cy_rtc.h" #include "cy_tcpwm_pwm.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_usbfs_dev_drv.h" #if defined(__cplusplus) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_pins.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_pins.h index 776325ec01..7496d6069e 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_pins.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_pins.h @@ -27,7 +27,7 @@ #include "cycfg_notices.h" #include "cy_gpio.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #if defined(__cplusplus) extern "C" { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.c index 8f247b0267..306a16a389 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.c @@ -152,7 +152,7 @@ __STATIC_INLINE void Cy_SysClk_IloInit() __STATIC_INLINE void Cy_SysClk_ClkLfInit() { /* The WDT is unlocked in the default startup code */ - Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO); + Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO); } __STATIC_INLINE void Cy_SysClk_ClkPath0Init() { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.h index 4feda6f95f..76dfbef7bc 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_platform.h @@ -35,7 +35,7 @@ extern "C" { #endif -#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32000 +#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32768 #define CY_CFG_PWR_VDDA_MV 3300 #define CY_CFG_PWR_VDDD_MV 3300 #define CY_CFG_PWR_VBACKUP_MV 3300 diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_connectivity.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_routing.c similarity index 86% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_connectivity.c rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_routing.c index 12ffa2a389..8a1e655157 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_connectivity.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_routing.c @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.c +* File Name: cycfg_routing.c * * Description: * Establishes all necessary connections between hardware elements. @@ -22,7 +22,7 @@ * limitations under the License. ********************************************************************************/ -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_trigmux.h" @@ -30,16 +30,16 @@ #include "cy_device_headers.h" -void init_cycfg_connectivity(void) +void init_cycfg_routing(void) { - Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT0, TRIG0_OUT_CPUSS_DW0_TR_IN0, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT3, TRIG0_OUT_CPUSS_DW0_TR_IN1, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB0, TRIG14_OUT_TR_GROUP1_INPUT47, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB1, TRIG14_OUT_TR_GROUP0_INPUT46, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB3, TRIG14_OUT_TR_GROUP0_INPUT43, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB7, TRIG14_OUT_TR_GROUP1_INPUT49, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG1_IN_TR_GROUP14_OUTPUT4, TRIG1_OUT_CPUSS_DW1_TR_IN1, false, TRIGGER_TYPE_LEVEL); - Cy_TrigMux_Connect(TRIG1_IN_TR_GROUP14_OUTPUT6, TRIG1_OUT_CPUSS_DW1_TR_IN3, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT3, TRIG0_OUT_CPUSS_DW0_TR_IN0, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT4, TRIG0_OUT_CPUSS_DW0_TR_IN1, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB0, TRIG14_OUT_TR_GROUP1_INPUT44, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB1, TRIG14_OUT_TR_GROUP0_INPUT47, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB3, TRIG14_OUT_TR_GROUP0_INPUT46, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG14_IN_UDB_TR_UDB7, TRIG14_OUT_TR_GROUP1_INPUT43, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG1_IN_TR_GROUP14_OUTPUT0, TRIG1_OUT_CPUSS_DW1_TR_IN3, false, TRIGGER_TYPE_LEVEL); + Cy_TrigMux_Connect(TRIG1_IN_TR_GROUP14_OUTPUT1, TRIG1_OUT_CPUSS_DW1_TR_IN1, false, TRIGGER_TYPE_LEVEL); HSIOM->AMUX_SPLIT_CTL[2] = HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_Msk | HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SR_Msk | HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_Msk | diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_connectivity.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_routing.h similarity index 88% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_connectivity.h rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_routing.h index cf3efa8aa3..9d9b019eae 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_connectivity.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_062_WIFI_BT/GeneratedSource/cycfg_routing.h @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.h +* File Name: cycfg_routing.h * * Description: * Establishes all necessary connections between hardware elements. @@ -22,16 +22,16 @@ * limitations under the License. ********************************************************************************/ -#if !defined(CYCFG_CONNECTIVITY_H) -#define CYCFG_CONNECTIVITY_H +#if !defined(CYCFG_ROUTING_H) +#define CYCFG_ROUTING_H #if defined(__cplusplus) extern "C" { #endif #include "cycfg_notices.h" -void init_cycfg_connectivity(void); - +void init_cycfg_routing(void); +#define init_cycfg_connectivity() init_cycfg_routing() #define ioss_0_port_11_pin_1_HSIOM P11_1_TCPWM1_LINE_COMPL1 #define ioss_0_port_11_pin_2_HSIOM P11_2_SMIF_SPI_SELECT0 #define ioss_0_port_11_pin_3_HSIOM P11_3_SMIF_SPI_DATA3 @@ -73,17 +73,17 @@ void init_cycfg_connectivity(void); #define cpuss_0_dw1_0_chan_1_tr_in_0_TRIGGER_OUT TRIG1_OUT_CPUSS_DW1_TR_IN1 #define cpuss_0_dw1_0_chan_3_tr_in_0_TRIGGER_OUT TRIG1_OUT_CPUSS_DW1_TR_IN3 #define udb_0_out_p_116_TRIGGER_IN_0 TRIG14_IN_UDB_TR_UDB0 -#define udb_0_out_p_116_TRIGGER_IN_1 TRIG1_IN_TR_GROUP14_OUTPUT4 -#define udb_0_out_p_117_TRIGGER_IN_0 TRIG0_IN_TR_GROUP14_OUTPUT3 +#define udb_0_out_p_116_TRIGGER_IN_1 TRIG1_IN_TR_GROUP14_OUTPUT1 +#define udb_0_out_p_117_TRIGGER_IN_0 TRIG0_IN_TR_GROUP14_OUTPUT4 #define udb_0_out_p_117_TRIGGER_IN_1 TRIG14_IN_UDB_TR_UDB1 -#define udb_0_out_p_119_TRIGGER_IN_0 TRIG0_IN_TR_GROUP14_OUTPUT0 +#define udb_0_out_p_119_TRIGGER_IN_0 TRIG0_IN_TR_GROUP14_OUTPUT3 #define udb_0_out_p_119_TRIGGER_IN_1 TRIG14_IN_UDB_TR_UDB3 #define udb_0_out_p_123_TRIGGER_IN_0 TRIG14_IN_UDB_TR_UDB7 -#define udb_0_out_p_123_TRIGGER_IN_1 TRIG1_IN_TR_GROUP14_OUTPUT6 +#define udb_0_out_p_123_TRIGGER_IN_1 TRIG1_IN_TR_GROUP14_OUTPUT0 #if defined(__cplusplus) } #endif -#endif /* CYCFG_CONNECTIVITY_H */ +#endif /* CYCFG_ROUTING_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.c index cf7ac0229a..74c28aba2c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.c @@ -30,5 +30,5 @@ void init_cycfg_all(void) init_cycfg_peripherals(); init_cycfg_pins(); init_cycfg_platform(); - init_cycfg_connectivity(); + init_cycfg_routing(); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.h index 68bb40bf09..ac6033d2bd 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg.h @@ -34,7 +34,7 @@ extern "C" { #include "cycfg_peripherals.h" #include "cycfg_pins.h" #include "cycfg_platform.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" void init_cycfg_all(void); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_peripherals.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_peripherals.h index 9ab7fdc86c..2a1bfa380e 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_peripherals.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_peripherals.h @@ -35,7 +35,7 @@ #include "cy_mcwdt.h" #include "cy_rtc.h" #include "cy_tcpwm_pwm.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #if defined(__cplusplus) extern "C" { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_pins.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_pins.h index b8b6546bfb..d0709a2adc 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_pins.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_pins.h @@ -27,7 +27,7 @@ #include "cycfg_notices.h" #include "cy_gpio.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #if defined(__cplusplus) extern "C" { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.c index 9c14fabc8c..f0edc010bc 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.c @@ -86,7 +86,7 @@ __WEAK void cycfg_ClockStartupError(uint32_t error) } __STATIC_INLINE void Cy_SysClk_ClkBakInit() { - Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_CLKLF); + Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_WCO); } __STATIC_INLINE void Cy_SysClk_ClkFastInit() { @@ -129,7 +129,7 @@ __STATIC_INLINE void Cy_SysClk_IloInit() __STATIC_INLINE void Cy_SysClk_ClkLfInit() { /* The WDT is unlocked in the default startup code */ - Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO); + Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO); } __STATIC_INLINE void Cy_SysClk_ClkPath0Init() { @@ -175,12 +175,7 @@ void init_cycfg_platform(void) /* Set worst case memory wait states (! ultra low power, 150 MHz), will update at the end */ Cy_SysLib_SetWaitStates(false, 150UL); #if (CY_CFG_PWR_VBAC_SUPPLY == CY_CFG_PWR_VBAC_SUPPLY_VDD) - if (0u == Cy_SysLib_GetResetReason() /* POR, XRES, or BOD */) - { - Cy_SysLib_ResetBackupDomain(); - Cy_SysClk_IloDisable(); - Cy_SysClk_IloInit(); - } + if (0u == Cy_SysLib_GetResetReason() /* POR, XRES, or BOD */){ Cy_SysLib_ResetBackupDomain(); } #endif #ifdef CY_CFG_PWR_ENABLED /* Configure power mode */ @@ -215,9 +210,6 @@ void init_cycfg_platform(void) Cy_SysClk_FllDisable(); Cy_SysClk_ClkPathSetSource(CY_SYSCLK_CLKHF_IN_CLKPATH0, CY_SYSCLK_CLKPATH_IN_IMO); Cy_SysClk_ClkHfSetSource(0UL, CY_SYSCLK_CLKHF_IN_CLKPATH0); - #ifdef CY_IP_MXBLESS - (void)Cy_BLE_EcoReset(); - #endif #ifdef CY_CFG_SYSCLK_PLL1_AVAILABLE (void)Cy_SysClk_PllDisable(CY_SYSCLK_CLKHF_IN_CLKPATH2); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.h index 9778631b74..aa4aeb6159 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_platform.h @@ -34,7 +34,7 @@ extern "C" { #endif -#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32000 +#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32768 #define CY_CFG_PWR_VDDA_MV 3300 #define CY_CFG_PWR_VDDD_MV 3300 #define CY_CFG_PWR_VBACKUP_MV 3300 diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_connectivity.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_routing.c similarity index 93% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_connectivity.c rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_routing.c index c389562da2..ae79008829 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_connectivity.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_routing.c @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.c +* File Name: cycfg_routing.c * * Description: * Establishes all necessary connections between hardware elements. @@ -22,11 +22,11 @@ * limitations under the License. ********************************************************************************/ -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_device_headers.h" -void init_cycfg_connectivity(void) +void init_cycfg_routing(void) { HSIOM->AMUX_SPLIT_CTL[2] = HSIOM_V2_AMUX_SPLIT_CTL_SWITCH_AA_SL_Msk | HSIOM_V2_AMUX_SPLIT_CTL_SWITCH_AA_SR_Msk | diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_connectivity.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_routing.h similarity index 93% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_connectivity.h rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_routing.h index ff31e17f1e..191672e599 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_connectivity.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CMOD_062_4343W/TARGET_CY8CPROTO_062_4343W/GeneratedSource/cycfg_routing.h @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.h +* File Name: cycfg_routing.h * * Description: * Establishes all necessary connections between hardware elements. @@ -22,16 +22,16 @@ * limitations under the License. ********************************************************************************/ -#if !defined(CYCFG_CONNECTIVITY_H) -#define CYCFG_CONNECTIVITY_H +#if !defined(CYCFG_ROUTING_H) +#define CYCFG_ROUTING_H #if defined(__cplusplus) extern "C" { #endif #include "cycfg_notices.h" -void init_cycfg_connectivity(void); - +void init_cycfg_routing(void); +#define init_cycfg_connectivity() init_cycfg_routing() #define ioss_0_port_11_pin_1_HSIOM P11_1_TCPWM0_LINE_COMPL1 #define ioss_0_port_11_pin_2_HSIOM P11_2_SMIF_SPI_SELECT0 #define ioss_0_port_11_pin_3_HSIOM P11_3_SMIF_SPI_DATA3 @@ -72,4 +72,4 @@ void init_cycfg_connectivity(void); #endif -#endif /* CYCFG_CONNECTIVITY_H */ +#endif /* CYCFG_ROUTING_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.c index cf7ac0229a..74c28aba2c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.c @@ -30,5 +30,5 @@ void init_cycfg_all(void) init_cycfg_peripherals(); init_cycfg_pins(); init_cycfg_platform(); - init_cycfg_connectivity(); + init_cycfg_routing(); } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.h index faa061e3c2..1709481df2 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg.h @@ -35,7 +35,7 @@ extern "C" { #include "cycfg_peripherals.h" #include "cycfg_pins.h" #include "cycfg_platform.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" void init_cycfg_all(void); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_peripherals.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_peripherals.h index 6104f938c3..404b85be4a 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_peripherals.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_peripherals.h @@ -34,7 +34,7 @@ #include "cy_mcwdt.h" #include "cy_rtc.h" #include "cy_tcpwm_pwm.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_usbfs_dev_drv.h" #if defined(__cplusplus) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_pins.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_pins.h index 68fce9d2dd..f5e0b37d47 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_pins.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_pins.h @@ -27,7 +27,7 @@ #include "cycfg_notices.h" #include "cy_gpio.h" -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #if defined(__cplusplus) extern "C" { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.c index 341b5d7da8..877af05d9c 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.c @@ -104,7 +104,7 @@ __STATIC_INLINE void Cy_SysClk_ClkAltSysTickInit() } __STATIC_INLINE void Cy_SysClk_ClkBakInit() { - Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_CLKLF); + Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_WCO); } __STATIC_INLINE void Cy_SysClk_EcoInit() { @@ -166,7 +166,7 @@ __STATIC_INLINE void Cy_SysClk_IloInit() __STATIC_INLINE void Cy_SysClk_ClkLfInit() { /* The WDT is unlocked in the default startup code */ - Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_ILO); + Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO); } __STATIC_INLINE void Cy_SysClk_ClkPath0Init() { diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.h index 4feda6f95f..76dfbef7bc 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_platform.h @@ -35,7 +35,7 @@ extern "C" { #endif -#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32000 +#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32768 #define CY_CFG_PWR_VDDA_MV 3300 #define CY_CFG_PWR_VDDD_MV 3300 #define CY_CFG_PWR_VBACKUP_MV 3300 diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_connectivity.c b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_routing.c similarity index 95% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_connectivity.c rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_routing.c index daf39a82a4..ce54f0f125 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_connectivity.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_routing.c @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.c +* File Name: cycfg_routing.c * * Description: * Establishes all necessary connections between hardware elements. @@ -22,7 +22,7 @@ * limitations under the License. ********************************************************************************/ -#include "cycfg_connectivity.h" +#include "cycfg_routing.h" #include "cy_trigmux.h" @@ -30,7 +30,7 @@ #include "cy_device_headers.h" -void init_cycfg_connectivity(void) +void init_cycfg_routing(void) { Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT0, TRIG0_OUT_CPUSS_DW0_TR_IN0, false, TRIGGER_TYPE_LEVEL); Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT5, TRIG0_OUT_CPUSS_DW0_TR_IN1, false, TRIGGER_TYPE_LEVEL); diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_connectivity.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_routing.h similarity index 95% rename from targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_connectivity.h rename to targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_routing.h index cc92c76813..8b3a102733 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_connectivity.h +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CYW943012P6EVB_01/GeneratedSource/cycfg_routing.h @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: cycfg_connectivity.h +* File Name: cycfg_routing.h * * Description: * Establishes all necessary connections between hardware elements. @@ -22,16 +22,16 @@ * limitations under the License. ********************************************************************************/ -#if !defined(CYCFG_CONNECTIVITY_H) -#define CYCFG_CONNECTIVITY_H +#if !defined(CYCFG_ROUTING_H) +#define CYCFG_ROUTING_H #if defined(__cplusplus) extern "C" { #endif #include "cycfg_notices.h" -void init_cycfg_connectivity(void); - +void init_cycfg_routing(void); +#define init_cycfg_connectivity() init_cycfg_routing() #define ioss_0_port_11_pin_2_HSIOM P11_2_SMIF_SPI_SELECT0 #define ioss_0_port_11_pin_3_HSIOM P11_3_SMIF_SPI_DATA3 #define ioss_0_port_11_pin_4_HSIOM P11_4_SMIF_SPI_DATA2 @@ -90,4 +90,4 @@ void init_cycfg_connectivity(void); #endif -#endif /* CYCFG_CONNECTIVITY_H */ +#endif /* CYCFG_ROUTING_H */ From c0a6e9588ada0ce22a276d0f4c2027badbb9334d Mon Sep 17 00:00:00 2001 From: Oren Cohen Date: Tue, 19 Feb 2019 20:45:36 +0200 Subject: [PATCH 090/109] Add config header to assembly compilation ARMC6 was not including mbed_config.h when compiling assembly files --- tools/toolchains/arm.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tools/toolchains/arm.py b/tools/toolchains/arm.py index dd87038aa0..874f488dc0 100644 --- a/tools/toolchains/arm.py +++ b/tools/toolchains/arm.py @@ -481,14 +481,13 @@ class ARMC6(ARM_STD): def get_compile_options(self, defines, includes, for_asm=False): opts = ['-D%s' % d for d in defines] opts.extend(["-I%s" % i for i in includes if i]) + config_header = self.get_config_header() + if config_header: + opts.extend(self.get_config_option(config_header)) if for_asm: return ["--cpreproc", "--cpreproc_opts=%s" % ",".join(self.flags['common'] + opts)] - else: - config_header = self.get_config_header() - if config_header: - opts.extend(self.get_config_option(config_header)) - return opts + return opts @hook_tool def assemble(self, source, object, includes): From 2a7f5e21afe93b6ca395a6e69aa78bf6bf0cac27 Mon Sep 17 00:00:00 2001 From: Kevin Bracey Date: Tue, 5 Feb 2019 11:49:34 +0200 Subject: [PATCH 091/109] nRF52 serial: Tighten/simplify atomics Use new atomics (exchange, load, store and bool types) to simplify and improve the atomics in the nRF52 serial HAL. * Ensure mutexes are released last and atomically when done done inside a critical section. * Compare-and-swap is not required for the spinlock - exchange is sufficient. (Not clear a spinlock is needed anyway, but left in). * Remove unneeded volatile, and make mutexes bool. --- .../TARGET_NRF5x/TARGET_NRF52/serial_api.c | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c index dbfd41f749..4ac70d7e03 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c @@ -138,8 +138,8 @@ typedef struct { uint8_t buffer[NUMBER_OF_BANKS][DMA_BUFFER_SIZE]; uint32_t usage_counter; uint8_t tx_data; - volatile uint8_t tx_in_progress; - volatile uint8_t rx_in_progress; + bool tx_in_progress; + bool rx_in_progress; bool tx_asynch; bool rx_asynch; bool callback_posted; @@ -252,7 +252,7 @@ static void nordic_nrf5_uart_callback_handler(uint32_t instance) static void nordic_nrf5_uart_event_handler_endtx(int instance) { /* Release mutex. As the owner this call is safe. */ - nordic_nrf5_uart_state[instance].tx_in_progress = 0; + core_util_atomic_store_bool(&nordic_nrf5_uart_state[instance].tx_in_progress, false); /* Check if callback handler and Tx event mask is set. */ uart_irq_handler callback = (uart_irq_handler) nordic_nrf5_uart_state[instance].owner->handler; @@ -275,8 +275,8 @@ static void nordic_nrf5_uart_event_handler_endtx(int instance) static void nordic_nrf5_uart_event_handler_endtx_asynch(int instance) { /* Set Tx done and reset Tx mode to be not asynchronous. */ - nordic_nrf5_uart_state[instance].tx_in_progress = 0; nordic_nrf5_uart_state[instance].tx_asynch = false; + core_util_atomic_store_bool(&nordic_nrf5_uart_state[instance].tx_in_progress, false); /* Cast handler to callback function pointer. */ void (*callback)(void) = (void (*)(void)) nordic_nrf5_uart_state[instance].owner->tx_handler; @@ -482,8 +482,8 @@ static void nordic_nrf5_uart_event_handler_rxstarted(int instance) static void nordic_nrf5_uart_event_handler_endrx_asynch(int instance) { /* Set Rx done and reset Rx mode to be not asynchronous. */ - nordic_nrf5_uart_state[instance].rx_in_progress = 0; nordic_nrf5_uart_state[instance].rx_asynch = false; + core_util_atomic_store_bool(&nordic_nrf5_uart_state[instance].rx_in_progress, false); /* Cast handler to callback function pointer. */ void (*callback)(void) = (void (*)(void)) nordic_nrf5_uart_state[instance].owner->rx_handler; @@ -1410,7 +1410,7 @@ int serial_writable(serial_t *obj) int instance = uart_object->instance; - return ((nordic_nrf5_uart_state[instance].tx_in_progress == 0) && + return (!core_util_atomic_load_bool(&nordic_nrf5_uart_state[instance].tx_in_progress) && (nrf_uarte_event_extra_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY))); } @@ -1449,16 +1449,14 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx /** * tx_in_progress acts like a mutex to ensure only one transmission can be active at a time. - * The flag is modified using the atomic compare-and-set function. + * The flag is modified using the atomic exchange function - only proceed when we see the + * flag clear and we set it to true. */ - bool mutex = false; + bool old_mutex; do { - uint8_t expected = 0; - uint8_t desired = 1; - - mutex = core_util_atomic_cas_u8((uint8_t *) &nordic_nrf5_uart_state[instance].tx_in_progress, &expected, desired); - } while (mutex == false); + old_mutex = core_util_atomic_exchange_bool(&nordic_nrf5_uart_state[instance].tx_in_progress, true); + } while (old_mutex == true); /* State variables. */ int result = 0; @@ -1575,16 +1573,14 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt /** * rx_in_progress acts like a mutex to ensure only one asynchronous reception can be active at a time. - * The flag is modified using the atomic compare-and-set function. + * The flag is modified using the atomic exchange function - only proceed when we see the + * flag clear and we set it to true. */ - bool mutex = false; + bool old_mutex; do { - uint8_t expected = 0; - uint8_t desired = 1; - - mutex = core_util_atomic_cas_u8((uint8_t *) &nordic_nrf5_uart_state[instance].rx_in_progress, &expected, desired); - } while (mutex == false); + old_mutex = core_util_atomic_exchange_bool(&nordic_nrf5_uart_state[instance].rx_in_progress, true); + } while (old_mutex == true); /* Store callback handler, mask and reset event value. */ obj->serial.rx_handler = handler; @@ -1663,8 +1659,8 @@ void serial_tx_abort_asynch(serial_t *obj) nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDTX); /* Reset Tx flags. */ - nordic_nrf5_uart_state[instance].tx_in_progress = 0; nordic_nrf5_uart_state[instance].tx_asynch = false; + nordic_nrf5_uart_state[instance].tx_in_progress = false; /* Force reconfiguration. */ obj->serial.update = true; @@ -1691,8 +1687,8 @@ void serial_rx_abort_asynch(serial_t *obj) core_util_critical_section_enter(); /* Reset Rx flags. */ - nordic_nrf5_uart_state[obj->serial.instance].rx_in_progress = 0; nordic_nrf5_uart_state[obj->serial.instance].rx_asynch = false; + nordic_nrf5_uart_state[obj->serial.instance].rx_in_progress = false; obj->serial.rx_asynch = false; /* Force reconfiguration. */ From 79d8b3a9c2c9625a1876066443818d681aa4fa95 Mon Sep 17 00:00:00 2001 From: Volodymyr Medvid Date: Wed, 20 Feb 2019 12:29:23 +0200 Subject: [PATCH 092/109] PSOC6: fix port_write API Fix port_write API to correctly shift the passed value. This allows the reference application provided in PortOut docs to work corectly with arbitrary LED_MASK. https://os.mbed.com/docs/mbed-os/v5.11/apis/portout.html The fix applies to both PSOC6 and PSOC6_FUTURE HAL implementations. --- targets/TARGET_Cypress/TARGET_PSOC6/port_api.c | 2 +- targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/port_api.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/port_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/port_api.c index b1d849fd9c..ddcc0bc5d5 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/port_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/port_api.c @@ -109,8 +109,8 @@ void port_write(port_t *obj, int value) for (pin = 0; pin < 8; ++pin) { if (obj->mask & (1 << pin)) { Cy_GPIO_Write(obj->port, pin, value & 0x1); - value >>= 1; } + value >>= 1; } } } diff --git a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/port_api.c b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/port_api.c index 5e124dd5b4..9fce69a494 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/port_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6_FUTURE/port_api.c @@ -105,8 +105,8 @@ void port_write(port_t *obj, int value) for (pin = 0; pin < 8; ++pin) { if (obj->mask & (1 << pin)) { Cy_GPIO_Write(obj->port, pin, value & 0x1); - value >>= 1; } + value >>= 1; } } } From f329c7bf709922c5829b1cac42c068390ff2a1d4 Mon Sep 17 00:00:00 2001 From: Conrad Braam Date: Wed, 20 Feb 2019 13:54:38 +0000 Subject: [PATCH 093/109] adv builder helper now returns an object --- features/FEATURE_BLE/ble/gap/AdvertisingDataSimpleBuilder.h | 1 + 1 file changed, 1 insertion(+) diff --git a/features/FEATURE_BLE/ble/gap/AdvertisingDataSimpleBuilder.h b/features/FEATURE_BLE/ble/gap/AdvertisingDataSimpleBuilder.h index 9c529f4a09..0358672e5b 100644 --- a/features/FEATURE_BLE/ble/gap/AdvertisingDataSimpleBuilder.h +++ b/features/FEATURE_BLE/ble/gap/AdvertisingDataSimpleBuilder.h @@ -158,6 +158,7 @@ public: AdvertisingDataSimpleBuilder &setAdvertisingInterval(adv_interval_t interval) { MBED_ASSERT(_builder.setAdvertisingInterval(interval) == BLE_ERROR_NONE); + return *this; } /** From 8fa17b8f3f8ad51de8cf558c0cf061ed550e3f43 Mon Sep 17 00:00:00 2001 From: Martin Kojtal Date: Wed, 20 Feb 2019 09:24:12 +0000 Subject: [PATCH 094/109] license: use .md extension Using Github feature to show markdown documents. --- LICENSE => LICENSE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE.md (100%) diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md From 9f049138be1ee4cfa3a34eb76c3d77cb5d7bb893 Mon Sep 17 00:00:00 2001 From: kegilbert Date: Wed, 20 Feb 2019 17:52:28 -0600 Subject: [PATCH 095/109] Change EventFlag timeout paramter Matches rest of RTOS class timeout parameters by using the unit name. Remove ambigious statement in reference to 0 ms being no-timeout as a timeout of 0 causes the function to not block and return immediately (osWaitForever is used as no timeout as it will wait forever) --- rtos/EventFlags.cpp | 12 ++++++------ rtos/EventFlags.h | 14 +++++++------- rtos/Mail.h | 2 +- rtos/Mutex.h | 4 ++-- rtos/Queue.h | 2 +- rtos/Semaphore.h | 2 +- rtos/ThisThread.h | 4 ++-- rtos/Thread.h | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/rtos/EventFlags.cpp b/rtos/EventFlags.cpp index 3d6b79321f..faa3057e3b 100644 --- a/rtos/EventFlags.cpp +++ b/rtos/EventFlags.cpp @@ -62,14 +62,14 @@ uint32_t EventFlags::get() const return osEventFlagsGet(_id); } -uint32_t EventFlags::wait_all(uint32_t flags, uint32_t timeout, bool clear) +uint32_t EventFlags::wait_all(uint32_t flags, uint32_t millisec, bool clear) { - return wait(flags, osFlagsWaitAll, timeout, clear); + return wait(flags, osFlagsWaitAll, millisec, clear); } -uint32_t EventFlags::wait_any(uint32_t flags, uint32_t timeout, bool clear) +uint32_t EventFlags::wait_any(uint32_t flags, uint32_t millisec, bool clear) { - return wait(flags, osFlagsWaitAny, timeout, clear); + return wait(flags, osFlagsWaitAny, millisec, clear); } EventFlags::~EventFlags() @@ -77,13 +77,13 @@ EventFlags::~EventFlags() osEventFlagsDelete(_id); } -uint32_t EventFlags::wait(uint32_t flags, uint32_t opt, uint32_t timeout, bool clear) +uint32_t EventFlags::wait(uint32_t flags, uint32_t opt, uint32_t millisec, bool clear) { if (clear == false) { opt |= osFlagsNoClear; } - return osEventFlagsWait(_id, flags, opt, timeout); + return osEventFlagsWait(_id, flags, opt, millisec); } } diff --git a/rtos/EventFlags.h b/rtos/EventFlags.h index a448807459..bac58ea588 100644 --- a/rtos/EventFlags.h +++ b/rtos/EventFlags.h @@ -87,23 +87,23 @@ public: /** Wait for all of the specified event flags to become signaled. @param flags the flags to wait for (default: 0 -- no flags). - @param timeout timeout value or 0 in case of no time-out (default: osWaitForever). + @param millisec timeout value (default: osWaitForever). @param clear clear specified event flags after waiting for them (default: true). @return event flags before clearing or error code if highest bit set (see @a osFlagsError for details). - @note You may call this function from ISR context if the timeout parameter is set to 0. + @note You may call this function from ISR context if the millisec parameter is set to 0. */ - uint32_t wait_all(uint32_t flags = 0, uint32_t timeout = osWaitForever, bool clear = true); + uint32_t wait_all(uint32_t flags = 0, uint32_t millisec = osWaitForever, bool clear = true); /** Wait for any of the specified event flags to become signaled. @param flags the flags to wait for (default: 0 -- no flags). - @param timeout timeout value or 0 in case of no timeout (default: osWaitForever). + @param millisec timeout value (default: osWaitForever). @param clear clear specified event flags after waiting for them (default: true). @return event flags before clearing or error code if highest bit set (see @a osFlagsError for details). - @note This function may be called from ISR context if the timeout parameter is set to 0. + @note This function may be called from ISR context if the millisec parameter is set to 0. */ - uint32_t wait_any(uint32_t flags = 0, uint32_t timeout = osWaitForever, bool clear = true); + uint32_t wait_any(uint32_t flags = 0, uint32_t millisec = osWaitForever, bool clear = true); /** EventFlags destructor. @@ -113,7 +113,7 @@ public: private: void constructor(const char *name = NULL); - uint32_t wait(uint32_t flags, uint32_t opt, uint32_t timeout, bool clear); + uint32_t wait(uint32_t flags, uint32_t opt, uint32_t millisec, bool clear); osEventFlagsId_t _id; mbed_rtos_storage_event_flags_t _obj_mem; }; diff --git a/rtos/Mail.h b/rtos/Mail.h index 4f8cc7cac1..70f6380d98 100644 --- a/rtos/Mail.h +++ b/rtos/Mail.h @@ -131,7 +131,7 @@ public: /** Get a mail from the queue. * - * @param millisec Timeout value or 0 in case of no timeout (default: osWaitForever). + * @param millisec Timeout value (default: osWaitForever). * * @return Event that contains mail information or error code. * @retval osEventMessage Message received. diff --git a/rtos/Mutex.h b/rtos/Mutex.h index a364b1c8dc..a4955a54c6 100644 --- a/rtos/Mutex.h +++ b/rtos/Mutex.h @@ -95,7 +95,7 @@ public: @deprecated Do not use this function. This function has been replaced with lock(), trylock() and trylock_for() functions. - @param millisec timeout value or 0 in case of no time-out. + @param millisec timeout value. @return status code that indicates the execution status of the function: @a osOK the mutex has been obtained. @a osErrorTimeout the mutex could not be obtained in the given time. @@ -117,7 +117,7 @@ public: bool trylock(); /** Try to lock the mutex for a specified time - @param millisec timeout value or 0 in case of no time-out. + @param millisec timeout value. @return true if the mutex was acquired, false otherwise. @note the underlying RTOS may have a limit to the maximum wait time due to internal 32-bit computations, but this is guaranteed to work if the diff --git a/rtos/Queue.h b/rtos/Queue.h index d204a75696..ff258915bf 100644 --- a/rtos/Queue.h +++ b/rtos/Queue.h @@ -167,7 +167,7 @@ public: * share the same priority level, they are retrieved in first-in, first-out * (FIFO) order. * - * @param millisec Timeout value or 0 in case of no time-out. + * @param millisec Timeout value. * (default: osWaitForever). * * @return Event information that includes the message in event. Message diff --git a/rtos/Semaphore.h b/rtos/Semaphore.h index 0bcd788de9..49e0f1e833 100644 --- a/rtos/Semaphore.h +++ b/rtos/Semaphore.h @@ -60,7 +60,7 @@ public: Semaphore(int32_t count, uint16_t max_count); /** Wait until a Semaphore resource becomes available. - @param millisec timeout value or 0 in case of no time-out. (default: osWaitForever). + @param millisec timeout value. (default: osWaitForever). @return number of available tokens, before taking one; or -1 in case of incorrect parameters @note You may call this function from ISR context if the millisec parameter is set to 0. diff --git a/rtos/ThisThread.h b/rtos/ThisThread.h index c0104fc1e0..ed12fd406c 100644 --- a/rtos/ThisThread.h +++ b/rtos/ThisThread.h @@ -105,7 +105,7 @@ uint32_t flags_wait_any(uint32_t flags, bool clear = true); /** Wait for all of the specified Thread Flags to become signaled for the current thread. @param flags specifies the flags to wait for - @param millisec timeout value or 0 in case of no time-out. + @param millisec timeout value. @param clear whether to clear the specified flags after waiting for them. (default: true) @return actual thread flags before clearing, which may not satisfy the wait @note You cannot call this function from ISR context. @@ -129,7 +129,7 @@ uint32_t flags_wait_all_until(uint32_t flags, uint64_t millisec, bool clear = tr /** Wait for any of the specified Thread Flags to become signaled for the current thread. @param flags specifies the flags to wait for - @param millisec timeout value or 0 in case of no time-out. + @param millisec timeout value. @param clear whether to clear the specified flags after waiting for them. (default: true) @return actual thread flags before clearing, which may not satisfy the wait @note You cannot call this function from ISR context. diff --git a/rtos/Thread.h b/rtos/Thread.h index 34933e8bc2..34da08aa24 100644 --- a/rtos/Thread.h +++ b/rtos/Thread.h @@ -414,7 +414,7 @@ public: /** Wait for one or more Thread Flags to become signaled for the current RUNNING thread. @param signals wait until all specified signal flags are set or 0 for any single signal flag. - @param millisec timeout value or 0 in case of no time-out. (default: osWaitForever). + @param millisec timeout value. (default: osWaitForever). @return event flag information or error code. @note if @a millisec is set to 0 and flag is no set the event carries osOK value. @note You cannot call this function from ISR context. From b87ee6ca73ccb5ee582951fc33b7adf2ab755fe0 Mon Sep 17 00:00:00 2001 From: Guillermo Alonso Date: Wed, 20 Feb 2019 12:10:53 +0100 Subject: [PATCH 096/109] Added new target RHOMBIO_L476DMW1K --- .../PeripheralNames.h | 98 +++++ .../TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c | 380 ++++++++++++++++++ .../TARGET_RHOMBIO_L476DMW1K/PinNames.h | 373 +++++++++++++++++ .../TARGET_RHOMBIO_L476DMW1K/system_clock.c | 370 +++++++++++++++++ targets/targets.json | 35 ++ 5 files changed, 1256 insertions(+) create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h new file mode 100644 index 0000000000..a68464b809 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h @@ -0,0 +1,98 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2015, 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_PERIPHERALNAMES_H +#define MBED_PERIPHERALNAMES_H + +#include "cmsis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + ADC_1 = (int)ADC1_BASE, + ADC_2 = (int)ADC2_BASE, + ADC_3 = (int)ADC3_BASE +} ADCName; + +typedef enum { + DAC_1 = (int)DAC_BASE +} DACName; + +typedef enum { + UART_1 = (int)USART1_BASE, + UART_2 = (int)USART2_BASE, + UART_3 = (int)USART3_BASE, + UART_4 = (int)UART4_BASE, + UART_5 = (int)UART5_BASE, + LPUART_1 = (int)LPUART1_BASE +} UARTName; + +//#define STDIO_UART_TX PA_2 +//#define STDIO_UART_RX PA_3 +//#define STDIO_UART UART_2 + +typedef enum { + SPI_1 = (int)SPI1_BASE, + SPI_2 = (int)SPI2_BASE, + SPI_3 = (int)SPI3_BASE +} SPIName; + +typedef enum { + I2C_1 = (int)I2C1_BASE, + I2C_2 = (int)I2C2_BASE, + I2C_3 = (int)I2C3_BASE +} I2CName; + +typedef enum { + PWM_1 = (int)TIM1_BASE, + PWM_2 = (int)TIM2_BASE, + PWM_3 = (int)TIM3_BASE, + PWM_4 = (int)TIM4_BASE, + PWM_5 = (int)TIM5_BASE, + PWM_8 = (int)TIM8_BASE, + PWM_15 = (int)TIM15_BASE, + PWM_16 = (int)TIM16_BASE, + PWM_17 = (int)TIM17_BASE +} PWMName; + +typedef enum { + CAN_1 = (int)CAN1_BASE +} CANName; + +typedef enum { + QSPI_1 = (int)QSPI_R_BASE, +} QSPIName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c new file mode 100644 index 0000000000..06eb43ccaa --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c @@ -0,0 +1,380 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2018, 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. + ******************************************************************************* + */ + +#include "PeripheralPins.h" +#include "mbed_toolchain.h" + +//============================================================================== +// Notes +// +// - The pins mentioned Px_y_ALTz are alternative possibilities which use other +// HW peripheral instances. You can use them the same way as any other "normal" +// pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board +// pinout image on mbed.org. +// +// - The pins which are other components present on the board have +// the comment "Connected to xxx". The pin function may not work properly in this +// case. These pins may not be displayed on the board pinout image on mbed.org. +// Please read the board reference manual and schematic for more information. +// +// - Warning: pins the default STDIO_UART_TX and STDIO_UART_RX pins are commented +// See https://os.mbed.com/teams/ST/wiki/STDIO for more information. +// +//============================================================================== + + +//*** ADC *** + +MBED_WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // rhomb.io AD0 + {PA_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // rhomb.io AD0 + {PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // rhomb.io AD1 + {PA_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // rhomb.io AD1 + {PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // rhomb.io UART-A_TXD + {PA_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // rhomb.io UART-A_TXD + {PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // rhomb.io UART-A_RXD + {PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // rhomb.io UART-A_RXD + {PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // rhomb.io AD2 + {PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // rhomb.io AD2 + {PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // rhomb.io SPIA_CLK + {PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // rhomb.io SPIA_CLK + {PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 // rhomb.io SPIA_MISO + {PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // rhomb.io SPIA_MISO + {PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 // rhomb.io SPIA_MOSI + {PA_7_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // rhomb.io SPIA_MOSI + {PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 // rhomb.io AD3 + {PB_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 // rhomb.io AD3 + {PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16 // rhomb.io NMI + {PB_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC2_IN16 // rhomb.io NMI + {PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // rhomb.io AD5 + {PC_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // rhomb.io AD5 + {PC_0_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // rhomb.io AD5 + {PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // rhomb.io AD4 + {PC_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // rhomb.io AD4 + {PC_1_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // rhomb.io AD4 + {PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // rhomb.io CAPT1 (R19 must be populated) + {PC_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 // rhomb.io CAPT1 (R19 must be populated) + {PC_2_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 // rhomb.io CAPT1 (R19 must be populated) + {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // rhomb.io CAPT0 (R18 must be populated) + {PC_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // rhomb.io CAPT0 (R18 must be populated) + {PC_3_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 // rhomb.io CAPT0 (R18 must be populated) + {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // rhomb.io AD8 + {PC_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // rhomb.io AD8 + {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 // rhomb.io AD7 + {PC_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // rhomb.io AD7 + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_ADC_Internal[] = { + {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, + {ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, + {ADC_VBAT, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, + {NC, NC, 0} +}; + +//*** DAC *** + +MBED_WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 // rhomb.io AD2 + {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 // rhomb.io SPIA_CLK + {NC, NC, 0} +}; + +//*** I2C *** + +MBED_WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // rhomb.io INT1 + {PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // rhomb.io I2C-A_SDA // Connected to ATECC608A + {PB_11, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // rhomb.io QSPI_CS0 / + {PB_14, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // rhomb.io SPI-A_CS1 + {PC_1, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // rhomb.io AD4 + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // rhomb.io SPI-A_CS0 + {PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // rhomb.io I2C-A_SCL // Connected to ATECC608A + {PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // rhomb.io IO2 + {PB_13, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // rhomb.io SPI-A_CS2 + {PC_0, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // rhomb.io AD5 + {NC, NC, 0} +}; + +//*** PWM *** + +// TIM5 cannot be used because already used by the us_ticker +MBED_WEAK const PinMap PinMap_PWM[] = { + {PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // rhomb.io AD0 +// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // rhomb.io AD0 + {PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // rhomb.io AD1 +// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 // rhomb.io AD1 + {PA_1_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N // rhomb.io AD1 + {PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // rhomb.io UART-A_TXD +// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // rhomb.io UART-A_TXD + {PA_2_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 // rhomb.io UART-A_TXD + {PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // rhomb.io UART-A_RXD +// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // rhomb.io UART-A_RXD + {PA_3_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 // rhomb.io UART-A_RXD + {PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // rhomb.io SPI-A_CLK + {PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // rhomb.io SPI-A_CLK + {PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // rhomb.io SPI-A_MISO + {PA_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // rhomb.io SPI-A_MISO + {PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // rhomb.io SPI-A_MOSI + {PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // rhomb.io SPI-A_MOSI + {PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // rhomb.io SPI-A_MOSI + {PA_7_ALT2, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // rhomb.io SPI-A_MOSI + {PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // rhomb.io IO3 + {PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // rhomb.io IO4 + {PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // rhomb.io OTG_ID + {PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // rhomb.io OTG_N + {PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // rhomb.io INT2 + {PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // rhomb.io AD3 + {PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // rhomb.io AD3 + {PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // rhomb.io AD3 + {PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // rhomb.io NMI + {PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // rhomb.io NMI + {PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // rhomb.io NMI + {PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // rhomb.io INT0 + {PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // rhomb.io IO1 + {PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // rhomb.io IO0 + {PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // rhomb.io SPI-A_CS0 + {PB_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 1)}, // TIM16_CH1N // rhomb.io SPI-A_CS0 + {PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // rhomb.io INT1 + {PB_7_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 1)}, // TIM17_CH1N // rhomb.io INT1 + {PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // rhomb.io I2C-A_SCL + {PB_8_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // rhomb.io I2C-A_SCL + {PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // rhomb.io I2C-A_SDA + {PB_9_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // rhomb.io I2C-A_SDA + {PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // rhomb.io IO2 + {PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // rhomb.io QSPI_CS0 + {PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // rhomb.io SPI-A_CS2 + {PB_13_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N // rhomb.io SPI-A_CS2 + {PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // rhomb.io SPI-A_CS1 + {PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // rhomb.io SPI-A_CS1 + {PB_14_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 // rhomb.io SPI-A_CS1 + {PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // rhomb.io IO7 + {PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // rhomb.io IO7 + {PB_15_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 // rhomb.io IO7 + {PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // rhomb.io PWM3 + {PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 // rhomb.io PWM3 + {PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // rhomb.io PWM0 + {PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // rhomb.io PWM0 + {PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // rhomb.io SDIO_DATA0 + {PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 // rhomb.io SDIO_DATA0 + {PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // rhomb.io SDIO_DATA1 + {PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 // rhomb.io SDIO_DATA1 + {PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // rhomb.io IO12 + {PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // rhomb.io IO13 + {PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // rhomb.io PWM2 + {PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // rhomb.io SDIO_CDN + {PE_0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // rhomb.io RESET_OUT + {PE_1, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // rhomb.io USB_SWITCH + {PE_3, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // rhomb.io SAI-A_SDO + {PE_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // rhomb.io SAI-A_LRCLK + {PE_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // rhomb.io SAI-A_BCLK + {PE_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // rhomb.io SAI-A_SDI + {PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // rhomb.io IO5 + {PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // rhomb.io PWM1 + {PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // rhomb.io QSPI_CLK + {PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // rhomb.io QSPI_MEM_CS + {PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // rhomb.io QSPI_IO0 + {PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // rhomb.io QSPI_IO1 + {PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // rhomb.io QSPI_IO2 + {NC, NC, 0} +}; + +//*** SERIAL *** + +MBED_WEAK const PinMap PinMap_UART_TX[] = { + {PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // rhomb.io AD0 + {PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io UART-A_TXD + {PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io IO4 + {PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io SPI-A_CS0 + {PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io IO2 + {PB_11, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // rhomb.io QSPI_CS0 + {PC_1, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // rhomb.io AD4 + {PC_4, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io COMP-A_N + {PC_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SDIO_DATA2 + {PC_10_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // rhomb.io SDIO_DATA2 + {PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // rhomb.io SDIO_CLK + {PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io UART-B_TXD + {PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io UART-C_TXD + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_UART_RX[] = { + {PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // rhomb.io AD1 + {PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io UART-A_RXD + {PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io OTG_ID + {PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io INT1 + {PB_10, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // rhomb.io IO2 + {PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SPI_CS0 + {PC_0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // rhomb.io AD5 + {PC_5, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io COMP-A_P + {PC_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SDIO_DATA3 + {PC_11_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // rhomb.io SDIO_DATA3 + {PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // rhomb.io SDIO_CMD + {PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io UART-B_RXD + {PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io UART-C_RXD + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io AD1 + {PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io OTG_P + {PA_15, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // rhomb.io INT2 + {PB_1, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io NMI + {PB_3, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io INT0 + {PB_4, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // rhomb.io IO1 + {PB_12, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // rhomb.io 1WIRE // Connected to DS28E05X + {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SPI-A_CS1 + {PD_2, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SDIO_CMD + {PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io UART-A_RTS + {PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io IO12 + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io AD0 + {PA_6, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SPI-A_MISO + {PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io OTG_N + {PB_4, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // rhomb.io IO1 + {PB_5, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // rhomb.io IO0 + {PB_7, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // rhomb.io INT1 + {PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io SPI-A_CS2 + {PB_13_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // rhomb.io SPI-A_CS2 + {PD_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // rhomb.io UART-A_CTS + {PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // rhomb.io IO11 + {NC, NC, 0} +}; + +//*** SPI *** + +MBED_WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io SPI-A_MOSI + {PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io IO0 + {PB_5_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io IO0 + {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io IO7 + {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io IO14 + {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io SDIO_CLK + {PD_4, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io UART-A_RTS + {PE_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io QSPI_IO3 + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io SPI-A_MISO + {PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io IO1 + {PB_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io IO1 + {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io SPI-A_CS1 + {PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io IO15 + {PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io SDIO_DATA3 + {PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io UART-A_CTS + {PE_14, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io QSPI_IO2 + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io SPI-A_CLK + {PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io INT0 + {PB_3_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io INT0 + {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io IO2 + {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io SPI-A_CS2 + {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io SDIO_DATA2 + {PD_1, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io CAN-A_TX + {PE_13, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io QSPI_IO1 + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io AD2 + {PA_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io AD2 + {PA_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io INT2 + {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // rhomb.io INT2 + {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io I2C-A_SDA + {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io 1WIRE // Connected to DS28E05X + {PD_0, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // rhomb.io CAN-A_RX + {PE_12, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // rhomb.io QSPI_IO0 + {NC, NC, 0} +}; + +//*** CAN *** + +MBED_WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // rhomb.io OTG_N + {PB_8, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // rhomb.io I2C-A_SCL + {PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // rhomb.io CAN-A_RX + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // rhomb.io OTG_P + {PB_9, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // rhomb.io I2C-A_SDA + {PD_1, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // rhomb.io CAN-A_TX + {NC, NC, 0} +}; + +//*** QUADSPI *** + +MBED_WEAK const PinMap PinMap_QSPI_DATA0[] = { + {PB_1, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 // rhomb.io NMI + {PE_12, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 // rhomb.io QSPI_IO0 // Connected to W25Q128JVPIQ + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_DATA1[] = { + {PB_0, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 // rhomb.io AD3 + {PE_13, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 // rhomb.io QSPI_IO1 // Connected to W25Q128JVPIQ + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_DATA2[] = { + {PA_7, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 // rhomb.io SPI_A_MOSI + {PE_14, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 // rhomb.io QSPI_IO2 // Connected to W25Q128JVPIQ + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_DATA3[] = { + {PA_6, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 // rhomb.io SPI_A_MISO + {PE_15, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 // rhomb.io QSPI_IO3 // Connected to W25Q128JVPIQ + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_SCLK[] = { + {PB_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK // rhomb.io IO2 + {PE_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK // rhomb.io QSPI_CLK // Connected to W25Q128JVPIQ + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_SSEL[] = { + {PB_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS // rhomb.io QSPI_CS0 + {PE_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS // rhomb.io QSPI_MEM_CS // Connected to W25Q128JVPIQ + {NC, NC, 0} +}; diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h new file mode 100644 index 0000000000..a245841779 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h @@ -0,0 +1,373 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2018, 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 { + ALT0 = 0x100, + ALT1 = 0x200, + ALT2 = 0x300, + ALT3 = 0x400 +} ALTx; + +typedef enum { + PA_0 = 0x00, + PA_0_ALT0 = PA_0 | ALT0, + PA_1 = 0x01, + PA_1_ALT0 = PA_1 | ALT0, + PA_2 = 0x02, + PA_2_ALT0 = PA_2 | ALT0, + PA_3 = 0x03, + PA_3_ALT0 = PA_3 | ALT0, + PA_4 = 0x04, + PA_4_ALT0 = PA_4 | ALT0, + PA_5 = 0x05, + PA_5_ALT0 = PA_5 | ALT0, + PA_6 = 0x06, + PA_6_ALT0 = PA_6 | ALT0, + PA_7 = 0x07, + PA_7_ALT0 = PA_7 | ALT0, + PA_7_ALT1 = PA_7 | ALT1, + PA_7_ALT2 = PA_7 | ALT2, + PA_8 = 0x08, + PA_9 = 0x09, + PA_10 = 0x0A, + PA_11 = 0x0B, + PA_12 = 0x0C, + PA_13 = 0x0D, + PA_14 = 0x0E, + PA_15 = 0x0F, + PA_15_ALT0 = PA_15 | ALT0, + + PB_0 = 0x10, + PB_0_ALT0 = PB_0 | ALT0, + PB_0_ALT1 = PB_0 | ALT1, + PB_1 = 0x11, + PB_1_ALT0 = PB_1 | ALT0, + PB_1_ALT1 = PB_1 | ALT1, + PB_2 = 0x12, + PB_3 = 0x13, + PB_3_ALT0 = PB_3 | ALT0, + PB_4 = 0x14, + PB_4_ALT0 = PB_4 | ALT0, + PB_5 = 0x15, + PB_5_ALT0 = PB_5 | ALT0, + PB_6 = 0x16, + PB_6_ALT0 = PB_6 | ALT0, + PB_7 = 0x17, + PB_7_ALT0 = PB_7 | ALT0, + PB_8 = 0x18, + PB_8_ALT0 = PB_8 | ALT0, + PB_9 = 0x19, + PB_9_ALT0 = PB_9 | ALT0, + PB_10 = 0x1A, + PB_11 = 0x1B, + PB_12 = 0x1C, + PB_13 = 0x1D, + PB_13_ALT0 = PB_13 | ALT0, + PB_14 = 0x1E, + PB_14_ALT0 = PB_14 | ALT0, + PB_14_ALT1 = PB_14 | ALT1, + PB_15 = 0x1F, + PB_15_ALT0 = PB_15 | ALT0, + PB_15_ALT1 = PB_15 | ALT1, + + PC_0 = 0x20, + PC_0_ALT0 = PC_0 | ALT0, + PC_0_ALT1 = PC_0 | ALT1, + PC_1 = 0x21, + PC_1_ALT0 = PC_1 | ALT0, + PC_1_ALT1 = PC_1 | ALT1, + PC_2 = 0x22, + PC_2_ALT0 = PC_2 | ALT0, + PC_2_ALT1 = PC_2 | ALT1, + PC_3 = 0x23, + PC_3_ALT0 = PC_3 | ALT0, + PC_3_ALT1 = PC_3 | ALT1, + PC_4 = 0x24, + PC_4_ALT0 = PC_4 | ALT0, + PC_5 = 0x25, + PC_5_ALT0 = PC_5 | ALT0, + PC_6 = 0x26, + PC_6_ALT0 = PC_6 | ALT0, + PC_7 = 0x27, + PC_7_ALT0 = PC_7 | ALT0, + PC_8 = 0x28, + PC_8_ALT0 = PC_8 | ALT0, + PC_9 = 0x29, + PC_9_ALT0 = PC_9 | ALT0, + PC_10 = 0x2A, + PC_10_ALT0 = PC_10 | ALT0, + PC_11 = 0x2B, + PC_11_ALT0 = PC_11 | ALT0, + 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, + + PH_0 = 0x70, + PH_1 = 0x71, + + // ADC internal channels + ADC_TEMP = 0xF0, + ADC_VREF = 0xF1, + ADC_VBAT = 0xF2, + + // STDIO for console print +/*#ifdef MBED_CONF_TARGET_STDIO_UART_TX + STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX, +#else + STDIO_UART_TX = PC_4, +#endif +#ifdef MBED_CONF_TARGET_STDIO_UART_RX + STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX, +#else + STDIO_UART_RX = PC_5, +#endif*/ + + STDIO_UART_TX = PC_4, + STDIO_UART_RX = PC_5, + + // Generic signals namings + LED1 = PC_7, // LED Green + LED2 = PC_7, // LED Green + + USER_BUTTON = PB_1, + // Standardized button names + BUTTON1 = USER_BUTTON, + + SERIAL_TX = STDIO_UART_TX, + SERIAL_RX = STDIO_UART_RX, + USBTX = STDIO_UART_TX, + USBRX = STDIO_UART_RX, + + I2C_SCL = PB_8, + I2C_SDA = PB_9, + SPI_MOSI = PA_7, + SPI_MISO = PA_6, + SPI_SCK = PA_5, + SPI_CS = PB_6, + PWM_OUT = PC_7, + + /**** USB pins ****/ + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_FS_ID = PA_10, + + /**** OSCILLATOR pins ****/ + RCC_OSC32_IN = PC_14, + RCC_OSC32_OUT = PC_15, + RCC_OSC_IN = PH_0, + RCC_OSC_OUT = PH_1, + + /**** DEBUG pins ****/ + SYS_JTCK_SWCLK = PA_14, + SYS_JTDI = PA_15, + SYS_JTDO_SWO = PB_3, + SYS_JTMS_SWDIO = PA_13, + SYS_JTRST = PB_4, +/* SYS_PVD_IN = PB_7, + SYS_TRACECLK = PE_2, + SYS_TRACED0 = PE_3, + SYS_TRACED1 = PE_4, + SYS_TRACED2 = PE_5, + SYS_TRACED3 = PE_6, + SYS_WKUP1 = PA_0, + SYS_WKUP2 = PC_13, + SYS_WKUP3 = PE_6, + SYS_WKUP4 = PA_2, + SYS_WKUP5 = PC_5,*/ + + /**** QSPI FLASH pins ****/ + QSPI_FLASH1_IO0 = PE_12, + QSPI_FLASH1_IO1 = PE_13, + QSPI_FLASH1_IO2 = PE_14, + QSPI_FLASH1_IO3 = PE_15, + QSPI_FLASH1_SCK = PE_10, + QSPI_FLASH1_CSN = PE_11, + + // rhomb.io system namings //......................... + NMI = PB_1, + INT0 = PB_3, + INT1 = PB_7, + INT2 = PA_15, + + IO0 = PB_5, + IO1 = PB_4, + IO2 = PB_10, + IO3 = PA_8, + IO4 = PA_9, + IO5 = PE_8, + IO6 = PE_7, + IO7 = PB_15, + + IO8 = PC_13, + IO9 = PD_7, + IO10 = PD_10, + IO11 = PD_11, + IO12 = PD_12, + IO13 = PD_13, + IO14 = PC_3, + IO15 = PC_2, + + //LED0 = PC_7, + + PWM0 = PC_7, + PWM1 = PE_9, + PWM2 = PD_14, + PWM3 = PC_6, + PWM4 = PB_2, + + UART_A_RXD = PA_3, + UART_A_TXD = PA_2, + UART_A_CTS = PD_3, + UART_A_RTS = PD_4, + + UART_B_RXD = PD_6, + UART_B_TXD = PD_5, + + UART_C_RXD = PD_9, + UART_C_TXD = PD_8, + + I2C_A_SDA = PB_9, + I2C_A_SCL = PB_8, + I2C_B_SDA = PB_14, // R14 must be populated/closed (default is open) + I2C_B_SCL = PB_13, // R15 must be populated/closed (default is open) + + SPI_A_MOSI = PA_7, + SPI_A_MISO = PA_6, + SPI_A_CLK = PA_5, + SPI_A_CS0 = PB_6, + SPI_A_CS1 = PB_14, + SPI_A_CS2 = PB_13, + + QSPI_IO0 = PE_12, + QSPI_IO1 = PE_13, + QSPI_IO2 = PE_14, + QSPI_IO3 = PE_15, + QSPI_CLK = PE_10, + QSPI_CS0 = PB_11, + QSPI_MEM_CS = PE_11, + + _1WIRE = PB_12, + CAN_A_RX = PD_0, + CAN_A_TX = PD_1, + + SDIO_DATAO = PC_8, + SDIO_DATA1 = PC_9, + SDIO_DATA2 = PC_10, + SDIO_DATA3 = PC_11, + SDIO_CLK = PC_12, + SDIO_CMD = PD_2, + SDIO_CDN = PD_15, + + SAI_A_BCLK = PE_5, + SAI_A_LRCLK = PE_4, + SAI_A_SDI = PE_6, + SAI_A_SDO = PE_3, + SAI_A_MCLK = PE_2, + + OTG_P = PA_12, + OTG_N = PA_11, + OTG_ID = PA_10, + + AD0 = PA_0, + AD1 = PA_1, + AD2 = PA_4, + AD3 = PB_0, + AD4 = PC_1, + AD5 = PC_0, + //AD6 not used + AD7 = PC_5, + AD8 = PC_4, + + COMP_A_P = PC_5, + COMP_A_N = PC_4, + + CAPT0 = PC_3, // R18 must be populated/closed (default is open) + CAPT1 = PC_2, // R19 must be populated/closed (default is open) + + SWDIO = PA_13, + SWCLK = PA_14, + + RSTOUT = PE_0, + + // Not connected + NC = (int)0xFFFFFFFF + +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c new file mode 100644 index 0000000000..585c434d34 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c @@ -0,0 +1,370 @@ +/* mbed Microcontroller Library +* Copyright (c) 2006-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. +*/ + +/** + * This file configures the system clock as follows: + *----------------------------------------------------------------------------- + * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock) + * | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal) + * | 3- USE_PLL_HSI (internal 16 MHz) + * | 4- USE_PLL_MSI (internal 100kHz to 48 MHz) + *----------------------------------------------------------------------------- + * SYSCLK(MHz) | 80 + * AHBCLK (MHz) | 80 + * APB1CLK (MHz) | 80 + * APB2CLK (MHz) | 80 + * USB capable | YES + *----------------------------------------------------------------------------- +**/ + +#include "stm32l4xx.h" +#include "nvic_addr.h" +#include "mbed_error.h" + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ + + +// clock source is selected with CLOCK_SOURCE in json config +#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO - not enabled by default) +#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board - not provided by default) +#define USE_PLL_HSI 0x2 // Use HSI internal clock +#define USE_PLL_MSI 0x1 // Use MSI internal clock + +#define DEBUG_MCO (0) // Output the MCO on PA8 for debugging (0=OFF, 1=SYSCLK, 2=HSE, 3=HSI, 4=MSI) + +#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) ) +uint8_t SetSysClock_PLL_HSE(uint8_t bypass); +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */ + +#if ((CLOCK_SOURCE) & USE_PLL_HSI) +uint8_t SetSysClock_PLL_HSI(void); +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */ + +#if ((CLOCK_SOURCE) & USE_PLL_MSI) +uint8_t SetSysClock_PLL_MSI(void); +#endif /* ((CLOCK_SOURCE) & USE_PLL_MSI) */ + + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */ +#endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= (uint32_t)0xEAF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS; /* Vector Table Relocation in Internal FLASH */ +#endif + +} + + +/** + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ + +void SetSysClock(void) +{ +#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) + /* 1- Try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(1) == 0) +#endif + { +#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) + /* 2- If fail try to start with HSE and external xtal */ + if (SetSysClock_PLL_HSE(0) == 0) +#endif + { +#if ((CLOCK_SOURCE) & USE_PLL_HSI) + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == 0) +#endif + { +#if ((CLOCK_SOURCE) & USE_PLL_MSI) + /* 4- If fail start with MSI clock */ + if (SetSysClock_PLL_MSI() == 0) +#endif + { + { + error("SetSysClock failed\n"); + } + } + } + } + } + + // Output clock on MCO1 pin(PA8) for debugging purpose +#if DEBUG_MCO == 1 + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); +#endif +} + +#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) ) +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSE(uint8_t bypass) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit = {0}; + + // Used to gain time after DeepSleep in case HSI is used + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { + return 0; + } + + // Select MSI as system clock source to allow modification of the PLL configuration + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); + + // Enable HSE oscillator and activate PLL with HSE as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI; + if (bypass == 0) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN + } + RCC_OscInitStruct.HSIState = RCC_HSI_OFF; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // 8 MHz + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLM = 1; // VCO input clock = 8 MHz (8 MHz / 1) + RCC_OscInitStruct.PLL.PLLN = 20; // VCO output clock = 160 MHz (8 MHz * 20) + RCC_OscInitStruct.PLL.PLLP = 7; // PLLSAI3 clock = 22 MHz (160 MHz / 7) + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; // PLL clock = 80 MHz (160 MHz / 2) + + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // 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 + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { + return 0; // FAIL + } + + RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + RCC_PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1M = 1; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1N = 12; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK; + if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK) { + return 0; // FAIL + } + + // Disable MSI Oscillator + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.MSIState = RCC_MSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + // Output clock on MCO1 pin(PA8) for debugging purpose +#if DEBUG_MCO == 2 + if (bypass == 0) { + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz + } else { + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz + } +#endif + + return 1; // OK +} +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */ + +#if ((CLOCK_SOURCE) & USE_PLL_HSI) +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSI(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit = {0}; + + // Select MSI as system clock source to allow modification of the PLL configuration + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); + + // Enable HSI oscillator and activate PLL with HSI as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; // 16 MHz + RCC_OscInitStruct.PLL.PLLM = 2; // VCO input clock = 8 MHz (16 MHz / 2) + RCC_OscInitStruct.PLL.PLLN = 20; // VCO output clock = 160 MHz (8 MHz * 20) + RCC_OscInitStruct.PLL.PLLP = 7; // PLLSAI3 clock = 22 MHz (160 MHz / 7) + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; // PLL clock = 80 MHz (160 MHz / 2) + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // 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 + 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 + } + + RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + RCC_PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSI; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1M = 2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1N = 12; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK; + if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK) { + return 0; // FAIL + } + + // Disable MSI Oscillator + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.MSIState = RCC_MSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + // 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 +#endif + + return 1; // OK +} +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */ + +#if ((CLOCK_SOURCE) & USE_PLL_MSI) +/******************************************************************************/ +/* PLL (clocked by MSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_MSI(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + +#if MBED_CONF_TARGET_LSE_AVAILABLE + // Enable LSE Oscillator to automatically calibrate the MSI clock + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update + RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + /* Enable the CSS interrupt in case LSE signal is corrupted or not present */ + HAL_RCCEx_DisableLSECSS(); +#endif /* MBED_CONF_TARGET_LSE_AVAILABLE */ + + /* Enable MSI Oscillator and activate PLL with MSI as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + 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; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 6; /* 8 MHz */ + RCC_OscInitStruct.PLL.PLLN = 40; /* 320 MHz */ + RCC_OscInitStruct.PLL.PLLP = 7; /* 45 MHz */ + RCC_OscInitStruct.PLL.PLLQ = 4; /* 80 MHz */ + RCC_OscInitStruct.PLL.PLLR = 4; /* 80 MHz */ + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + +#if MBED_CONF_TARGET_LSE_AVAILABLE + /* Enable MSI Auto-calibration through LSE */ + HAL_RCCEx_EnableMSIPLLMode(); +#endif /* MBED_CONF_TARGET_LSE_AVAILABLE */ + + /* Select MSI output as USB clock source */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI; /* 48 MHz */ + 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 */ + 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 + } + + // 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 +#endif + + return 1; // OK +} +#endif /* ((CLOCK_SOURCE) & USE_PLL_MSI) */ \ No newline at end of file diff --git a/targets/targets.json b/targets/targets.json index d1286ffea5..f39d40bce2 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -3950,6 +3950,41 @@ "device_name": "STM32L476VG", "bootloader_supported": true }, + "RHOMBIO_L476DMW1K": { + "components_add": ["FLASHIAP"], + "inherits": ["FAMILY_STM32"], + "core": "Cortex-M4F", + "extra_labels_add": ["STM32L4", "STM32L476xG", "STM32L476VG"], + "config": { + "clock_source": { + "help": "Mask value : USE_PLL_HSE_EXTC (need HW patch) | USE_PLL_HSE_XTAL (need HW patch) | USE_PLL_HSI | USE_PLL_MSI", + "value": "USE_PLL_MSI", + "macro_name": "CLOCK_SOURCE" + }, + "lpticker_lptim": { + "help": "This target supports LPTIM. Set value 1 to use LPTIM for LPTICKER, or 0 to use RTC wakeup timer", + "value": 1 + } + }, + "overrides": { "lpticker_delay_ticks": 4 }, + "detect_code": ["1500"], + "macros_add": [ + "MBED_TICKLESS", + "USBHOST_OTHER", + "TWO_RAM_REGIONS" + ], + "device_has_add": [ + "ANALOGOUT", + "CAN", + "SERIAL_FC", + "TRNG", + "FLASH", + "MPU" + ], + "release_versions": ["2", "5"], + "device_name": "STM32L476VG", + "bootloader_supported": true + }, "MTS_MDOT_F405RG": { "inherits": ["FAMILY_STM32"], "core": "Cortex-M4F", From 3c223d95baf86c7c00833c688f77abced4e01932 Mon Sep 17 00:00:00 2001 From: Guillermo Alonso Date: Wed, 20 Feb 2019 17:48:07 +0100 Subject: [PATCH 097/109] added licence identifier texts --- .../TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h | 2 ++ .../TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c | 2 ++ .../TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h index a68464b809..a98f3bfbdd 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h @@ -1,4 +1,6 @@ /* mbed Microcontroller Library + +* SPDX-License-Identifier: Apache-2.0 ******************************************************************************* * Copyright (c) 2015, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c index 06eb43ccaa..da79b829ad 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c @@ -1,4 +1,6 @@ /* mbed Microcontroller Library + +* SPDX-License-Identifier: Apache-2.0 ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h index a245841779..d6c784fdaa 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h @@ -1,4 +1,6 @@ /* mbed Microcontroller Library + +* SPDX-License-Identifier: Apache-2.0 ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. From c31635fa059b79c3d0433f8d7e5bf87d4cfff8d9 Mon Sep 17 00:00:00 2001 From: Guillermo Alonso Date: Thu, 21 Feb 2019 11:55:41 +0100 Subject: [PATCH 098/109] Change in license identifier, removed commented dead code Change in license identifier Removed commented dead code Removed some tab space --- .../PeripheralNames.h | 10 ++---- .../TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c | 4 +-- .../TARGET_RHOMBIO_L476DMW1K/PinNames.h | 34 +++---------------- .../TARGET_RHOMBIO_L476DMW1K/system_clock.c | 4 ++- 4 files changed, 13 insertions(+), 39 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h index a98f3bfbdd..7d462c0ffe 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralNames.h @@ -1,7 +1,7 @@ /* mbed Microcontroller Library - -* SPDX-License-Identifier: Apache-2.0 - ******************************************************************************* + * + * SPDX-License-Identifier: BSD-3-Clause + ********************************************************1*********************** * Copyright (c) 2015, STMicroelectronics * All rights reserved. * @@ -57,10 +57,6 @@ typedef enum { LPUART_1 = (int)LPUART1_BASE } UARTName; -//#define STDIO_UART_TX PA_2 -//#define STDIO_UART_RX PA_3 -//#define STDIO_UART UART_2 - typedef enum { SPI_1 = (int)SPI1_BASE, SPI_2 = (int)SPI2_BASE, diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c index da79b829ad..982c0e2afa 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PeripheralPins.c @@ -1,6 +1,6 @@ /* mbed Microcontroller Library - -* SPDX-License-Identifier: Apache-2.0 + * + * SPDX-License-Identifier: BSD-3-Clause ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h index d6c784fdaa..f7266a20da 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/PinNames.h @@ -1,6 +1,6 @@ /* mbed Microcontroller Library - -* SPDX-License-Identifier: Apache-2.0 + * + * SPDX-License-Identifier: BSD-3-Clause ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. @@ -185,24 +185,13 @@ typedef enum { ADC_VBAT = 0xF2, // STDIO for console print -/*#ifdef MBED_CONF_TARGET_STDIO_UART_TX - STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX, -#else - STDIO_UART_TX = PC_4, -#endif -#ifdef MBED_CONF_TARGET_STDIO_UART_RX - STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX, -#else - STDIO_UART_RX = PC_5, -#endif*/ - STDIO_UART_TX = PC_4, STDIO_UART_RX = PC_5, // Generic signals namings LED1 = PC_7, // LED Green LED2 = PC_7, // LED Green - + USER_BUTTON = PB_1, // Standardized button names BUTTON1 = USER_BUTTON, @@ -237,17 +226,6 @@ typedef enum { SYS_JTDO_SWO = PB_3, SYS_JTMS_SWDIO = PA_13, SYS_JTRST = PB_4, -/* SYS_PVD_IN = PB_7, - SYS_TRACECLK = PE_2, - SYS_TRACED0 = PE_3, - SYS_TRACED1 = PE_4, - SYS_TRACED2 = PE_5, - SYS_TRACED3 = PE_6, - SYS_WKUP1 = PA_0, - SYS_WKUP2 = PC_13, - SYS_WKUP3 = PE_6, - SYS_WKUP4 = PA_2, - SYS_WKUP5 = PC_5,*/ /**** QSPI FLASH pins ****/ QSPI_FLASH1_IO0 = PE_12, @@ -280,8 +258,6 @@ typedef enum { IO13 = PD_13, IO14 = PC_3, IO15 = PC_2, - - //LED0 = PC_7, PWM0 = PC_7, PWM1 = PE_9, @@ -348,11 +324,11 @@ typedef enum { AD3 = PB_0, AD4 = PC_1, AD5 = PC_0, - //AD6 not used + // AD6 not used AD7 = PC_5, AD8 = PC_4, - COMP_A_P = PC_5, + COMP_A_P = PC_5, COMP_A_N = PC_4, CAPT0 = PC_3, // R18 must be populated/closed (default is open) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c index 585c434d34..c5daf4963e 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L476xG/TARGET_RHOMBIO_L476DMW1K/system_clock.c @@ -1,5 +1,7 @@ /* mbed Microcontroller Library -* Copyright (c) 2006-2017 ARM Limited +* Copyright (c) 2006-2019 ARM Limited +* +* SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 49d5a4a57fd756641323d622daaad16c8c568bd3 Mon Sep 17 00:00:00 2001 From: Ashok Rao Date: Wed, 20 Feb 2019 14:40:39 +0000 Subject: [PATCH 099/109] Adding STM32_L475 as a new MTB target --- .../TARGET_MTB_STM_L475/PeripheralNames.h | 94 +++++ .../TARGET_MTB_STM_L475/PeripheralPins.c | 368 +++++++++++++++++ .../TARGET_MTB_STM_L475/PinNames.h | 321 +++++++++++++++ .../TARGET_MTB_STM_L475/system_clock.c | 370 ++++++++++++++++++ targets/targets.json | 29 ++ 5 files changed, 1182 insertions(+) create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h create mode 100644 targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h new file mode 100644 index 0000000000..04b09f6539 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h @@ -0,0 +1,94 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2017, 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_PERIPHERALNAMES_H +#define MBED_PERIPHERALNAMES_H + +#include "cmsis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + ADC_1 = (int)ADC1_BASE, + ADC_2 = (int)ADC2_BASE, + ADC_3 = (int)ADC3_BASE +} ADCName; + +typedef enum { + DAC_1 = (int)DAC_BASE +} DACName; + +typedef enum { + UART_1 = (int)USART1_BASE, + UART_2 = (int)USART2_BASE, + UART_3 = (int)USART3_BASE, + UART_4 = (int)UART4_BASE, + UART_5 = (int)UART5_BASE, + LPUART_1 = (int)LPUART1_BASE +} UARTName; + +typedef enum { + SPI_1 = (int)SPI1_BASE, + SPI_2 = (int)SPI2_BASE, + SPI_3 = (int)SPI3_BASE +} SPIName; + +typedef enum { + I2C_1 = (int)I2C1_BASE, + I2C_2 = (int)I2C2_BASE, + I2C_3 = (int)I2C3_BASE +} I2CName; + +typedef enum { + PWM_1 = (int)TIM1_BASE, + PWM_2 = (int)TIM2_BASE, + PWM_3 = (int)TIM3_BASE, + PWM_4 = (int)TIM4_BASE, + PWM_5 = (int)TIM5_BASE, + PWM_8 = (int)TIM8_BASE, + PWM_15 = (int)TIM15_BASE, + PWM_16 = (int)TIM16_BASE, + PWM_17 = (int)TIM17_BASE +} PWMName; + +typedef enum { + CAN_1 = (int)CAN1_BASE +} CANName; + +typedef enum { + QSPI_1 = (int)QSPI_R_BASE, +} QSPIName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c new file mode 100644 index 0000000000..31119421e5 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c @@ -0,0 +1,368 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2018, 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. + ******************************************************************************* + */ + +#include "PeripheralPins.h" +#include "mbed_toolchain.h" + +//============================================================================== +// Notes +// +// - The pins mentioned Px_y_ALTz are alternative possibilities which use other +// HW peripheral instances. You can use them the same way as any other "normal" +// pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board +// pinout image on mbed.org. +// +// - The pins which are connected to other components present on the board have +// the comment "Connected to xxx". The pin function may not work properly in this +// case. These pins may not be displayed on the board pinout image on mbed.org. +// Please read the board reference manual and schematic for more information. +// +// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented +// See https://os.mbed.com/teams/ST/wiki/STDIO for more information. +// +//============================================================================== + + +//*** ADC *** + +MBED_WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to ARD_D1 [UART4_TX] + {PA_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to ARD_D1 [UART4_TX] + {PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to ARD_D0 [UART4_RX] + {PA_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to ARD_D0 [UART4_RX] + {PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to ARD_D10 [SPI_SSN] + {PA_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to ARD_D10 [SPI_SSN] + {PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to ARD_D4 + {PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to ARD_D4 + {PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // Connected to ARD_D7 + {PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // Connected to ARD_D7 + {PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to ARD_D13 [SPI1_SCK] + {PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to ARD_D13 [SPI1_SCK] + {PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 // Connected to ARD_D12 [SPI1_MISO] + {PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // Connected to ARD_D12 [SPI1_MISO] + {PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 // Connected to ARD_D11 [SPI1_MOSI] + {PA_7_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // Connected to ARD_D11 [SPI1_MOSI] + {PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 // Connected to ARD_D3 [INT_EXT10] + {PB_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 // Connected to ARD_D3 [INT_EXT10] + {PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16 // Connected to ARD_D6 [ADC1_IN6] + {PB_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC2_IN16 // Connected to ARD_D6 [ADC1_IN6] + {PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // Connected to ARD_A5 [ADC] + {PC_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // Connected to ARD_A5 [ADC] + {PC_0_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // Connected to ARD_A5 [ADC] + {PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to ARD_A4 [ADC] + {PC_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // Connected to ARD_A4 [ADC] + {PC_1_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // Connected to ARD_A4 [ADC] + {PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to ARD_A3 [ADC] + {PC_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 // Connected to ARD_A3 [ADC] + {PC_2_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 // Connected to ARD_A3 [ADC] + {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to ARD_A2 [ADC] + {PC_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to ARD_A2 [ADC] + {PC_3_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 // Connected to ARD_A2 [ADC] + {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to ARD_A1 [ADC] + {PC_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to ARD_A1 [ADC] + {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 // Connected to ARD_A0 [ADC] + {PC_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // Connected to ARD_A0 [ADC] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_ADC_Internal[] = { + {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 17, 0)}, + {ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 0, 0)}, + {ADC_VBAT, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 18, 0)}, + {NC, NC, 0} +}; + +//*** DAC *** + +MBED_WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 // Connected to ARD_D7 + {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 // Connected to ARD_D13 [SPI1_SCK] + {NC, NC, 0} +}; + +//*** I2C *** + +MBED_WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to STDIO_UART_RX + {PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to ARD_D14 [I2C1_SDA] + {PB_11, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] + {PB_14, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to LED2 [LED_GREEN] + {PC_1, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to ARD_A4 [ADC] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to STDIO_UART_TX + {PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to ARD_D15 [I2C1_SCL] + {PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] + {PB_13, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] + {PC_0, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to ARD_A5 [ADC] + {NC, NC, 0} +}; + +//*** PWM *** + +// TIM5 cannot be used because already used by the us_ticker +MBED_WEAK const PinMap PinMap_PWM[] = { + {PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to ARD_D1 [UART4_TX] +// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to ARD_D1 [UART4_TX] + {PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to ARD_D0 [UART4_RX] +// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 // Connected to ARD_D0 [UART4_RX] + {PA_1_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N // Connected to ARD_D0 [UART4_RX] + {PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to ARD_D10 [SPI_SSN] +// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // Connected to ARD_D10 [SPI_SSN] + {PA_2_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 // Connected to ARD_D10 [SPI_SSN] + {PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to ARD_D4 +// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // Connected to ARD_D4 + {PA_3_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 // Connected to ARD_D4 + {PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to ARD_D13 [SPI1_SCK] + {PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ARD_D13 [SPI1_SCK] + {PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to ARD_D12 [SPI1_MISO] + {PA_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // Connected to ARD_D12 [SPI1_MISO] + {PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ARD_D11 [SPI1_MOSI] + {PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to ARD_D11 [SPI1_MOSI] + {PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ARD_D11 [SPI1_MOSI] + {PA_7_ALT2, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // Connected to ARD_D11 [SPI1_MOSI] + {PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to SPBTLE_RF_RST + {PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to USB_OTG_FS_VBUS [STMPS2141STR_OUT] + {PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to USB_OTG_FS_ID + {PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to USB_OTG_FS_DM + {PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to ARD_D3 [INT_EXT10] + {PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to ARD_D3 [INT_EXT10] + {PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to ARD_D3 [INT_EXT10] + {PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to ARD_D6 [ADC1_IN6] + {PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to ARD_D6 [ADC1_IN6] + {PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to ARD_D6 [ADC1_IN6] + {PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] +// {PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to STDIO_UART_TX +// {PB_6, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 1)}, // TIM16_CH1N // Connected to STDIO_UART_TX +// {PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to STDIO_UART_RX +// {PB_7, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 1)}, // TIM17_CH1N // Connected to STDIO_UART_RX + {PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to ARD_D15 [I2C1_SCL] + {PB_8_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // Connected to ARD_D15 [I2C1_SCL] + {PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to ARD_D14 [I2C1_SDA] + {PB_9_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // Connected to ARD_D14 [I2C1_SDA] + {PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] + {PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] + {PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ISM43362_WAKEUP [ISM43362_WKUP] + {PB_13_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N // Connected to ISM43362_WAKEUP [ISM43362_WKUP] + {PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LED2 [LED_GREEN] + {PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LED2 [LED_GREEN] + {PB_14_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 // Connected to LED2 [LED_GREEN] + {PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to SPSGRF_915_SDN [SPSGRF_SDN] + {PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to SPSGRF_915_SDN [SPSGRF_SDN] + {PB_15_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 // Connected to SPSGRF_915_SDN [SPSGRF_SDN] + {PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to VL53L0X_XSHUT [Read_XSHUT] + {PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 // Connected to VL53L0X_XSHUT [Read_XSHUT] + {PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to VL53L0X_GPIO1_EXTI7 [VL53L0X_GPIO1] + {PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to VL53L0X_GPIO1_EXTI7 [VL53L0X_GPIO1] + {PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to LSM3MDL_DRDY_EXTI8 [LIS3MDL_DRDY] + {PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 // Connected to LSM3MDL_DRDY_EXTI8 [LIS3MDL_DRDY] + {PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to LED3_WIFI_ LED4_BLE + {PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 // Connected to LED3_WIFI_ LED4_BLE + {PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to USB_OTG_FS_PWR_EN [STMPS2141STR_EN] + {PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to SPBTLE_RF_SPI3_CSN [BT module_SPI_CS] + {PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to ARD_D2 [INT0_EXTI14] + {PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to HTS221_DRDY_EXTI15 [HTS221_DRDY] + {PE_0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // Connected to ISM43362_SPI3_CSN [ISM43362_SSN] + {PE_1, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // Connected to ISM43362_DRDY_EXTI1 [ISM43362_DATARDY] + {PE_3, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to USB_OTG_FS_OVRCR_EXTI3 [STMPS2141STR_FAULT] + {PE_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to M24SR64_Y_GPO [M24SR64_GPO] + {PE_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to SPSGRF_915_GPIO3_EXTI5 [SPSGRF_GPIO_3] + {PE_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to SPBTLE_RF_IRQ_EXTI6 [BT module_SPI_IRQ] + {PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ISM43362_RST [ISM43362_RSTN] + {PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to DFSDM1_CKOUT [MP34DT01_CLK] + {PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to QUADSPI_CLK [MX25R6435F_SCLK] + {PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to QUADSPI_NCS [MX25R6435F_SCLK] + {PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to OQUADSPI_BK1_IO0 [MX25R6435F_IO0] + {PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to QUADSPI_BK1_IO1 [MX25R6435F_IO1] + {PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] + {NC, NC, 0} +}; + +//*** SERIAL *** + +MBED_WEAK const PinMap PinMap_UART_TX[] = { + {PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to ARD_D1 [UART4_TX] + {PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D10 [SPI_SSN] + {PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_VBUS [STMPS2141STR_OUT] + {PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_TX + {PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] + {PB_11, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] + {PC_1, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ARD_A4 [ADC] + {PC_4, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_A1 [ADC] + {PC_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_SPI3_SCK [BT module_SPI_SCLK] + {PC_10_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to INTERNAL_SPI3_SCK [BT module_SPI_SCLK] + {PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to INTERNAL_SPI3_MOSI [BT module_SPI_MOSI] + {PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_TX + {PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_UART3_TX [ISM43362_RX] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_UART_RX[] = { + {PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to ARD_D0 [UART4_RX] + {PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D4 + {PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_ID + {PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_RX + {PB_10, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] + {PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] + {PC_0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ARD_A5 [ADC] + {PC_5, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_A0 [ADC] + {PC_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_SPI3_MISO [BT module_SPI_MISO] + {PC_11_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to INTERNAL_SPI3_MISO [BT module_SPI_MISO] + {PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to PMOD_IRQ_EXTI12 + {PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_RX + {PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_UART3_RX [ISM43362_TX] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D0 [UART4_RX] + {PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_DP + {PA_15, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PB_1, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_D6 [ADC1_IN6] + {PB_3, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_4, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PB_12, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ISM43362_BOOT0 [ISM43362_BOOT] + {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LED2 [LED_GREEN] + {PD_2, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to PMOD_IRQ_EXTI12 + {PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_RTS + {PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to USB_OTG_FS_PWR_EN [STMPS2141STR_EN] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D1 [UART4_TX] + {PA_6, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_D12 [SPI1_MISO] + {PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_DM + {PB_4, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_5, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] + {PB_7, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to STDIO_UART_RX + {PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] + {PB_13_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] + {PD_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_CTS + {PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LSM6DSL_INT1_EXTI11 [LSM6DSL_INT1] + {NC, NC, 0} +}; + +//*** SPI *** + +MBED_WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D11 [SPI1_MOSI] + {PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] + {PB_5_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] + {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to SPSGRF_915_SDN [SPSGRF_SDN] + {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ARD_A2 [ADC] + {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to INTERNAL_SPI3_MOSI [BT module_SPI_MOSI] + {PD_4, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_UART2_RTS + {PE_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to QUAD_SPI_BK1_IO3 [MX25R6435F_IO3] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D12 [SPI1_MISO] + {PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to LED2 [LED_GREEN] + {PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ARD_A3 [ADC] + {PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to INTERNAL_SPI3_MISO [BT module_SPI_MISO] + {PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_UART2_CTS + {PE_14, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D13 [SPI1_SCK] + {PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_3_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] + {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] + {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to INTERNAL_SPI3_SCK [BT module_SPI_SCLK] + {PD_1, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_SPI2_SCK + {PE_13, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to QUADSPI_BK1_IO1 [MX25R6435F_IO1] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D7 + {PA_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to ARD_D7 + {PA_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ARD_D14 [I2C1_SDA] + {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ISM43362_BOOT0 [ISM43362_BOOT] + {PD_0, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_RESET + {PE_12, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to OQUADSPI_BK1_IO0 [MX25R6435F_IO0] + {NC, NC, 0} +}; + +//*** CAN *** + +MBED_WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_OTG_FS_DM + {PB_8, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to ARD_D15 [I2C1_SCL] + {PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to PMOD_RESET + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_OTG_FS_DP + {PB_9, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to ARD_D14 [I2C1_SDA] + {PD_1, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to PMOD_SPI2_SCK + {NC, NC, 0} +}; + +//*** QUADSPI *** + +MBED_WEAK const PinMap PinMap_QSPI_DATA[] = { + {PA_6, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 // Connected to ARD_D12 [SPI1_MISO] + {PA_7, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 // Connected to ARD_D11 [SPI1_MOSI] + {PB_0, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 // Connected to ARD_D3 [INT_EXT10] + {PB_1, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 // Connected to ARD_D6 [ADC1_IN6] + {PE_12, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 // Connected to OQUADSPI_BK1_IO0 [MX25R6435F_IO0] + {PE_13, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 // Connected to QUADSPI_BK1_IO1 [MX25R6435F_IO1] + {PE_14, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 // Connected to QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] + {PE_15, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 // Connected to QUAD_SPI_BK1_IO3 [MX25R6435F_IO3] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_SCLK[] = { + {PB_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] + {PE_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK // Connected to QUADSPI_CLK [MX25R6435F_SCLK] + {NC, NC, 0} +}; + +MBED_WEAK const PinMap PinMap_QSPI_SSEL[] = { + {PB_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] + {PE_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS // Connected to QUADSPI_NCS [MX25R6435F_SCLK] + {NC, NC, 0} +}; diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h new file mode 100644 index 0000000000..9d89ae5467 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h @@ -0,0 +1,321 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2018, 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 { + ALT0 = 0x100, + ALT1 = 0x200, + ALT2 = 0x300, + ALT3 = 0x400 +} ALTx; + +typedef enum { + PA_0 = 0x00, + PA_0_ALT0 = PA_0 | ALT0, + PA_1 = 0x01, + PA_1_ALT0 = PA_1 | ALT0, + PA_2 = 0x02, + PA_2_ALT0 = PA_2 | ALT0, + PA_3 = 0x03, + PA_3_ALT0 = PA_3 | ALT0, + PA_4 = 0x04, + PA_4_ALT0 = PA_4 | ALT0, + PA_5 = 0x05, + PA_5_ALT0 = PA_5 | ALT0, + PA_6 = 0x06, + PA_6_ALT0 = PA_6 | ALT0, + PA_7 = 0x07, + PA_7_ALT0 = PA_7 | ALT0, + PA_7_ALT1 = PA_7 | ALT1, + PA_7_ALT2 = PA_7 | ALT2, + PA_8 = 0x08, + PA_9 = 0x09, + PA_10 = 0x0A, + PA_11 = 0x0B, + PA_12 = 0x0C, + PA_13 = 0x0D, + PA_14 = 0x0E, + PA_15 = 0x0F, + PA_15_ALT0 = PA_15 | ALT0, + + PB_0 = 0x10, + PB_0_ALT0 = PB_0 | ALT0, + PB_0_ALT1 = PB_0 | ALT1, + PB_1 = 0x11, + PB_1_ALT0 = PB_1 | ALT0, + PB_1_ALT1 = PB_1 | ALT1, + PB_2 = 0x12, + PB_3 = 0x13, + PB_3_ALT0 = PB_3 | ALT0, + PB_4 = 0x14, + PB_4_ALT0 = PB_4 | ALT0, + PB_5 = 0x15, + PB_5_ALT0 = PB_5 | ALT0, + PB_6 = 0x16, + PB_6_ALT0 = PB_6 | ALT0, + PB_7 = 0x17, + PB_7_ALT0 = PB_7 | ALT0, + PB_8 = 0x18, + PB_8_ALT0 = PB_8 | ALT0, + PB_9 = 0x19, + PB_9_ALT0 = PB_9 | ALT0, + PB_10 = 0x1A, + PB_11 = 0x1B, + PB_12 = 0x1C, + PB_13 = 0x1D, + PB_13_ALT0 = PB_13 | ALT0, + PB_14 = 0x1E, + PB_14_ALT0 = PB_14 | ALT0, + PB_14_ALT1 = PB_14 | ALT1, + PB_15 = 0x1F, + PB_15_ALT0 = PB_15 | ALT0, + PB_15_ALT1 = PB_15 | ALT1, + + PC_0 = 0x20, + PC_0_ALT0 = PC_0 | ALT0, + PC_0_ALT1 = PC_0 | ALT1, + PC_1 = 0x21, + PC_1_ALT0 = PC_1 | ALT0, + PC_1_ALT1 = PC_1 | ALT1, + PC_2 = 0x22, + PC_2_ALT0 = PC_2 | ALT0, + PC_2_ALT1 = PC_2 | ALT1, + PC_3 = 0x23, + PC_3_ALT0 = PC_3 | ALT0, + PC_3_ALT1 = PC_3 | ALT1, + PC_4 = 0x24, + PC_4_ALT0 = PC_4 | ALT0, + PC_5 = 0x25, + PC_5_ALT0 = PC_5 | ALT0, + PC_6 = 0x26, + PC_6_ALT0 = PC_6 | ALT0, + PC_7 = 0x27, + PC_7_ALT0 = PC_7 | ALT0, + PC_8 = 0x28, + PC_8_ALT0 = PC_8 | ALT0, + PC_9 = 0x29, + PC_9_ALT0 = PC_9 | ALT0, + PC_10 = 0x2A, + PC_10_ALT0 = PC_10 | ALT0, + PC_11 = 0x2B, + PC_11_ALT0 = PC_11 | ALT0, + 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, + + PH_0 = 0x70, + PH_1 = 0x71, + + // ADC internal channels + ADC_TEMP = 0xF0, + ADC_VREF = 0xF1, + ADC_VBAT = 0xF2, + + // Not connected + NC = (int)0xFFFFFFFF, + + // STDIO for console print +#ifdef MBED_CONF_TARGET_STDIO_UART_TX + STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX, +#else + STDIO_UART_TX = PA_9, +#endif +#ifdef MBED_CONF_TARGET_STDIO_UART_RX + STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX, +#else + STDIO_UART_RX = PA_10, +#endif + + // Generic signals namings + LED1 = PE_2, // Red LED (LD1) + LED2 = PE_3, // Blue LED (LD2) + LED3 = PE_4, // Green LED (LD3) + + LED_RED = LED1, + LED_BLUE = LED2, + LED_GREEN = LED3, + + USER_BUTTON = PD_4, + BUTTON1 = USER_BUTTON, + + USBTX = STDIO_UART_TX, + USBRX = STDIO_UART_RX, + + UART1_TX = PA_2, + UART1_RX = PA_3, + UART1_CTS = PA_0, + UART1_RTS = PA_1, + + SERIAL_TX = UART1_TX, + SERIAL_RX = UART1_RX, + SERIAL_CTS = UART1_CTS, + SERIAL_RTS = UART1_RTS, + + UART2_TX = PC_4, + UART2_RX = PC_5, + + I2C0_SCL = PB_6, + I2C0_SDA = PB_7, + + I2C1_SCL = PC_0, + I2C1_SDA = PC_1, + + SPI0_MOSI = PB_5, + SPI0_MISO = PA_6, + SPI0_SCK = PA_5, + SPI0_CS = PA_15, + + SPI1_MOSI = PB_15, + SPI1_MISO = PB_14, + SPI1_SCK = PD_3, + SPI1_CS = PB_9, + + SPI2_MOSI = PC_12, + SPI2_MISO = PC_11, + SPI2_SCK = PC_10, + SPI2_CS = PA_4, + + //Default SPI + SPI_MOSI = SPI0_MOSI, + SPI_MISO = SPI0_MISO, + SPI_SCK = SPI0_SCK, + /**************** + //IMPORTANT NOTE: The default CS for SPI is marked as the CS line for the SPI Flash + //on the MCB reference hardware. Please change as appropriate. + ****************/ + SPI_CS = PD_2, + + CAN1_RX = PD_0, //Test point on MCB + CAN1_TX = PD_1, //Test point on MCB + + /**** OSCILLATOR pins ****/ + RCC_OSC32_IN = PC_14, + RCC_OSC32_OUT = PC_15, + RCC_OSC_IN = PH_0, + RCC_OSC_OUT = PH_1, + + /**** DEBUG pins ****/ + SYS_JTCK_SWCLK = PA_14, + SYS_JTDI = PA_15, + SYS_JTDO_SWO = PB_3, + SYS_JTMS_SWDIO = PA_13, + SYS_JTRST = PB_4, + SYS_PVD_IN = PB_7, + SYS_TRACECLK = PE_2, + SYS_TRACED0 = PE_3, + SYS_TRACED1 = PE_4, + SYS_TRACED2 = PE_5, + SYS_TRACED3 = PE_6, + SYS_WKUP1 = PA_0, + SYS_WKUP2 = PC_13, + SYS_WKUP3 = PE_6, + SYS_WKUP4 = PA_2, + SYS_WKUP5 = PC_5, + + //MTB aliases + TX1 = PA_2, + RX1 = PA_3, + SDA1 = PB_7, + SCL1 = PB_6, + MOSI1 = PB_5, + MISO1 = PA_6, + SCK1 = PA_5, + GP0 = PD_4, + GP1 = PC_10, + AIN0 = PA_0, //CTS + AIN1 = PA_1, // RTS + AIN2 = PB_0, + + GP2 = PE_5, //SD card CS + GP3 = PE_6, + SCK2 = PD_3, + MISO2 = PB_14, + MOSI2 = PB_15, + SCL2 = PC_1, + SDA2 = PC_0, + RX2 = PC_5, + TX2 = PC_4, + GP4 = PE_9, + GP5 = PE_10, //A0 for LCD on MTB + GP6 = PE_13, //RESET for LCD on MTB + GP7 = PE_14, //LCD CS + GP8 = PE_15 + +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c new file mode 100644 index 0000000000..d71a36fb67 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c @@ -0,0 +1,370 @@ +/* mbed Microcontroller Library +* Copyright (c) 2006-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. +*/ + +/** + * This file configures the system clock as follows: + *----------------------------------------------------------------------------- + * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock) + * | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal) + * | 3- USE_PLL_HSI (internal 16 MHz) + * | 4- USE_PLL_MSI (internal 100kHz to 48 MHz) + *----------------------------------------------------------------------------- + * SYSCLK(MHz) | 80 + * AHBCLK (MHz) | 80 + * APB1CLK (MHz) | 80 + * APB2CLK (MHz) | 80 + * USB capable | YES + *----------------------------------------------------------------------------- +**/ + +#include "stm32l4xx.h" +#include "nvic_addr.h" +#include "mbed_error.h" + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ + + +// clock source is selected with CLOCK_SOURCE in json config +#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO - not enabled by default) +#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board - not provided by default) +#define USE_PLL_HSI 0x2 // Use HSI internal clock +#define USE_PLL_MSI 0x1 // Use MSI internal clock + +#define DEBUG_MCO (0) // Output the MCO on PA8 for debugging (0=OFF, 1=SYSCLK, 2=HSE, 3=HSI, 4=MSI) + +#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) ) +uint8_t SetSysClock_PLL_HSE(uint8_t bypass); +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */ + +#if ((CLOCK_SOURCE) & USE_PLL_HSI) +uint8_t SetSysClock_PLL_HSI(void); +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */ + +#if ((CLOCK_SOURCE) & USE_PLL_MSI) +uint8_t SetSysClock_PLL_MSI(void); +#endif /* ((CLOCK_SOURCE) & USE_PLL_MSI) */ + + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */ +#endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= (uint32_t)0xEAF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS; /* Vector Table Relocation in Internal FLASH */ +#endif + +} + + +/** + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ + +void SetSysClock(void) +{ +#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) + /* 1- Try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(1) == 0) +#endif + { +#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) + /* 2- If fail try to start with HSE and external xtal */ + if (SetSysClock_PLL_HSE(0) == 0) +#endif + { +#if ((CLOCK_SOURCE) & USE_PLL_HSI) + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == 0) +#endif + { +#if ((CLOCK_SOURCE) & USE_PLL_MSI) + /* 4- If fail start with MSI clock */ + if (SetSysClock_PLL_MSI() == 0) +#endif + { + { + error("SetSysClock failed\n"); + } + } + } + } + } + + // Output clock on MCO1 pin(PA8) for debugging purpose +#if DEBUG_MCO == 1 + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); +#endif +} + +#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) ) +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSE(uint8_t bypass) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit = {0}; + + // Used to gain time after DeepSleep in case HSI is used + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { + return 0; + } + + // Select MSI as system clock source to allow modification of the PLL configuration + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); + + // Enable HSE oscillator and activate PLL with HSE as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI; + if (bypass == 0) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN + } + RCC_OscInitStruct.HSIState = RCC_HSI_OFF; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // 8 MHz + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLM = 1; // VCO input clock = 8 MHz (8 MHz / 1) + RCC_OscInitStruct.PLL.PLLN = 20; // VCO output clock = 160 MHz (8 MHz * 20) + RCC_OscInitStruct.PLL.PLLP = 7; // PLLSAI3 clock = 22 MHz (160 MHz / 7) + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; // PLL clock = 80 MHz (160 MHz / 2) + + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // 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 + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { + return 0; // FAIL + } + + RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + RCC_PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1M = 1; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1N = 12; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK; + if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK) { + return 0; // FAIL + } + + // Disable MSI Oscillator + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.MSIState = RCC_MSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + // Output clock on MCO1 pin(PA8) for debugging purpose +#if DEBUG_MCO == 2 + if (bypass == 0) { + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz + } else { + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz + } +#endif + + return 1; // OK +} +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */ + +#if ((CLOCK_SOURCE) & USE_PLL_HSI) +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSI(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit = {0}; + + // Select MSI as system clock source to allow modification of the PLL configuration + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); + + // Enable HSI oscillator and activate PLL with HSI as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; // 16 MHz + RCC_OscInitStruct.PLL.PLLM = 2; // VCO input clock = 8 MHz (16 MHz / 2) + RCC_OscInitStruct.PLL.PLLN = 20; // VCO output clock = 160 MHz (8 MHz * 20) + RCC_OscInitStruct.PLL.PLLP = 7; // PLLSAI3 clock = 22 MHz (160 MHz / 7) + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; // PLL clock = 80 MHz (160 MHz / 2) + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // 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 + 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 + } + + RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + RCC_PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSI; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1M = 2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1N = 12; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + RCC_PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK; + if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK) { + return 0; // FAIL + } + + // Disable MSI Oscillator + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.MSIState = RCC_MSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + // 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 +#endif + + return 1; // OK +} +#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */ + +#if ((CLOCK_SOURCE) & USE_PLL_MSI) +/******************************************************************************/ +/* PLL (clocked by MSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_MSI(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + +#if MBED_CONF_TARGET_LSE_AVAILABLE + // Enable LSE Oscillator to automatically calibrate the MSI clock + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update + RCC_OscInitStruct.LSEState = RCC_LSE_ON; // External 32.768 kHz clock on OSC_IN/OSC_OUT + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + /* Enable the CSS interrupt in case LSE signal is corrupted or not present */ + HAL_RCCEx_DisableLSECSS(); +#endif /* MBED_CONF_TARGET_LSE_AVAILABLE */ + + /* Enable MSI Oscillator and activate PLL with MSI as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + 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; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 6; /* 8 MHz */ + RCC_OscInitStruct.PLL.PLLN = 40; /* 320 MHz */ + RCC_OscInitStruct.PLL.PLLP = 7; /* 45 MHz */ + RCC_OscInitStruct.PLL.PLLQ = 4; /* 80 MHz */ + RCC_OscInitStruct.PLL.PLLR = 4; /* 80 MHz */ + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + +#if MBED_CONF_TARGET_LSE_AVAILABLE + /* Enable MSI Auto-calibration through LSE */ + HAL_RCCEx_EnableMSIPLLMode(); +#endif /* MBED_CONF_TARGET_LSE_AVAILABLE */ + + /* Select MSI output as USB clock source */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI; /* 48 MHz */ + 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 */ + 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 + } + + // 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 +#endif + + return 1; // OK +} +#endif /* ((CLOCK_SOURCE) & USE_PLL_MSI) */ diff --git a/targets/targets.json b/targets/targets.json index f39d40bce2..03a01ce1ac 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -3915,6 +3915,35 @@ "device_name": "STM32L475VG", "bootloader_supported": true }, + "MTB_STM_L475": { + "inherits": ["FAMILY_STM32"], + "core": "Cortex-M4F", + "extra_labels_add": ["STM32L4", "STM32L475xG", "STM32L475VG"], + "config": { + "clock_source": { + "help": "Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL (8MHz) | USE_PLL_HSI | USE_PLL_MSI", + "value": "USE_PLL_HSE_XTAL", + "macro_name": "CLOCK_SOURCE" + }, + "lpticker_lptim": { + "help": "This target supports LPTIM. Set value 1 to use LPTIM for LPTICKER, or 0 to use RTC wakeup timer", + "value": 0 + } + }, + "detect_code": ["0468"], + "macros_add": ["USBHOST_OTHER", "TWO_RAM_REGIONS"], + "device_has_add": [ + "ANALOGOUT", + "CAN", + "SERIAL_FC", + "TRNG", + "FLASH", + "MPU" + ], + "release_versions": ["5"], + "device_name": "STM32L475VG", + "bootloader_supported": true + }, "DISCO_L476VG": { "components_add": ["QSPIF", "FLASHIAP"], "inherits": ["FAMILY_STM32"], From f4fc79e2cd440f3097d415638821ff2e50f0cfb3 Mon Sep 17 00:00:00 2001 From: Ashok Rao Date: Wed, 20 Feb 2019 15:02:59 +0000 Subject: [PATCH 100/109] Adding SPDX license identifier --- .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c index d71a36fb67..77a37b4662 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c @@ -1,5 +1,7 @@ /* mbed Microcontroller Library * Copyright (c) 2006-2017 ARM Limited + +* SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From a3007f6ffefa63d4c55929470c00533ecd26c6e3 Mon Sep 17 00:00:00 2001 From: Ashok Rao Date: Wed, 20 Feb 2019 15:07:03 +0000 Subject: [PATCH 101/109] Adding SPDX license identifer for all new files --- .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h | 2 ++ .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c | 2 ++ .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h index 04b09f6539..39836c1495 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h @@ -1,4 +1,6 @@ /* mbed Microcontroller Library + +* SPDX-License-Identifier: Apache-2.0 ******************************************************************************* * Copyright (c) 2017, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c index 31119421e5..b29079934a 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c @@ -1,4 +1,6 @@ /* mbed Microcontroller Library + +* SPDX-License-Identifier: Apache-2.0 ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h index 9d89ae5467..3946fdaab1 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h @@ -1,4 +1,6 @@ /* mbed Microcontroller Library + +* SPDX-License-Identifier: Apache-2.0 ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. From ceb5c6e01e781a849cd3d42452e3c8e1b1fe22d7 Mon Sep 17 00:00:00 2001 From: Ashok Rao Date: Wed, 20 Feb 2019 15:22:11 +0000 Subject: [PATCH 102/109] Removing redundant code comments --- .../TARGET_MTB_STM_L475/PeripheralPins.c | 416 +++++++++--------- 1 file changed, 208 insertions(+), 208 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c index b29079934a..d1c9c39723 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c @@ -55,42 +55,42 @@ //*** ADC *** MBED_WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to ARD_D1 [UART4_TX] - {PA_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to ARD_D1 [UART4_TX] - {PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to ARD_D0 [UART4_RX] - {PA_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to ARD_D0 [UART4_RX] - {PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to ARD_D10 [SPI_SSN] - {PA_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to ARD_D10 [SPI_SSN] - {PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to ARD_D4 - {PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to ARD_D4 - {PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // Connected to ARD_D7 - {PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // Connected to ARD_D7 - {PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to ARD_D13 [SPI1_SCK] - {PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to ARD_D13 [SPI1_SCK] - {PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 // Connected to ARD_D12 [SPI1_MISO] - {PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // Connected to ARD_D12 [SPI1_MISO] - {PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 // Connected to ARD_D11 [SPI1_MOSI] - {PA_7_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // Connected to ARD_D11 [SPI1_MOSI] - {PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 // Connected to ARD_D3 [INT_EXT10] - {PB_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 // Connected to ARD_D3 [INT_EXT10] - {PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16 // Connected to ARD_D6 [ADC1_IN6] - {PB_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC2_IN16 // Connected to ARD_D6 [ADC1_IN6] - {PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // Connected to ARD_A5 [ADC] - {PC_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // Connected to ARD_A5 [ADC] - {PC_0_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // Connected to ARD_A5 [ADC] - {PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to ARD_A4 [ADC] - {PC_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // Connected to ARD_A4 [ADC] - {PC_1_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // Connected to ARD_A4 [ADC] - {PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to ARD_A3 [ADC] - {PC_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 // Connected to ARD_A3 [ADC] - {PC_2_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 // Connected to ARD_A3 [ADC] - {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to ARD_A2 [ADC] - {PC_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to ARD_A2 [ADC] - {PC_3_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 // Connected to ARD_A2 [ADC] - {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to ARD_A1 [ADC] - {PC_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to ARD_A1 [ADC] - {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 // Connected to ARD_A0 [ADC] - {PC_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // Connected to ARD_A0 [ADC] + {PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + {PA_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + {PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + {PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + {PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PA_7_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + {PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {PB_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16 + {PB_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 16, 0)}, // ADC2_IN16 + {PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + {PC_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + {PC_0_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + {PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PC_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + {PC_1_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + {PC_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + {PC_2_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PC_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PC_3_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 {NC, NC, 0} }; @@ -104,28 +104,28 @@ MBED_WEAK const PinMap PinMap_ADC_Internal[] = { //*** DAC *** MBED_WEAK const PinMap PinMap_DAC[] = { - {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 // Connected to ARD_D7 - {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 // Connected to ARD_D13 [SPI1_SCK] + {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1 // + {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 // {NC, NC, 0} }; //*** I2C *** MBED_WEAK const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to STDIO_UART_RX - {PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to ARD_D14 [I2C1_SDA] - {PB_11, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] - {PB_14, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to LED2 [LED_GREEN] - {PC_1, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to ARD_A4 [ADC] + {PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_11, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PB_14, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_1, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_I2C_SCL[] = { - {PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to STDIO_UART_TX - {PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to ARD_D15 [I2C1_SCL] - {PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] - {PB_13, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] - {PC_0, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to ARD_A5 [ADC] + {PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PB_13, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_0, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {NC, NC, 0} }; @@ -133,238 +133,238 @@ MBED_WEAK const PinMap PinMap_I2C_SCL[] = { // TIM5 cannot be used because already used by the us_ticker MBED_WEAK const PinMap PinMap_PWM[] = { - {PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to ARD_D1 [UART4_TX] -// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to ARD_D1 [UART4_TX] - {PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to ARD_D0 [UART4_RX] -// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 // Connected to ARD_D0 [UART4_RX] - {PA_1_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N // Connected to ARD_D0 [UART4_RX] - {PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to ARD_D10 [SPI_SSN] -// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // Connected to ARD_D10 [SPI_SSN] - {PA_2_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 // Connected to ARD_D10 [SPI_SSN] - {PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to ARD_D4 -// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // Connected to ARD_D4 - {PA_3_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 // Connected to ARD_D4 - {PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to ARD_D13 [SPI1_SCK] - {PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ARD_D13 [SPI1_SCK] - {PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to ARD_D12 [SPI1_MISO] - {PA_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // Connected to ARD_D12 [SPI1_MISO] - {PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ARD_D11 [SPI1_MOSI] - {PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to ARD_D11 [SPI1_MOSI] - {PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ARD_D11 [SPI1_MOSI] - {PA_7_ALT2, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // Connected to ARD_D11 [SPI1_MOSI] - {PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to SPBTLE_RF_RST - {PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to USB_OTG_FS_VBUS [STMPS2141STR_OUT] - {PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to USB_OTG_FS_ID - {PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to USB_OTG_FS_DM + {PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 +// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + {PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 +// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + {PA_1_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N + {PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 +// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + {PA_2_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 + {PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 +// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + {PA_3_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 + {PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + {PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PA_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 + {PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + {PA_7_ALT2, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 + {PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - {PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to ARD_D3 [INT_EXT10] - {PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to ARD_D3 [INT_EXT10] - {PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to ARD_D3 [INT_EXT10] - {PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to ARD_D6 [ADC1_IN6] - {PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to ARD_D6 [ADC1_IN6] - {PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to ARD_D6 [ADC1_IN6] + {PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + {PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N {PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 {PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] -// {PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to STDIO_UART_TX -// {PB_6, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 1)}, // TIM16_CH1N // Connected to STDIO_UART_TX -// {PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to STDIO_UART_RX -// {PB_7, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 1)}, // TIM17_CH1N // Connected to STDIO_UART_RX - {PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to ARD_D15 [I2C1_SCL] - {PB_8_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // Connected to ARD_D15 [I2C1_SCL] - {PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to ARD_D14 [I2C1_SDA] - {PB_9_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // Connected to ARD_D14 [I2C1_SDA] - {PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] - {PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] - {PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ISM43362_WAKEUP [ISM43362_WKUP] - {PB_13_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N // Connected to ISM43362_WAKEUP [ISM43362_WKUP] - {PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LED2 [LED_GREEN] - {PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LED2 [LED_GREEN] - {PB_14_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 // Connected to LED2 [LED_GREEN] - {PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to SPSGRF_915_SDN [SPSGRF_SDN] - {PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to SPSGRF_915_SDN [SPSGRF_SDN] - {PB_15_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 // Connected to SPSGRF_915_SDN [SPSGRF_SDN] - {PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to VL53L0X_XSHUT [Read_XSHUT] - {PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 // Connected to VL53L0X_XSHUT [Read_XSHUT] - {PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to VL53L0X_GPIO1_EXTI7 [VL53L0X_GPIO1] - {PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to VL53L0X_GPIO1_EXTI7 [VL53L0X_GPIO1] - {PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to LSM3MDL_DRDY_EXTI8 [LIS3MDL_DRDY] - {PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 // Connected to LSM3MDL_DRDY_EXTI8 [LIS3MDL_DRDY] - {PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to LED3_WIFI_ LED4_BLE - {PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 // Connected to LED3_WIFI_ LED4_BLE - {PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to USB_OTG_FS_PWR_EN [STMPS2141STR_EN] - {PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to SPBTLE_RF_SPI3_CSN [BT module_SPI_CS] - {PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to ARD_D2 [INT0_EXTI14] - {PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to HTS221_DRDY_EXTI15 [HTS221_DRDY] - {PE_0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 // Connected to ISM43362_SPI3_CSN [ISM43362_SSN] - {PE_1, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 // Connected to ISM43362_DRDY_EXTI1 [ISM43362_DATARDY] - {PE_3, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to USB_OTG_FS_OVRCR_EXTI3 [STMPS2141STR_FAULT] - {PE_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to M24SR64_Y_GPO [M24SR64_GPO] - {PE_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to SPSGRF_915_GPIO3_EXTI5 [SPSGRF_GPIO_3] - {PE_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to SPBTLE_RF_IRQ_EXTI6 [BT module_SPI_IRQ] - {PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ISM43362_RST [ISM43362_RSTN] - {PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to DFSDM1_CKOUT [MP34DT01_CLK] - {PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to QUADSPI_CLK [MX25R6435F_SCLK] - {PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to QUADSPI_NCS [MX25R6435F_SCLK] - {PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to OQUADSPI_BK1_IO0 [MX25R6435F_IO0] - {PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to QUADSPI_BK1_IO1 [MX25R6435F_IO1] - {PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] + {PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 +// {PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 +// {PB_6, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 1)}, // TIM16_CH1N +// {PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 +// {PB_7, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 1)}, // TIM17_CH1N + {PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_8_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 + {PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9_ALT0, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 + {PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PB_13_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N + {PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + {PB_14_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 + {PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_15_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 + {PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + {PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + {PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + {PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 + {PE_1, PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM17, 1, 0)}, // TIM17_CH1 + {PE_3, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PE_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PE_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PE_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 {NC, NC, 0} }; //*** SERIAL *** MBED_WEAK const PinMap PinMap_UART_TX[] = { - {PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to ARD_D1 [UART4_TX] - {PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D10 [SPI_SSN] - {PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_VBUS [STMPS2141STR_OUT] - {PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_TX - {PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] - {PB_11, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] - {PC_1, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ARD_A4 [ADC] - {PC_4, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_A1 [ADC] - {PC_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_SPI3_SCK [BT module_SPI_SCLK] - {PC_10_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to INTERNAL_SPI3_SCK [BT module_SPI_SCLK] - {PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to INTERNAL_SPI3_MOSI [BT module_SPI_MOSI] - {PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_TX - {PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_UART3_TX [ISM43362_RX] + {PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PB_11, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, + {PC_1, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, + {PC_4, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_10_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {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)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_UART_RX[] = { - {PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to ARD_D0 [UART4_RX] - {PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D4 - {PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_ID - {PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_RX - {PB_10, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] - {PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] - {PC_0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ARD_A5 [ADC] - {PC_5, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_A0 [ADC] - {PC_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_SPI3_MISO [BT module_SPI_MISO] - {PC_11_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to INTERNAL_SPI3_MISO [BT module_SPI_MISO] - {PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to PMOD_IRQ_EXTI12 - {PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_RX - {PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to INTERNAL_UART3_RX [ISM43362_TX] + {PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_10, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, + {PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, + {PC_5, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_11_ALT0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_UART_RTS[] = { - {PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D0 [UART4_RX] - {PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_DP + {PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PA_15, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PB_1, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_D6 [ADC1_IN6] + {PB_1, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PB_3, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PB_4, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PB_12, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ISM43362_BOOT0 [ISM43362_BOOT] - {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LED2 [LED_GREEN] - {PD_2, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to PMOD_IRQ_EXTI12 - {PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_RTS - {PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to USB_OTG_FS_PWR_EN [STMPS2141STR_EN] + {PB_12, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, + {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_2, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_UART_CTS[] = { - {PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ARD_D1 [UART4_TX] - {PA_6, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ARD_D12 [SPI1_MISO] - {PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_DM + {PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_6, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {PB_4, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_5, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] - {PB_7, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to STDIO_UART_RX - {PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] - {PB_13_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] - {PD_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to PMOD_UART2_CTS - {PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LSM6DSL_INT1_EXTI11 [LSM6DSL_INT1] + {PB_5, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PB_7, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PB_13_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, + {PD_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {NC, NC, 0} }; //*** SPI *** MBED_WEAK const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D11 [SPI1_MOSI] - {PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] - {PB_5_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SPSGRF_915_SPI3_CSN [SPSGRF_SPI_CS] - {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to SPSGRF_915_SDN [SPSGRF_SDN] - {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ARD_A2 [ADC] - {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to INTERNAL_SPI3_MOSI [BT module_SPI_MOSI] - {PD_4, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_UART2_RTS - {PE_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to QUAD_SPI_BK1_IO3 [MX25R6435F_IO3] + {PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_5_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PD_4, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PE_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D12 [SPI1_MISO] + {PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {PB_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, - {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to LED2 [LED_GREEN] - {PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ARD_A3 [ADC] - {PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to INTERNAL_SPI3_MISO [BT module_SPI_MISO] - {PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_UART2_CTS - {PE_14, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] + {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PE_14, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D13 [SPI1_SCK] + {PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {PB_3_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, - {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] - {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ISM43362_WAKEUP [ISM43362_WKUP] - {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to INTERNAL_SPI3_SCK [BT module_SPI_SCLK] - {PD_1, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_SPI2_SCK - {PE_13, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to QUADSPI_BK1_IO1 [MX25R6435F_IO1] + {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, + {PD_1, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PE_13, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ARD_D7 - {PA_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to ARD_D7 + {PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PA_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, {PA_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, - {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ARD_D14 [I2C1_SDA] - {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ISM43362_BOOT0 [ISM43362_BOOT] - {PD_0, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PMOD_RESET - {PE_12, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to OQUADSPI_BK1_IO0 [MX25R6435F_IO0] + {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PD_0, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, + {PE_12, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, {NC, NC, 0} }; //*** CAN *** MBED_WEAK const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_OTG_FS_DM - {PB_8, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to ARD_D15 [I2C1_SCL] - {PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to PMOD_RESET + {PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_8, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_OTG_FS_DP - {PB_9, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to ARD_D14 [I2C1_SDA] - {PD_1, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to PMOD_SPI2_SCK + {PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_9, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PD_1, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NC, 0} }; //*** QUADSPI *** MBED_WEAK const PinMap PinMap_QSPI_DATA[] = { - {PA_6, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 // Connected to ARD_D12 [SPI1_MISO] - {PA_7, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 // Connected to ARD_D11 [SPI1_MOSI] - {PB_0, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 // Connected to ARD_D3 [INT_EXT10] - {PB_1, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 // Connected to ARD_D6 [ADC1_IN6] - {PE_12, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 // Connected to OQUADSPI_BK1_IO0 [MX25R6435F_IO0] - {PE_13, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 // Connected to QUADSPI_BK1_IO1 [MX25R6435F_IO1] - {PE_14, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 // Connected to QUAD_SPI_BK1_IO2 [MX25R6435F_IO2] - {PE_15, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 // Connected to QUAD_SPI_BK1_IO3 [MX25R6435F_IO3] + {PA_6, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 + {PA_7, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 + {PB_0, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 + {PB_1, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 + {PE_12, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO0 + {PE_13, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO1 + {PE_14, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO2 + {PE_15, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_BK1_IO3 {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_QSPI_SCLK[] = { - {PB_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK // Connected to INTERNAL_I2C2_SCL [VL53L0X_SCL] - {PE_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK // Connected to QUADSPI_CLK [MX25R6435F_SCLK] + {PB_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK + {PE_10, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_CLK {NC, NC, 0} }; MBED_WEAK const PinMap PinMap_QSPI_SSEL[] = { - {PB_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS // Connected to INTERNAL_I2C2_SDA [VL53L0X_SDA] - {PE_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS // Connected to QUADSPI_NCS [MX25R6435F_SCLK] + {PB_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS + {PE_11, QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)}, // QUADSPI_NCS {NC, NC, 0} }; From 7a716b591c4e9c83154255e06628c2dadeaad388 Mon Sep 17 00:00:00 2001 From: Ashok Rao Date: Thu, 21 Feb 2019 10:35:25 +0000 Subject: [PATCH 103/109] Changing SPDX license identifier to BSD-3-Clause --- .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h | 2 +- .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c | 2 +- .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h | 2 +- .../TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h index 39836c1495..1985df72fd 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralNames.h @@ -1,6 +1,6 @@ /* mbed Microcontroller Library -* SPDX-License-Identifier: Apache-2.0 +* SPDX-License-Identifier: BSD-3-Clause ******************************************************************************* * Copyright (c) 2017, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c index d1c9c39723..0b79f9eed3 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PeripheralPins.c @@ -1,6 +1,6 @@ /* mbed Microcontroller Library -* SPDX-License-Identifier: Apache-2.0 +* SPDX-License-Identifier: BSD-3-Clause ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h index 3946fdaab1..c9f7aca3a5 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/PinNames.h @@ -1,6 +1,6 @@ /* mbed Microcontroller Library -* SPDX-License-Identifier: Apache-2.0 +* SPDX-License-Identifier: BSD-3-Clause ******************************************************************************* * Copyright (c) 2018, STMicroelectronics * All rights reserved. diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c index 77a37b4662..39c066d940 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L475xG/TARGET_MTB_STM_L475/system_clock.c @@ -1,5 +1,5 @@ /* mbed Microcontroller Library -* Copyright (c) 2006-2017 ARM Limited +* Copyright (c) 2006-2019 ARM Limited * SPDX-License-Identifier: Apache-2.0 * From 7309bd9c3277c0959baa257bceaada823474b5be Mon Sep 17 00:00:00 2001 From: RFulchiero Date: Tue, 19 Feb 2019 15:20:36 -0600 Subject: [PATCH 104/109] Remove ITM from NRF52_DK and DELTA_DFBM_NQ620 targets The NRF52_DK and DELTA_DFBM_NQ620 have the SWO pin (p0_18) mapped to LED2. This means that on startup LED2 turns on after the ITM is initialized which is confusing. Since most users want LED2 usage instead of SWO we remove the ITM for these targets. The nRF52 readme is updated to instruct users how to get SWO support if they need it. --- targets/TARGET_NORDIC/TARGET_NRF5x/README.md | 10 ++++++++++ targets/targets.json | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/README.md index bea26442f8..7e093ea90e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/README.md +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/README.md @@ -153,6 +153,16 @@ The assert handler is defined in mbed-os/features/FEATURE_BLE/targets/TARGET_NOR * It is not possible to do an asynchronous write from flash and receive non-asynchronously at the same time since the non-asynchronous receive buffer is being used as the temporary transmission buffer. * The driver will flush the DMA buffer after a configurable timeout. During this process the UART will be halted and therefor unable to receive data. Hardware flow control should be enabled to avoid missing any data during this window. +#### Serial Wire Output (SWO) + +On the nRF52832 pin 18 (p18 or p0_18) is the SWO pin and a GPIO pin. On the nRF52_DK and DELTA_DFBM_NQ620 targets p18 is also mapped to LED2, so the ITM has been removed from these targets to avoid contention. If you need SWO capability instead of LED2, add the ITM through ```mbed_app.json```: +``` + "target_overrides": { + "*": { + "target.device_has_add": ["ITM"] + } + } +``` ## SoftDevice diff --git a/targets/targets.json b/targets/targets.json index 03a01ce1ac..624516df7b 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -6848,7 +6848,8 @@ "device_name": "nRF52832_xxAA", "macros_add": [ "WSF_MAX_HANDLERS=10" - ] + ], + "device_has_remove": ["ITM"] }, "SDT52832B": { "inherits": ["MCU_NRF52832"], @@ -6892,7 +6893,8 @@ "supported_form_factors": ["ARDUINO"], "inherits": ["MCU_NRF52832"], "release_versions": ["5"], - "device_name": "nRF52832_xxAA" + "device_name": "nRF52832_xxAA", + "device_has_remove": ["ITM"] }, "MCU_NRF52840": { "inherits": ["Target"], From 774ee684760ac7178f6a164412c6e056f18c8d83 Mon Sep 17 00:00:00 2001 From: jeromecoutant Date: Thu, 21 Feb 2019 16:25:20 +0100 Subject: [PATCH 105/109] STM32 LPTICKER (LPTIM): correct init execution after bootloader --- targets/TARGET_STM/lp_ticker.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/targets/TARGET_STM/lp_ticker.c b/targets/TARGET_STM/lp_ticker.c index d8704faa56..fa16a27f6e 100644 --- a/targets/TARGET_STM/lp_ticker.c +++ b/targets/TARGET_STM/lp_ticker.c @@ -59,16 +59,19 @@ const ticker_info_t *lp_ticker_get_info() volatile uint8_t lp_Fired = 0; +static int LPTICKER_inited = 0; + static void LPTIM1_IRQHandler(void); static void (*irq_handler)(void); void lp_ticker_init(void) { /* Check if LPTIM is already configured */ - if (__HAL_RCC_LPTIM1_IS_CLK_ENABLED()) { + if (LPTICKER_inited) { lp_ticker_disable_interrupt(); return; } + LPTICKER_inited = 1; RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0}; RCC_OscInitTypeDef RCC_OscInitStruct = {0}; From f5eb87c62d71c7d8974a5b9648a251238575bb57 Mon Sep 17 00:00:00 2001 From: Cruz Monrreal II Date: Thu, 21 Feb 2019 15:08:59 -0600 Subject: [PATCH 106/109] Revert "nRF52 serial: Tighten/simplify atomics" This reverts commit 2a7f5e21afe93b6ca395a6e69aa78bf6bf0cac27. --- .../TARGET_NRF5x/TARGET_NRF52/serial_api.c | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c index 4ac70d7e03..dbfd41f749 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c @@ -138,8 +138,8 @@ typedef struct { uint8_t buffer[NUMBER_OF_BANKS][DMA_BUFFER_SIZE]; uint32_t usage_counter; uint8_t tx_data; - bool tx_in_progress; - bool rx_in_progress; + volatile uint8_t tx_in_progress; + volatile uint8_t rx_in_progress; bool tx_asynch; bool rx_asynch; bool callback_posted; @@ -252,7 +252,7 @@ static void nordic_nrf5_uart_callback_handler(uint32_t instance) static void nordic_nrf5_uart_event_handler_endtx(int instance) { /* Release mutex. As the owner this call is safe. */ - core_util_atomic_store_bool(&nordic_nrf5_uart_state[instance].tx_in_progress, false); + nordic_nrf5_uart_state[instance].tx_in_progress = 0; /* Check if callback handler and Tx event mask is set. */ uart_irq_handler callback = (uart_irq_handler) nordic_nrf5_uart_state[instance].owner->handler; @@ -275,8 +275,8 @@ static void nordic_nrf5_uart_event_handler_endtx(int instance) static void nordic_nrf5_uart_event_handler_endtx_asynch(int instance) { /* Set Tx done and reset Tx mode to be not asynchronous. */ + nordic_nrf5_uart_state[instance].tx_in_progress = 0; nordic_nrf5_uart_state[instance].tx_asynch = false; - core_util_atomic_store_bool(&nordic_nrf5_uart_state[instance].tx_in_progress, false); /* Cast handler to callback function pointer. */ void (*callback)(void) = (void (*)(void)) nordic_nrf5_uart_state[instance].owner->tx_handler; @@ -482,8 +482,8 @@ static void nordic_nrf5_uart_event_handler_rxstarted(int instance) static void nordic_nrf5_uart_event_handler_endrx_asynch(int instance) { /* Set Rx done and reset Rx mode to be not asynchronous. */ + nordic_nrf5_uart_state[instance].rx_in_progress = 0; nordic_nrf5_uart_state[instance].rx_asynch = false; - core_util_atomic_store_bool(&nordic_nrf5_uart_state[instance].rx_in_progress, false); /* Cast handler to callback function pointer. */ void (*callback)(void) = (void (*)(void)) nordic_nrf5_uart_state[instance].owner->rx_handler; @@ -1410,7 +1410,7 @@ int serial_writable(serial_t *obj) int instance = uart_object->instance; - return (!core_util_atomic_load_bool(&nordic_nrf5_uart_state[instance].tx_in_progress) && + return ((nordic_nrf5_uart_state[instance].tx_in_progress == 0) && (nrf_uarte_event_extra_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY))); } @@ -1449,14 +1449,16 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx /** * tx_in_progress acts like a mutex to ensure only one transmission can be active at a time. - * The flag is modified using the atomic exchange function - only proceed when we see the - * flag clear and we set it to true. + * The flag is modified using the atomic compare-and-set function. */ - bool old_mutex; + bool mutex = false; do { - old_mutex = core_util_atomic_exchange_bool(&nordic_nrf5_uart_state[instance].tx_in_progress, true); - } while (old_mutex == true); + uint8_t expected = 0; + uint8_t desired = 1; + + mutex = core_util_atomic_cas_u8((uint8_t *) &nordic_nrf5_uart_state[instance].tx_in_progress, &expected, desired); + } while (mutex == false); /* State variables. */ int result = 0; @@ -1573,14 +1575,16 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt /** * rx_in_progress acts like a mutex to ensure only one asynchronous reception can be active at a time. - * The flag is modified using the atomic exchange function - only proceed when we see the - * flag clear and we set it to true. + * The flag is modified using the atomic compare-and-set function. */ - bool old_mutex; + bool mutex = false; do { - old_mutex = core_util_atomic_exchange_bool(&nordic_nrf5_uart_state[instance].rx_in_progress, true); - } while (old_mutex == true); + uint8_t expected = 0; + uint8_t desired = 1; + + mutex = core_util_atomic_cas_u8((uint8_t *) &nordic_nrf5_uart_state[instance].rx_in_progress, &expected, desired); + } while (mutex == false); /* Store callback handler, mask and reset event value. */ obj->serial.rx_handler = handler; @@ -1659,8 +1663,8 @@ void serial_tx_abort_asynch(serial_t *obj) nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDTX); /* Reset Tx flags. */ + nordic_nrf5_uart_state[instance].tx_in_progress = 0; nordic_nrf5_uart_state[instance].tx_asynch = false; - nordic_nrf5_uart_state[instance].tx_in_progress = false; /* Force reconfiguration. */ obj->serial.update = true; @@ -1687,8 +1691,8 @@ void serial_rx_abort_asynch(serial_t *obj) core_util_critical_section_enter(); /* Reset Rx flags. */ + nordic_nrf5_uart_state[obj->serial.instance].rx_in_progress = 0; nordic_nrf5_uart_state[obj->serial.instance].rx_asynch = false; - nordic_nrf5_uart_state[obj->serial.instance].rx_in_progress = false; obj->serial.rx_asynch = false; /* Force reconfiguration. */ From 42b1afa534dcc5f82bb0977fa1fd0b40ed0e3059 Mon Sep 17 00:00:00 2001 From: Cruz Monrreal II Date: Thu, 21 Feb 2019 22:02:23 -0600 Subject: [PATCH 107/109] Revert "support in more types then just RSA_KEYPAIR" This reverts commit 7824c793b7188c8f7b282a8e77817567f2086617. --- .../crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c b/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c index 5cc9acc2bc..d734903874 100644 --- a/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c +++ b/components/TARGET_PSA/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c @@ -1003,13 +1003,18 @@ psa_status_t psa_generate_key(psa_key_slot_t key, in_vec[1].base = &bits; in_vec[1].len = sizeof(size_t); - if (((parameters == NULL) && (parameters_size != 0)) || ((parameters != NULL) && (parameters_size == 0))) { - return (PSA_ERROR_INVALID_ARGUMENT); + /* currently the parameter argument is used only for RSA keypair + and ignored in other cases. support for other algorithms + may be added later*/ + if (PSA_KEY_TYPE_RSA_KEYPAIR == type) { + in_vec[2].base = parameters; + /* size of parameter is unsigned integer as defined in header */ + in_vec[2].len = parameters_size; + } else { // currenty ignored for non RSA case + in_vec[2].base = NULL; + in_vec[2].len = 0; } - in_vec[2].base = parameters; - in_vec[2].len = parameters_size; - handle = psa_connect(PSA_KEY_MNG_ID, MINOR_VER); if (handle <= 0) { return (PSA_ERROR_COMMUNICATION_FAILURE); From 71ebf820819c5f6e7ee19b13ba8760f6ae56d56d Mon Sep 17 00:00:00 2001 From: Cruz Monrreal II Date: Thu, 21 Feb 2019 22:14:23 -0600 Subject: [PATCH 108/109] Revert "Add MBEDTLS_ENTROPY_NV_SEED to NUCLEO_F411RE to fix the build" This reverts commit b705934b6225c1c7901e42aa12281ef3135f820a. --- targets/targets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/targets.json b/targets/targets.json index 624516df7b..723f14848d 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -2435,7 +2435,7 @@ "macro_name": "CLOCK_SOURCE_USB" } }, - "macros_add": ["USB_STM_HAL", "USBHOST_OTHER", "MBEDTLS_PSA_CRYPTO_C", "MBEDTLS_ENTROPY_NV_SEED"], + "macros_add": ["USB_STM_HAL", "USBHOST_OTHER", "MBEDTLS_PSA_CRYPTO_C"], "device_has_add": [ "SERIAL_ASYNCH", "FLASH", From b83fb2b7387298649102d3042b54063349cff371 Mon Sep 17 00:00:00 2001 From: Cruz Monrreal II Date: Thu, 21 Feb 2019 22:15:49 -0600 Subject: [PATCH 109/109] Revert "Restore MBEDTLS_PSA_CRYPTO_C for PSA targets" This reverts commit 035ecc15d633763ab8d3d60ab0869dee210e2472. --- targets/targets.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/targets/targets.json b/targets/targets.json index 723f14848d..832cfa4355 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -1743,7 +1743,7 @@ "PSA" ], "is_disk_virtual": true, - "macros": ["CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED", "MBEDTLS_PSA_CRYPTO_C"], + "macros": ["CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED"], "inherits": ["Target"], "detect_code": ["0311"], "device_has": [ @@ -2435,7 +2435,7 @@ "macro_name": "CLOCK_SOURCE_USB" } }, - "macros_add": ["USB_STM_HAL", "USBHOST_OTHER", "MBEDTLS_PSA_CRYPTO_C"], + "macros_add": ["USB_STM_HAL", "USBHOST_OTHER"], "device_has_add": [ "SERIAL_ASYNCH", "FLASH", @@ -2684,8 +2684,7 @@ "components_add": ["FLASHIAP"], "macros_add": [ "USB_STM_HAL", - "USBHOST_OTHER", - "MBEDTLS_PSA_CRYPTO_C" + "USBHOST_OTHER" ], "device_has_add": [ "ANALOGOUT", @@ -4296,9 +4295,6 @@ "device_has_remove": [], "extra_labels_add": ["PSA"], "components_add": ["FLASHIAP"], - "macros_add": [ - "MBEDTLS_PSA_CRYPTO_C" - ], "config": { "stdio_uart_tx_help": { "help": "Value: D8(default) or D1"

!CWV+o?Z<@rm+lXa%FY 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