81 lines
2.3 KiB
C
81 lines
2.3 KiB
C
#ifndef __HARDWARE_COMMON_H__
|
|
#define __HARDWARE_COMMON_H__
|
|
|
|
#include "reg.h"
|
|
|
|
struct fw_header_s {
|
|
uint32_t size;
|
|
uint32_t jump_address;
|
|
/* syspll config */
|
|
uint8_t syspll_refdiv; /* must be in 1~63, fref/refdiv must >= 5MHz */
|
|
uint8_t syspll_feedback; /* must be in 16~320, fvco must be in 750MHz~1600MHz */
|
|
uint8_t syspll_postdiv1; /* must be in 1~7 */
|
|
uint8_t syspll_postdiv2; /* must be in 1~7 */
|
|
/* usbpll config */
|
|
uint8_t usbpll_refdiv; /* must be in 1~63, fref/refdiv must >= 5MHz */
|
|
uint8_t usbpll_feedback; /* must be in 16~320, fvco must be in 750MHz~1600MHz */
|
|
uint8_t usbpll_postdiv1; /* must be in 1~7 */
|
|
uint8_t usbpll_postdiv2; /* must be in 1~7 */
|
|
/* system clock div */
|
|
uint32_t sysclk_div; /* 1~2^24-1 is available */
|
|
/* flash config */
|
|
uint16_t flash_div; /* 0 is for disable, 2~65534 is available, must be even value */
|
|
uint16_t flash_resv;
|
|
uint32_t resv;
|
|
/* checksum */
|
|
uint32_t checksum;
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
__attribute__ ((__always_inline__)) static inline void __sev(void) {
|
|
__asm__ volatile ("sev");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void __wfe(void) {
|
|
__asm__ volatile ("wfe");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void __wfi(void) {
|
|
__asm__ volatile ("wfi");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void __dmb(void) {
|
|
__asm__ volatile ("dmb" : : : "memory");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void __dsb(void) {
|
|
__asm__ volatile ("dsb" : : : "memory");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void __isb(void) {
|
|
__asm__ volatile ("isb");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void enable_interrupt(void) {
|
|
__asm__ volatile ("cpsie i");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void disable_interrupt(void) {
|
|
__asm__ volatile ("cpsid i");
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline uint32_t save_and_disable_interrupt(void) {
|
|
uint32_t status;
|
|
__asm__ volatile ("mrs %0, PRIMASK" : "=r" (status)::);
|
|
__asm__ volatile ("cpsid i");
|
|
return status;
|
|
}
|
|
|
|
__attribute__ ((__always_inline__)) static inline void restore_interrupt(uint32_t status) {
|
|
__asm volatile ("msr PRIMASK, %0"::"r" (status) : );
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __HARDWARE_COMMON_H__ */
|