rp2040/driver/inc/common.h
2025-06-02 12:57:09 +08:00

85 lines
2.5 KiB
C

#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__ */