1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #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;
- }
|