131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Copyright (c) 2006-2021, RT-Thread Development Team | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||
|  |  * | ||
|  |  * Change Logs: | ||
|  |  * Date           Author       Notes | ||
|  |  * 2006-03-18     Bernard      the first version | ||
|  |  * 2006-04-25     Bernard      add rt_hw_context_switch_interrupt declaration | ||
|  |  * 2006-09-24     Bernard      add rt_hw_context_switch_to declaration | ||
|  |  * 2012-12-29     Bernard      add rt_hw_exception_install declaration | ||
|  |  * 2017-10-17     Hichard      add some micros | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef __RT_HW_H__
 | ||
|  | #define __RT_HW_H__
 | ||
|  | 
 | ||
|  | #include <rtthread.h>
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Some macros define | ||
|  |  */ | ||
|  | #ifndef HWREG32
 | ||
|  | #define HWREG32(x)          (*((volatile rt_uint32_t *)(x)))
 | ||
|  | #endif
 | ||
|  | #ifndef HWREG16
 | ||
|  | #define HWREG16(x)          (*((volatile rt_uint16_t *)(x)))
 | ||
|  | #endif
 | ||
|  | #ifndef HWREG8
 | ||
|  | #define HWREG8(x)           (*((volatile rt_uint8_t *)(x)))
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef RT_CPU_CACHE_LINE_SZ
 | ||
|  | #define RT_CPU_CACHE_LINE_SZ    32
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | enum RT_HW_CACHE_OPS | ||
|  | { | ||
|  |     RT_HW_CACHE_FLUSH      = 0x01, | ||
|  |     RT_HW_CACHE_INVALIDATE = 0x02, | ||
|  | }; | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * CPU interfaces | ||
|  |  */ | ||
|  | void rt_hw_cpu_icache_enable(void); | ||
|  | void rt_hw_cpu_icache_disable(void); | ||
|  | rt_base_t rt_hw_cpu_icache_status(void); | ||
|  | void rt_hw_cpu_icache_ops(int ops, void* addr, int size); | ||
|  | 
 | ||
|  | void rt_hw_cpu_dcache_enable(void); | ||
|  | void rt_hw_cpu_dcache_disable(void); | ||
|  | rt_base_t rt_hw_cpu_dcache_status(void); | ||
|  | void rt_hw_cpu_dcache_ops(int ops, void* addr, int size); | ||
|  | 
 | ||
|  | void rt_hw_cpu_reset(void); | ||
|  | void rt_hw_cpu_shutdown(void); | ||
|  | 
 | ||
|  | rt_uint8_t *rt_hw_stack_init(void       *entry, | ||
|  |                              void       *parameter, | ||
|  |                              rt_uint8_t *stack_addr, | ||
|  |                              void       *exit); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Interrupt handler definition | ||
|  |  */ | ||
|  | typedef void (*rt_isr_handler_t)(int vector, void *param); | ||
|  | 
 | ||
|  | struct rt_irq_desc | ||
|  | { | ||
|  |     rt_isr_handler_t handler; | ||
|  |     void            *param; | ||
|  | 
 | ||
|  | #ifdef RT_USING_INTERRUPT_INFO
 | ||
|  |     char             name[RT_NAME_MAX]; | ||
|  |     rt_uint32_t      counter; | ||
|  | #endif
 | ||
|  | }; | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Interrupt interfaces | ||
|  |  */ | ||
|  | void rt_hw_interrupt_init(void); | ||
|  | void rt_hw_interrupt_mask(int vector); | ||
|  | void rt_hw_interrupt_umask(int vector); | ||
|  | rt_isr_handler_t rt_hw_interrupt_install(int              vector, | ||
|  |                                          rt_isr_handler_t handler, | ||
|  |                                          void            *param, | ||
|  |                                          const char      *name); | ||
|  | 
 | ||
|  | rt_base_t rt_hw_interrupt_disable(void); | ||
|  | void rt_hw_interrupt_enable(rt_base_t level); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Context interfaces | ||
|  |  */ | ||
|  | void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to); | ||
|  | void rt_hw_context_switch_to(rt_ubase_t to); | ||
|  | void rt_hw_context_switch_interrupt(rt_ubase_t from, rt_ubase_t to); | ||
|  | 
 | ||
|  | void rt_hw_console_output(const char *str); | ||
|  | 
 | ||
|  | void rt_hw_backtrace(rt_uint32_t *fp, rt_ubase_t thread_entry); | ||
|  | void rt_hw_show_memory(rt_uint32_t addr, rt_size_t size); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Exception interfaces | ||
|  |  */ | ||
|  | void rt_hw_exception_install(rt_err_t (*exception_handle)(void *context)); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * delay interfaces | ||
|  |  */ | ||
|  | void rt_hw_us_delay(rt_uint32_t us); | ||
|  | 
 | ||
|  | #define RT_DEFINE_SPINLOCK(x)
 | ||
|  | #define RT_DECLARE_SPINLOCK(x)    rt_ubase_t x
 | ||
|  | 
 | ||
|  | #define rt_hw_spin_lock(lock)     *(lock) = rt_hw_interrupt_disable()
 | ||
|  | #define rt_hw_spin_unlock(lock)   rt_hw_interrupt_enable(*(lock))
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif
 |