mirror of
https://github.com/nodemcu/nodemcu-firmware.git
synced 2025-01-30 21:12:55 +08:00
2187424928
Added Lua module rtctime to interface with it. This keeps as accurate time as is possible on the ESP8266, including across deep sleeps (provided rtctime.dsleep() is used rather than node.dsleep()). Intended to be used together with NTP for high accuracy time keeping. The API is via rtctime.{get,set}timeofday(), working from Unix epoch. Note that 160MHz CPU clock is not currently supported by the rtctime code, as it is only aware of the 52MHz boot clock and the regular 80Mhz default clock. See rtctime.h for detailed info on how this all works.
106 lines
3.1 KiB
C
106 lines
3.1 KiB
C
// Headers to the various functions in the rom (as we discover them)
|
|
|
|
// SHA1 is assumed to match the netbsd sha1.h headers
|
|
#define SHA1_DIGEST_LENGTH 20
|
|
#define SHA1_DIGEST_STRING_LENGTH 41
|
|
|
|
typedef struct {
|
|
uint32_t state[5];
|
|
uint32_t count[2];
|
|
uint8_t buffer[64];
|
|
} SHA1_CTX;
|
|
|
|
extern void SHA1Transform(uint32_t[5], const uint8_t[64]);
|
|
extern void SHA1Init(SHA1_CTX *);
|
|
extern void SHA1Final(uint8_t[SHA1_DIGEST_LENGTH], SHA1_CTX *);
|
|
extern void SHA1Update(SHA1_CTX *, const uint8_t *, unsigned int);
|
|
|
|
|
|
// MD5 is assumed to match the NetBSD md5.h header
|
|
#define MD5_DIGEST_LENGTH 16
|
|
typedef struct
|
|
{
|
|
uint32_t state[5];
|
|
uint32_t count[2];
|
|
uint8_t buffer[64];
|
|
} MD5_CTX;
|
|
|
|
extern void MD5Init(MD5_CTX *);
|
|
extern void MD5Update(MD5_CTX *, const unsigned char *, unsigned int);
|
|
extern void MD5Final(unsigned char[MD5_DIGEST_LENGTH], MD5_CTX *);
|
|
|
|
// base64_encode/decode derived by Cal
|
|
// Appears to match base64.h from netbsd wpa utils.
|
|
extern unsigned char * base64_encode(const unsigned char *src, size_t len, size_t *out_len);
|
|
extern unsigned char * base64_decode(const unsigned char *src, size_t len, size_t *out_len);
|
|
// Unfortunately it that seems to require the ROM memory management to be
|
|
// initialized because it uses mem_malloc
|
|
|
|
extern void mem_init(void * start_addr);
|
|
|
|
// Interrupt Service Routine functions
|
|
typedef void (*ets_isr_fn) (void *arg, uint32_t sp);
|
|
extern int ets_isr_attach (unsigned int interrupt, ets_isr_fn, void *arg);
|
|
extern void ets_isr_mask (unsigned intr);
|
|
extern void ets_isr_unmask (unsigned intr);
|
|
|
|
// Cycle-counter
|
|
extern unsigned int xthal_get_ccount (void);
|
|
extern int xthal_set_ccompare (unsigned int timer_number, unsigned int compare_value);
|
|
|
|
// 2, 3 = reset (module dependent?), 4 = wdt
|
|
int rtc_get_reset_reason (void);
|
|
|
|
// Hardware exception handling
|
|
struct exception_frame
|
|
{
|
|
uint32_t epc;
|
|
uint32_t ps;
|
|
uint32_t sar;
|
|
uint32_t unused;
|
|
union {
|
|
struct {
|
|
uint32_t a0;
|
|
// note: no a1 here!
|
|
uint32_t a2;
|
|
uint32_t a3;
|
|
uint32_t a4;
|
|
uint32_t a5;
|
|
uint32_t a6;
|
|
uint32_t a7;
|
|
uint32_t a8;
|
|
uint32_t a9;
|
|
uint32_t a10;
|
|
uint32_t a11;
|
|
uint32_t a12;
|
|
uint32_t a13;
|
|
uint32_t a14;
|
|
uint32_t a15;
|
|
};
|
|
uint32_t a_reg[15];
|
|
};
|
|
uint32_t cause;
|
|
};
|
|
|
|
/**
|
|
* C-level exception handler callback prototype.
|
|
*
|
|
* Does not need an RFE instruction - it is called through a wrapper which
|
|
* performs state capture & restore, as well as the actual RFE.
|
|
*
|
|
* @param ef An exception frame containing the relevant state from the
|
|
* exception triggering. This state may be manipulated and will
|
|
* be applied on return.
|
|
* @param cause The exception cause number.
|
|
*/
|
|
typedef void (*exception_handler_fn) (struct exception_frame *ef, uint32_t cause);
|
|
|
|
/**
|
|
* Sets the exception handler function for a particular exception cause.
|
|
* @param handler The exception handler to install.
|
|
* If NULL, reverts to the XTOS default handler.
|
|
* @returns The previous exception handler, or NULL if none existed prior.
|
|
*/
|
|
exception_handler_fn _xtos_set_exception_handler (uint32_t cause, exception_handler_fn handler);
|
|
|