rp2040/driver/inc/common.h

81 lines
2.3 KiB
C
Raw Normal View History

2024-03-24 20:52:55 +08:00
#ifndef __HARDWARE_COMMON_H__
#define __HARDWARE_COMMON_H__
#include "reg.h"
2025-05-11 22:30:39 +08:00
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;
};
2024-03-24 20:52:55 +08:00
#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__ */