Skip to content
Snippets Groups Projects
Select Git revision
  • 5fb2441afd4b5d08fcb8a0b85e30b2539f1ed03e
  • master default protected
  • ecg-ledupdate
  • ecg-app-pause
  • ecg-app
  • remove-debug-bhi160
  • docs-power
  • clock-colors
  • ble-text-color
  • menu-timeout
  • update-menu
  • rahix/batt
  • genofire/ble-rewrite
  • renze/safe_mode
  • renze/hatchery_apps
  • schneider/fundamental-test
  • koalo/factory-reset
  • ios-workarounds
  • msgctl/gfx_rle
  • msgctl/faultscreen
  • msgctl/textbuffer_api
  • v1.1
  • v1.0
  • release-1
  • bootloader-v1
  • v0.0
26 results

caller.c

Blame
  • Forked from card10 / firmware
    Source project has a limited visibility.
    caller.c 1.15 KiB
    #include <stdlib.h>
    #include "sema.h"
    #include "api/caller.h"
    
    #define MXC_ASSERT_ENABLE
    #include "mxc_assert.h"
    
    void *_api_call_start(api_id_t id, uintptr_t size)
    {
    	GPIO_OutSet(&debug_pin_1);
    	while (SEMA_GetSema(_API_SEMAPHORE) == E_BUSY) {
    	}
    
    	if (API_CALL_MEM->call_flag != _API_FLAG_IDLE) {
    		/*
    		 * The only way this can happen is if a call was issued from an
    		 * interrupt hander while another call is still happening.  This
    		 * has to be prevented at all cost!
    		 */
    		mxc_assert(
    			"API recalled during ongoing call!",
    			__FILE__,
    			__LINE__
    		);
    	}
    
    	API_CALL_MEM->id = id;
    	return API_CALL_MEM->buffer;
    }
    
    void *_api_call_transact(void *buffer)
    {
    	API_CALL_MEM->call_flag = _API_FLAG_CALLING;
    	SEMA_FreeSema(_API_SEMAPHORE);
    
    	GPIO_OutSet(&debug_pin_0);
    	/* Notify the dispather of the new call */
    	__SEV();
    	__WFE();
    
    	while (1) {
    		/* Wait for the dispather to return */
    		__WFE();
    
    		while (SEMA_GetSema(_API_SEMAPHORE) == E_BUSY) {
    		}
    		if (API_CALL_MEM->call_flag == _API_FLAG_RETURNED) {
    			break;
    		}
    		SEMA_FreeSema(_API_SEMAPHORE);
    	}
    
    	API_CALL_MEM->call_flag = _API_FLAG_IDLE;
    	SEMA_FreeSema(_API_SEMAPHORE);
    
    	return API_CALL_MEM->buffer;
    }