#ifndef __HARDWARE_COMMON_H__ #define __HARDWARE_COMMON_H__ #include "reg.h" #define FW_ADDRESS (64 * 1024) #define MAGIC_HEAD (0x64616568) /* ASCII of "head" */ struct fw_header_s { uint32_t magic; 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 */ uint8_t regulator_voltage; /* 5~15 is available, Voltage = 0.05 * regulator_voltage + 0.55V */ uint8_t resv; /* flash config */ uint16_t flash_div; /* 0 is for disable, 2~65534 is available, must be even value */ /* 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__ */