Skip to content
Snippets Groups Projects
common.h 1.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • #pragma once
    #include "epicardium.h"
    
    
    #include <stdint.h>
    
    #include <stdbool.h>
    
    
    /*
     * Semaphore used for API synchronization.
     * TODO: Replace this with a LDREX/STREX based implementation
     */
    
    #define _API_SEMAPHORE        0
    #define _CONTROL_SEMAPHORE    1
    
    
    /* Type of API IDs */
    
    rahix's avatar
    rahix committed
    typedef uint32_t api_id_t;
    
    
    #define _API_FLAG_IDLE        0
    #define _API_FLAG_CALLING     1
    #define _API_FLAG_RETURNED    2
    
    /* Layout of the shared memory for API calls */
    struct api_call_mem {
    
    	/*
    	 * Reset stub.  The reset stub is a small function provided by
    	 * epicardium that should be called by a payload when receiving the
    	 * reset interrupt.
    	 */
    	void (*reset_stub)();
    
    
    	/*
    	 * Flag for synchronization of API calls.  When this flag
    	 * is set, the caller has issued a call and is waiting for
    	 * the dispatcher to reset the flag.
    	 */
    	uint8_t call_flag;
    
    	/* ID if the ongoing API call */
    	api_id_t id;
    
    
    	/* ID of the current interrupt */
    
    	volatile api_int_id_t int_id;
    
    	/*
    	 * Buffer for arguments/return value.  This buffer will be
    	 * *overflown*, because there is guaranteed space behind it.
    	 *
    	 * TODO: Add a maximum bounds check
    	 */
    	uint8_t buffer[1];
    };
    
    /* TODO: Make this address part of the linker script */
    static __attribute__((unused)) struct api_call_mem* API_CALL_MEM =
    	(struct api_call_mem*)0x20080000;