75 lines
2.3 KiB
C
75 lines
2.3 KiB
C
|
#include "hal.h"
|
||
|
#include "uart/uart.h"
|
||
|
#include "osc.h"
|
||
|
#include "os_except.h"
|
||
|
|
||
|
#define osc_hisr_TASK_PRIORITY 31 // osc_hisr must be the highest priority task of all tasks.
|
||
|
|
||
|
/*
|
||
|
*********************************************************************************************************
|
||
|
* Overlay SRAM Controller (OSC) initialize
|
||
|
*
|
||
|
* Description : This function is called to initialize overlay SRAM controller,
|
||
|
* including setting upfixed region size and overlay region base.
|
||
|
*
|
||
|
* Arguments :
|
||
|
*
|
||
|
* Notes :
|
||
|
*********************************************************************************************************
|
||
|
*/
|
||
|
void _osc_init(void)
|
||
|
{
|
||
|
register unsigned int ovly_region_szie;
|
||
|
register unsigned int fix_regiion_size;
|
||
|
register unsigned int ovly_region_base_addr;
|
||
|
|
||
|
/* Read the initial OSC overlay region size. */
|
||
|
ovly_region_szie = (REG32(OSC_CTRL) & OSC_CTRL_OVL_SZ_MASK) >> 12;
|
||
|
|
||
|
/* Initialize OSC fix region size */
|
||
|
fix_regiion_size = OSC_EILM_SIZE - ovly_region_szie;
|
||
|
REG32(OSC_OVLFS) = fix_regiion_size;
|
||
|
|
||
|
/* Initialize OSC overlay region to the end of all overlay text. */
|
||
|
ovly_region_base_addr = fix_regiion_size + ovly_region_szie * _novlys;
|
||
|
REG32(OSC_OVLBASE) = ovly_region_base_addr;
|
||
|
}
|
||
|
|
||
|
int _osc_drv_init(void (*handler)(unsigned int ipc),
|
||
|
void (*osc_hisr)(void *arg),
|
||
|
OSC_DRV_INFO *osc_info)
|
||
|
{
|
||
|
hal_queue_t *queue = &osc_info->queue;
|
||
|
hal_thread_t *th = &osc_info->th;
|
||
|
|
||
|
// Initial the Fixed/Overlap regions.
|
||
|
_osc_init();
|
||
|
|
||
|
// Register a user-define handler which is called from OSC exception handler.
|
||
|
register_exception_handler(GE_RESERVED_INST, handler);
|
||
|
|
||
|
// Register a user-define hisr which will be woken up by lisr sending msg to queue.
|
||
|
th->fn = osc_hisr;
|
||
|
th->name = "bh_osc";
|
||
|
th->stack_size = 0x400;
|
||
|
th->arg = queue;
|
||
|
th->prio = osc_hisr_TASK_PRIORITY;
|
||
|
th->task = NULL;
|
||
|
th->ptos = NULL;
|
||
|
|
||
|
// Create a bottom half.
|
||
|
// The bottom half is a thread task with a sync queue.
|
||
|
queue->size = 1;
|
||
|
|
||
|
if(hal_create_queue(queue) == HAL_FAILURE)
|
||
|
return HAL_FAILURE;
|
||
|
|
||
|
if(hal_create_thread(th) != HAL_SUCCESS)
|
||
|
return HAL_FAILURE;
|
||
|
|
||
|
puts("OSC driver init success!\n");
|
||
|
|
||
|
return HAL_SUCCESS;
|
||
|
}
|
||
|
|