123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- #if defined ( __ICCARM__ )
- #pragma system_include
- #elif defined (__clang__)
- #pragma clang system_header
- #endif
- #ifndef ARM_CACHEL1_ARMV7_H
- #define ARM_CACHEL1_ARMV7_H
- #define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos)
- #define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos )
- #ifndef __SCB_DCACHE_LINE_SIZE
- #define __SCB_DCACHE_LINE_SIZE 32U
- #endif
- #ifndef __SCB_ICACHE_LINE_SIZE
- #define __SCB_ICACHE_LINE_SIZE 32U
- #endif
- __STATIC_FORCEINLINE void SCB_EnableICache (void)
- {
- #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
- if (SCB->CCR & SCB_CCR_IC_Msk) return;
- __DSB();
- __ISB();
- SCB->ICIALLU = 0UL;
- __DSB();
- __ISB();
- SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk;
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_DisableICache (void)
- {
- #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
- __DSB();
- __ISB();
- SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk;
- SCB->ICIALLU = 0UL;
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_InvalidateICache (void)
- {
- #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
- __DSB();
- __ISB();
- SCB->ICIALLU = 0UL;
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize)
- {
- #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)
- if ( isize > 0 ) {
- int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U));
- uint32_t op_addr = (uint32_t)addr ;
- __DSB();
- do {
- SCB->ICIMVAU = op_addr;
- op_addr += __SCB_ICACHE_LINE_SIZE;
- op_size -= __SCB_ICACHE_LINE_SIZE;
- } while ( op_size > 0 );
- __DSB();
- __ISB();
- }
- #endif
- }
- __STATIC_FORCEINLINE void SCB_EnableDCache (void)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- uint32_t ccsidr;
- uint32_t sets;
- uint32_t ways;
- if (SCB->CCR & SCB_CCR_DC_Msk) return;
- SCB->CSSELR = 0U;
- __DSB();
- ccsidr = SCB->CCSIDR;
-
- sets = (uint32_t)(CCSIDR_SETS(ccsidr));
- do {
- ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
- do {
- SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |
- ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) );
- #if defined ( __CC_ARM )
- __schedule_barrier();
- #endif
- } while (ways-- != 0U);
- } while(sets-- != 0U);
- __DSB();
- SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk;
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_DisableDCache (void)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- uint32_t ccsidr;
- uint32_t sets;
- uint32_t ways;
- SCB->CSSELR = 0U;
- __DSB();
- SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk;
- __DSB();
- ccsidr = SCB->CCSIDR;
-
- sets = (uint32_t)(CCSIDR_SETS(ccsidr));
- do {
- ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
- do {
- SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) |
- ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) );
- #if defined ( __CC_ARM )
- __schedule_barrier();
- #endif
- } while (ways-- != 0U);
- } while(sets-- != 0U);
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_InvalidateDCache (void)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- uint32_t ccsidr;
- uint32_t sets;
- uint32_t ways;
- SCB->CSSELR = 0U;
- __DSB();
- ccsidr = SCB->CCSIDR;
-
- sets = (uint32_t)(CCSIDR_SETS(ccsidr));
- do {
- ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
- do {
- SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |
- ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) );
- #if defined ( __CC_ARM )
- __schedule_barrier();
- #endif
- } while (ways-- != 0U);
- } while(sets-- != 0U);
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_CleanDCache (void)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- uint32_t ccsidr;
- uint32_t sets;
- uint32_t ways;
- SCB->CSSELR = 0U;
- __DSB();
- ccsidr = SCB->CCSIDR;
-
- sets = (uint32_t)(CCSIDR_SETS(ccsidr));
- do {
- ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
- do {
- SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) |
- ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) );
- #if defined ( __CC_ARM )
- __schedule_barrier();
- #endif
- } while (ways-- != 0U);
- } while(sets-- != 0U);
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- uint32_t ccsidr;
- uint32_t sets;
- uint32_t ways;
- SCB->CSSELR = 0U;
- __DSB();
- ccsidr = SCB->CCSIDR;
-
- sets = (uint32_t)(CCSIDR_SETS(ccsidr));
- do {
- ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
- do {
- SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) |
- ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) );
- #if defined ( __CC_ARM )
- __schedule_barrier();
- #endif
- } while (ways-- != 0U);
- } while(sets-- != 0U);
- __DSB();
- __ISB();
- #endif
- }
- __STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- if ( dsize > 0 ) {
- int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U));
- uint32_t op_addr = (uint32_t)addr ;
-
- __DSB();
- do {
- SCB->DCIMVAC = op_addr;
- op_addr += __SCB_DCACHE_LINE_SIZE;
- op_size -= __SCB_DCACHE_LINE_SIZE;
- } while ( op_size > 0 );
- __DSB();
- __ISB();
- }
- #endif
- }
- __STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- if ( dsize > 0 ) {
- int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U));
- uint32_t op_addr = (uint32_t)addr ;
-
- __DSB();
- do {
- SCB->DCCMVAC = op_addr;
- op_addr += __SCB_DCACHE_LINE_SIZE;
- op_size -= __SCB_DCACHE_LINE_SIZE;
- } while ( op_size > 0 );
- __DSB();
- __ISB();
- }
- #endif
- }
- __STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize)
- {
- #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
- if ( dsize > 0 ) {
- int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U));
- uint32_t op_addr = (uint32_t)addr ;
-
- __DSB();
- do {
- SCB->DCCIMVAC = op_addr;
- op_addr += __SCB_DCACHE_LINE_SIZE;
- op_size -= __SCB_DCACHE_LINE_SIZE;
- } while ( op_size > 0 );
- __DSB();
- __ISB();
- }
- #endif
- }
- #endif
|