Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.

Upstream: https://github.com/ARMmbed/DAPLink

Committer:
Pawel Zarembski
Date:
Tue Apr 07 12:55:42 2020 +0200
Revision:
0:01f31e923fe2
hani: DAPLink with reset workaround

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:01f31e923fe2 1 /**
Pawel Zarembski 0:01f31e923fe2 2 * @file rt_HAL_CM.h
Pawel Zarembski 0:01f31e923fe2 3 * @brief
Pawel Zarembski 0:01f31e923fe2 4 *
Pawel Zarembski 0:01f31e923fe2 5 * DAPLink Interface Firmware
Pawel Zarembski 0:01f31e923fe2 6 * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved
Pawel Zarembski 0:01f31e923fe2 7 * SPDX-License-Identifier: Apache-2.0
Pawel Zarembski 0:01f31e923fe2 8 *
Pawel Zarembski 0:01f31e923fe2 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Pawel Zarembski 0:01f31e923fe2 10 * not use this file except in compliance with the License.
Pawel Zarembski 0:01f31e923fe2 11 * You may obtain a copy of the License at
Pawel Zarembski 0:01f31e923fe2 12 *
Pawel Zarembski 0:01f31e923fe2 13 * http://www.apache.org/licenses/LICENSE-2.0
Pawel Zarembski 0:01f31e923fe2 14 *
Pawel Zarembski 0:01f31e923fe2 15 * Unless required by applicable law or agreed to in writing, software
Pawel Zarembski 0:01f31e923fe2 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Pawel Zarembski 0:01f31e923fe2 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Pawel Zarembski 0:01f31e923fe2 18 * See the License for the specific language governing permissions and
Pawel Zarembski 0:01f31e923fe2 19 * limitations under the License.
Pawel Zarembski 0:01f31e923fe2 20 */
Pawel Zarembski 0:01f31e923fe2 21
Pawel Zarembski 0:01f31e923fe2 22 /* Definitions */
Pawel Zarembski 0:01f31e923fe2 23 #define INITIAL_xPSR 0x01000000
Pawel Zarembski 0:01f31e923fe2 24 #define DEMCR_TRCENA 0x01000000
Pawel Zarembski 0:01f31e923fe2 25 #define ITM_ITMENA 0x00000001
Pawel Zarembski 0:01f31e923fe2 26 #define MAGIC_WORD 0xE25A2EA5
Pawel Zarembski 0:01f31e923fe2 27
Pawel Zarembski 0:01f31e923fe2 28 // ARMCC has deprecated use for ldrex and strex functions
Pawel Zarembski 0:01f31e923fe2 29 // from C so do not used them on any devices.
Pawel Zarembski 0:01f31e923fe2 30 #if (0)
Pawel Zarembski 0:01f31e923fe2 31 #define __USE_EXCLUSIVE_ACCESS
Pawel Zarembski 0:01f31e923fe2 32 #else
Pawel Zarembski 0:01f31e923fe2 33 #undef __USE_EXCLUSIVE_ACCESS
Pawel Zarembski 0:01f31e923fe2 34 #endif
Pawel Zarembski 0:01f31e923fe2 35
Pawel Zarembski 0:01f31e923fe2 36 /* NVIC registers */
Pawel Zarembski 0:01f31e923fe2 37 #define NVIC_ST_CTRL (*((volatile U32 *)0xE000E010))
Pawel Zarembski 0:01f31e923fe2 38 #define NVIC_ST_RELOAD (*((volatile U32 *)0xE000E014))
Pawel Zarembski 0:01f31e923fe2 39 #define NVIC_ST_CURRENT (*((volatile U32 *)0xE000E018))
Pawel Zarembski 0:01f31e923fe2 40 #define NVIC_ISER ((volatile U32 *)0xE000E100)
Pawel Zarembski 0:01f31e923fe2 41 #define NVIC_ICER ((volatile U32 *)0xE000E180)
Pawel Zarembski 0:01f31e923fe2 42 #if (__TARGET_ARCH_6S_M)
Pawel Zarembski 0:01f31e923fe2 43 #define NVIC_IP ((volatile U32 *)0xE000E400)
Pawel Zarembski 0:01f31e923fe2 44 #else
Pawel Zarembski 0:01f31e923fe2 45 #define NVIC_IP ((volatile U8 *)0xE000E400)
Pawel Zarembski 0:01f31e923fe2 46 #endif
Pawel Zarembski 0:01f31e923fe2 47 #define NVIC_INT_CTRL (*((volatile U32 *)0xE000ED04))
Pawel Zarembski 0:01f31e923fe2 48 #define NVIC_AIR_CTRL (*((volatile U32 *)0xE000ED0C))
Pawel Zarembski 0:01f31e923fe2 49 #define NVIC_SYS_PRI2 (*((volatile U32 *)0xE000ED1C))
Pawel Zarembski 0:01f31e923fe2 50 #define NVIC_SYS_PRI3 (*((volatile U32 *)0xE000ED20))
Pawel Zarembski 0:01f31e923fe2 51
Pawel Zarembski 0:01f31e923fe2 52 #define OS_PEND_IRQ() NVIC_INT_CTRL = (1<<28)
Pawel Zarembski 0:01f31e923fe2 53 #define OS_PENDING ((NVIC_INT_CTRL >> 26) & (1<<2 | 1))
Pawel Zarembski 0:01f31e923fe2 54 #define OS_UNPEND(fl) NVIC_INT_CTRL = (*fl = OS_PENDING) << 25
Pawel Zarembski 0:01f31e923fe2 55 #define OS_PEND(fl,p) NVIC_INT_CTRL = (fl | p<<2) << 26
Pawel Zarembski 0:01f31e923fe2 56 #define OS_LOCK() NVIC_ST_CTRL = 0x0005
Pawel Zarembski 0:01f31e923fe2 57 #define OS_UNLOCK() NVIC_ST_CTRL = 0x0007
Pawel Zarembski 0:01f31e923fe2 58
Pawel Zarembski 0:01f31e923fe2 59 #define OS_X_PENDING ((NVIC_INT_CTRL >> 28) & 1)
Pawel Zarembski 0:01f31e923fe2 60 #define OS_X_UNPEND(fl) NVIC_INT_CTRL = (*fl = OS_X_PENDING) << 27
Pawel Zarembski 0:01f31e923fe2 61 #define OS_X_PEND(fl,p) NVIC_INT_CTRL = (fl | p) << 28
Pawel Zarembski 0:01f31e923fe2 62 #if (__TARGET_ARCH_6S_M)
Pawel Zarembski 0:01f31e923fe2 63 #define OS_X_INIT(n) NVIC_IP[n>>2] |= 0xFF << (8*(n & 0x03)); \
Pawel Zarembski 0:01f31e923fe2 64 NVIC_ISER[n>>5] = 1 << (n & 0x1F)
Pawel Zarembski 0:01f31e923fe2 65 #else
Pawel Zarembski 0:01f31e923fe2 66 #define OS_X_INIT(n) NVIC_IP[n] = 0xFF; \
Pawel Zarembski 0:01f31e923fe2 67 NVIC_ISER[n>>5] = 1 << (n & 0x1F)
Pawel Zarembski 0:01f31e923fe2 68 #endif
Pawel Zarembski 0:01f31e923fe2 69 #define OS_X_LOCK(n) NVIC_ICER[n>>5] = 1 << (n & 0x1F)
Pawel Zarembski 0:01f31e923fe2 70 #define OS_X_UNLOCK(n) NVIC_ISER[n>>5] = 1 << (n & 0x1F)
Pawel Zarembski 0:01f31e923fe2 71
Pawel Zarembski 0:01f31e923fe2 72 /* Core Debug registers */
Pawel Zarembski 0:01f31e923fe2 73 #define DEMCR (*((volatile U32 *)0xE000EDFC))
Pawel Zarembski 0:01f31e923fe2 74
Pawel Zarembski 0:01f31e923fe2 75 /* ITM registers */
Pawel Zarembski 0:01f31e923fe2 76 #define ITM_CONTROL (*((volatile U32 *)0xE0000E80))
Pawel Zarembski 0:01f31e923fe2 77 #define ITM_ENABLE (*((volatile U32 *)0xE0000E00))
Pawel Zarembski 0:01f31e923fe2 78 #define ITM_PORT30_U32 (*((volatile U32 *)0xE0000078))
Pawel Zarembski 0:01f31e923fe2 79 #define ITM_PORT31_U32 (*((volatile U32 *)0xE000007C))
Pawel Zarembski 0:01f31e923fe2 80 #define ITM_PORT31_U16 (*((volatile U16 *)0xE000007C))
Pawel Zarembski 0:01f31e923fe2 81 #define ITM_PORT31_U8 (*((volatile U8 *)0xE000007C))
Pawel Zarembski 0:01f31e923fe2 82
Pawel Zarembski 0:01f31e923fe2 83 /* Variables */
Pawel Zarembski 0:01f31e923fe2 84 extern BIT dbg_msg;
Pawel Zarembski 0:01f31e923fe2 85
Pawel Zarembski 0:01f31e923fe2 86 /* Functions */
Pawel Zarembski 0:01f31e923fe2 87 #ifdef __USE_EXCLUSIVE_ACCESS
Pawel Zarembski 0:01f31e923fe2 88 #define rt_inc(p) while(__strex((__ldrex(p)+1),p))
Pawel Zarembski 0:01f31e923fe2 89 #define rt_dec(p) while(__strex((__ldrex(p)-1),p))
Pawel Zarembski 0:01f31e923fe2 90 #else
Pawel Zarembski 0:01f31e923fe2 91 #define rt_inc(p) __disable_irq();(*p)++;__enable_irq();
Pawel Zarembski 0:01f31e923fe2 92 #define rt_dec(p) __disable_irq();(*p)--;__enable_irq();
Pawel Zarembski 0:01f31e923fe2 93 #endif
Pawel Zarembski 0:01f31e923fe2 94
Pawel Zarembski 0:01f31e923fe2 95 static inline U32 rt_inc_qi (U32 size, U8 *count, U8 *first) {
Pawel Zarembski 0:01f31e923fe2 96 U32 cnt,c2;
Pawel Zarembski 0:01f31e923fe2 97 #ifdef __USE_EXCLUSIVE_ACCESS
Pawel Zarembski 0:01f31e923fe2 98 do {
Pawel Zarembski 0:01f31e923fe2 99 if ((cnt = __ldrex(count)) == size) {
Pawel Zarembski 0:01f31e923fe2 100 __clrex();
Pawel Zarembski 0:01f31e923fe2 101 return (cnt); }
Pawel Zarembski 0:01f31e923fe2 102 } while (__strex(cnt+1, count));
Pawel Zarembski 0:01f31e923fe2 103 do {
Pawel Zarembski 0:01f31e923fe2 104 c2 = (cnt = __ldrex(first)) + 1;
Pawel Zarembski 0:01f31e923fe2 105 if (c2 == size) c2 = 0;
Pawel Zarembski 0:01f31e923fe2 106 } while (__strex(c2, first));
Pawel Zarembski 0:01f31e923fe2 107 #else
Pawel Zarembski 0:01f31e923fe2 108 __disable_irq();
Pawel Zarembski 0:01f31e923fe2 109 if ((cnt = *count) < size) {
Pawel Zarembski 0:01f31e923fe2 110 *count = cnt+1;
Pawel Zarembski 0:01f31e923fe2 111 c2 = (cnt = *first) + 1;
Pawel Zarembski 0:01f31e923fe2 112 if (c2 == size) c2 = 0;
Pawel Zarembski 0:01f31e923fe2 113 *first = c2;
Pawel Zarembski 0:01f31e923fe2 114 }
Pawel Zarembski 0:01f31e923fe2 115 __enable_irq ();
Pawel Zarembski 0:01f31e923fe2 116 #endif
Pawel Zarembski 0:01f31e923fe2 117 return (cnt);
Pawel Zarembski 0:01f31e923fe2 118 }
Pawel Zarembski 0:01f31e923fe2 119
Pawel Zarembski 0:01f31e923fe2 120 static inline void rt_systick_init (void) {
Pawel Zarembski 0:01f31e923fe2 121 NVIC_ST_RELOAD = os_trv;
Pawel Zarembski 0:01f31e923fe2 122 NVIC_ST_CURRENT = 0;
Pawel Zarembski 0:01f31e923fe2 123 NVIC_ST_CTRL = 0x0007;
Pawel Zarembski 0:01f31e923fe2 124 NVIC_SYS_PRI3 |= 0xFF000000;
Pawel Zarembski 0:01f31e923fe2 125 }
Pawel Zarembski 0:01f31e923fe2 126
Pawel Zarembski 0:01f31e923fe2 127 static inline void rt_svc_init (void) {
Pawel Zarembski 0:01f31e923fe2 128 #if !(__TARGET_ARCH_6S_M)
Pawel Zarembski 0:01f31e923fe2 129 int sh,prigroup;
Pawel Zarembski 0:01f31e923fe2 130 #endif
Pawel Zarembski 0:01f31e923fe2 131 NVIC_SYS_PRI3 |= 0x00FF0000;
Pawel Zarembski 0:01f31e923fe2 132 #if (__TARGET_ARCH_6S_M)
Pawel Zarembski 0:01f31e923fe2 133 NVIC_SYS_PRI2 |= (NVIC_SYS_PRI3<<(8+1)) & 0xFC000000;
Pawel Zarembski 0:01f31e923fe2 134 #else
Pawel Zarembski 0:01f31e923fe2 135 sh = 8 - __clz (~((NVIC_SYS_PRI3 << 8) & 0xFF000000));
Pawel Zarembski 0:01f31e923fe2 136 prigroup = ((NVIC_AIR_CTRL >> 8) & 0x07);
Pawel Zarembski 0:01f31e923fe2 137 if (prigroup >= sh) {
Pawel Zarembski 0:01f31e923fe2 138 sh = prigroup + 1;
Pawel Zarembski 0:01f31e923fe2 139 }
Pawel Zarembski 0:01f31e923fe2 140 NVIC_SYS_PRI2 = ((0xFEFFFFFF << sh) & 0xFF000000) | (NVIC_SYS_PRI2 & 0x00FFFFFF);
Pawel Zarembski 0:01f31e923fe2 141 #endif
Pawel Zarembski 0:01f31e923fe2 142 }
Pawel Zarembski 0:01f31e923fe2 143
Pawel Zarembski 0:01f31e923fe2 144 extern void rt_init_stack (P_TCB p_TCB, FUNCP task_body);
Pawel Zarembski 0:01f31e923fe2 145 extern void rt_set_PSP (U32 stack);
Pawel Zarembski 0:01f31e923fe2 146 extern U32 rt_get_PSP (void);
Pawel Zarembski 0:01f31e923fe2 147 extern void os_set_env (void);
Pawel Zarembski 0:01f31e923fe2 148 extern void *_alloc_box (void *box_mem);
Pawel Zarembski 0:01f31e923fe2 149 extern int _free_box (void *box_mem, void *box);
Pawel Zarembski 0:01f31e923fe2 150
Pawel Zarembski 0:01f31e923fe2 151 extern void dbg_init (void);
Pawel Zarembski 0:01f31e923fe2 152 extern void dbg_task_notify (P_TCB p_tcb, BOOL create);
Pawel Zarembski 0:01f31e923fe2 153 extern void dbg_task_switch (U32 task_id);
Pawel Zarembski 0:01f31e923fe2 154
Pawel Zarembski 0:01f31e923fe2 155 #ifdef DBG_MSG
Pawel Zarembski 0:01f31e923fe2 156 #define DBG_INIT() dbg_init()
Pawel Zarembski 0:01f31e923fe2 157 #define DBG_TASK_NOTIFY(p_tcb,create) if (dbg_msg) dbg_task_notify(p_tcb,create)
Pawel Zarembski 0:01f31e923fe2 158 #define DBG_TASK_SWITCH(task_id) if (dbg_msg && (os_tsk.new!=os_tsk.run)) \
Pawel Zarembski 0:01f31e923fe2 159 dbg_task_switch(task_id)
Pawel Zarembski 0:01f31e923fe2 160 #else
Pawel Zarembski 0:01f31e923fe2 161 #define DBG_INIT()
Pawel Zarembski 0:01f31e923fe2 162 #define DBG_TASK_NOTIFY(p_tcb,create)
Pawel Zarembski 0:01f31e923fe2 163 #define DBG_TASK_SWITCH(task_id)
Pawel Zarembski 0:01f31e923fe2 164 #endif
Pawel Zarembski 0:01f31e923fe2 165
Pawel Zarembski 0:01f31e923fe2 166 /*----------------------------------------------------------------------------
Pawel Zarembski 0:01f31e923fe2 167 * end of file
Pawel Zarembski 0:01f31e923fe2 168 *---------------------------------------------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 169