diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-11-15 10:55:02 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-11-15 10:55:02 +0000 |
commit | ddd5640ff64895e7d937bf69d8d8f8ffc507aad9 (patch) | |
tree | e05873b61dbe6b17b253c92f3d74dfbacb34aa9a /c/src/lib/libbsp/powerpc/gen5200/bestcomm | |
parent | 2010-11-12 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-ddd5640ff64895e7d937bf69d8d8f8ffc507aad9.tar.bz2 |
2010-11-12 Sebastian Huber <sebastian.huber@embedded-brains.de>
* make/custom/dp2.cfg, startup/linkcmds.dp2: New files.
* Makefile.am, preinstall.am: Reflect change above. Install
<bsp/utility.h>. Install BestComm header files.
* configure.ac: Changed BSP options.
* include/mpc5200.h: Added module structures and register defines.
* bestcomm/bestcomm_api.c, bestcomm/bestcomm_api.h,
bestcomm/bestcomm_glue.c, bestcomm/bestcomm_glue.h,
bestcomm/bestcomm_priv.h, bestcomm/load_task.c,
bestcomm/tasksetup_bdtable.c, bestcomm/task_api/bestcomm_cntrl.h: C++
compatibility. Use special heap to manage the SRAM region. Use
interrupt extension API. Fixed warnings.
* console/console.c: Fixed console registration. Fixed warnings.
Added GPS module registration.
* ide/pcmcia_ide.h: Fixed clock value macros.
* ide/pcmcia_ide.c: Update for BestComm API changes.
DP2 specific initialization. Removed zero loop in PIO receive
function.
* include/bsp.h: Added DP2 variant. Removed obsolete defines.
* include/mscan-base.h, mscan/mscan-base.c: Use volatile qualifier.
Format.
* irq/irq.c: Fixed peripheral interrupt handling.
* network_5200/network.c: Update for BestComm API changes.
* start/start.S: U-Boot fixes.
* startup/cpuinit.c: Enable write-back cache strategy. Added special
memory regions.
* startup/linkcmds.brs5l: Fixed memory size.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/gen5200/bestcomm')
8 files changed, 138 insertions, 162 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c index 42488cb87b..171882b803 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c @@ -70,11 +70,6 @@ uint8 *MBarGlobal; sint64 MBarPhysOffsetGlobal; /* - * Offset to free space in SRAM after task code and buffer descriptors. - */ -uint32 SramOffsetGlobal = 0; - -/* * This flag is false when TaskStart() has not yet been called on a * task newly configured by TaskSetup() or TaskStop() has been called. * Otherwise it is true. It is possible that a task disabled itself @@ -185,48 +180,6 @@ int TasksAttachImage(sdma_regs *sdma) } /*! - * \brief This function returns the value of the internal variable - * used to keep track of used space in SRAM. - * - * \returns The number of bytes from the beginning of SRAM to the end - * used space in the SRAM. - * - * This function will return the offset to free space in the SRAM - * not used by the CAPI. \b Note: The returned value is based - * on what is in TasksSetSramOffset. This function can - * not determine what SRAM space was used by another process. There must - * be some way external to the CAPI to keep track of SRAM space. This - * function only returns the internal variable used to keep track of buffer - * descriptors. - */ -uint32 TasksGetSramOffset(void) -{ - return SramOffsetGlobal; -} - -/*! - * \brief This function stores the number of bytes from the - * beginning of SRAM to the end of the used space. - * - * \param sram_offset Number of bytes until the beginning of - * free space in the SRAM. - * - * This function sets the free space offset in SRAM. It must be called - * before setup in multi-task environments. It is the application's - * job to determine where the free space in SRAM is. This sets the - * base offset for the buffer descriptor variables during setup, so to - * deallocate buffers that have already been set this function should be - * called with a new offset. - */ -void TasksSetSramOffset(uint32 sram_offset) -{ - /* - * Set the SramOffsetGlobal variable to be used by TaskSetup_BDTable - */ - SramOffsetGlobal = sram_offset; -} - -/*! * \brief Start an initialized task running. * \param taskId Task handle passed back from a successful TaskSetup() * \param autoStartEnable Boolean for whether autostart bit is enabled. diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h index f4dfa68fde..f1fa22d1d5 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h @@ -36,12 +36,18 @@ * linked. */ +#include <rtems.h> + #include "include/ppctypes.h" #include "include/mgt5200/sdma.h" #include "task_api/tasksetup_bdtable.h" #include "task_api/bestcomm_cntrl.h" #include "task_api/bestcomm_api_mem.h" +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + /*! * \brief TaskSetup() debugging * @@ -271,8 +277,10 @@ typedef struct { * TaskId TaskSetup( TaskName_t TaskName, * TaskSetupParamSet_t *TaskSetupParams ); */ -#define TaskSetup(TaskName, TaskSetupParams) \ +#define TaskSetupHelper(TaskName, TaskSetupParams) \ TaskSetup_ ## TaskName (TaskName ## _api, TaskSetupParams) +#define TaskSetup(TaskName, TaskSetupParams) \ + TaskSetupHelper(TaskName, TaskSetupParams) const char *TaskVersion(void); @@ -283,9 +291,6 @@ int TasksInitAPI_VM(uint8 *MBarRef, uint8 *MBarPhys); void TasksLoadImage(sdma_regs *sdma); int TasksAttachImage(sdma_regs *sdma); -uint32 TasksGetSramOffset(void); -void TasksSetSramOffset(uint32 sram_offset); - int TaskStart(TaskId taskId, uint32 autoStartEnable, TaskId autoStartTask, uint32 intrEnable); int TaskStop(TaskId taskId); @@ -327,7 +332,7 @@ static inline int TaskStatus(TaskId taskId) */ static inline TaskBD_t *TaskGetBD(TaskId taskId, BDIdx bd) { - TaskBD_t *bdTab; + void *bdTab; bdTab = TaskBDIdxTable[taskId].BDTablePtr; if (TaskBDIdxTable[taskId].numPtr == 1) { @@ -350,7 +355,7 @@ static inline TaskBD_t *TaskGetBD(TaskId taskId, BDIdx bd) */ static inline TaskBD_t *TaskGetBDRing(TaskId taskId) { - return TaskBDIdxTable[taskId].BDTablePtr; + return (TaskBD_t *) TaskBDIdxTable[taskId].BDTablePtr; } /*! @@ -448,4 +453,8 @@ static inline uint16 TaskBDInUse(TaskId taskId) return TaskBDIdxTable[taskId].currBDInUse; } +#ifdef __cplusplus +} +#endif /* __cplusplus */ + #endif /* __BESTCOMM_API_H */ diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c index d1c01336b1..db2223ea87 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c @@ -16,8 +16,8 @@ +-----------------------------------------------------------------+ | this file contains glue functions to the Freescale BestComm API | \*===============================================================*/ +#include <assert.h> #include <rtems.h> -#include <rtems/error.h> #include <bsp.h> #include <bsp/irq.h> #include "../include/mpc5200.h" @@ -28,6 +28,10 @@ #include "bestcomm_glue.h" #include "include/mgt5200/sdma.h" +extern const uint32 taskTableBytes; + +static Heap_Control bestcomm_heap; + /*=========================================================================*\ | Function: | \*-------------------------------------------------------------------------*/ @@ -46,15 +50,12 @@ void bestcomm_glue_irq_enable | none | \*=========================================================================*/ { - rtems_interrupt_level level; if (0 != ((1UL<<bestcomm_taskno) & SDMA_INT_BIT_IMPL)) { - rtems_interrupt_disable(level); /* * valid task number * enable interrupt in bestcomm mask */ - SDMA_INT_ENABLE(&mpc5200.IntMask,bestcomm_taskno); - rtems_interrupt_enable(level); + SDMA_INT_ENABLE(&mpc5200.sdma.IntMask,bestcomm_taskno); } } @@ -76,24 +77,21 @@ void bestcomm_glue_irq_disable | none | \*=========================================================================*/ { - rtems_interrupt_level level; if (0 != ((1UL<<bestcomm_taskno) & SDMA_INT_BIT_IMPL)) { - rtems_interrupt_disable(level); /* * valid task number * disable interrupt in bestcomm mask */ - SDMA_INT_DISABLE(&mpc5200.IntMask,bestcomm_taskno); - rtems_interrupt_enable(level); + SDMA_INT_DISABLE(&mpc5200.sdma.IntMask,bestcomm_taskno); } } typedef struct { - void (*the_handler)(rtems_irq_hdl_param); - rtems_irq_hdl_param the_param; + rtems_interrupt_handler handler; + void *arg; } bestcomm_glue_irq_handlers_t; -bestcomm_glue_irq_handlers_t bestcomm_glue_irq_handlers[32]; +static bestcomm_glue_irq_handlers_t bestcomm_glue_irq_handlers[32]; /*=========================================================================*\ | Function: | @@ -107,8 +105,8 @@ void bestcomm_glue_irq_install | Input Parameters: | \*-------------------------------------------------------------------------*/ int bestcomm_taskno, /* task number for handler */ - void (*the_handler)(rtems_irq_hdl_param), /* function to call */ - rtems_irq_hdl_param the_param + rtems_interrupt_handler handler, /* function to call */ + void *arg ) /*-------------------------------------------------------------------------*\ | Return Value: | @@ -120,8 +118,8 @@ void bestcomm_glue_irq_install * valid task number * install handler */ - bestcomm_glue_irq_handlers[bestcomm_taskno].the_handler = the_handler; - bestcomm_glue_irq_handlers[bestcomm_taskno].the_param = the_param; + bestcomm_glue_irq_handlers[bestcomm_taskno].handler = handler; + bestcomm_glue_irq_handlers[bestcomm_taskno].arg = arg; } } @@ -136,8 +134,7 @@ void bestcomm_glue_irq_dispatcher +---------------------------------------------------------------------------+ | Input Parameters: | \*-------------------------------------------------------------------------*/ - rtems_irq_hdl_param handle /* irq specific handle (not used) */ - + void *arg /* irq specific handle (not used) */ ) /*-------------------------------------------------------------------------*\ | Return Value: | @@ -147,23 +144,23 @@ void bestcomm_glue_irq_dispatcher uint32_t pending; int curr_taskno; - pending = mpc5200.IntPend & ~mpc5200.IntMask; + pending = mpc5200.sdma.IntPend & ~mpc5200.sdma.IntMask; curr_taskno = 0; while (pending != 0) { if ((pending & (1UL<<curr_taskno)) != 0) { - if (bestcomm_glue_irq_handlers[curr_taskno].the_handler == NULL) { + if (bestcomm_glue_irq_handlers[curr_taskno].handler != NULL) { /* - * This should never happen. we have a pending IRQ but no handler - * let's clear this pending bit + * call proper handler */ - SDMA_CLEAR_IEVENT(&mpc5200.IntPend,curr_taskno); + bestcomm_glue_irq_handlers[curr_taskno].handler + (bestcomm_glue_irq_handlers[curr_taskno].arg); } else { /* - * call proper handler + * This should never happen. we have a pending IRQ but no handler + * let's clear this pending bit */ - bestcomm_glue_irq_handlers[curr_taskno].the_handler - (bestcomm_glue_irq_handlers[curr_taskno].the_param); + SDMA_CLEAR_IEVENT(&mpc5200.sdma.IntPend,curr_taskno); } /* * clear this bit in our pending copy @@ -175,32 +172,6 @@ void bestcomm_glue_irq_dispatcher } } -void bestcomm_glue_on(const rtems_irq_connect_data* ptr) - { - } - - -void bestcomm_glue_isOn(const rtems_irq_connect_data* ptr) - { - /*return BSP_irq_enabled_at_cpm(ptr->name);*/ - } - - -void bestcomm_glue_off(const rtems_irq_connect_data* ptr) - { - } - -static rtems_irq_connect_data bestcomm_glue_irq_data = - { - - BSP_SIU_IRQ_SMARTCOMM, - (rtems_irq_hdl) bestcomm_glue_irq_dispatcher, - (rtems_irq_hdl_param) NULL, - (rtems_irq_enable) bestcomm_glue_on, - (rtems_irq_disable) bestcomm_glue_off, - (rtems_irq_is_enabled) bestcomm_glue_isOn - }; - static bool bestcomm_glue_is_initialized = false; /*=========================================================================*\ | Function: | @@ -224,12 +195,24 @@ void bestcomm_glue_init | none | \*=========================================================================*/ { + rtems_status_code sc = RTEMS_SUCCESSFUL; + uintptr_t heap_status = 0; + if (!bestcomm_glue_is_initialized) { bestcomm_glue_is_initialized = true; + + heap_status = _Heap_Initialize( + &bestcomm_heap, + (char *) &mpc5200.sram [0] + taskTableBytes, + sizeof(mpc5200.sram) - taskTableBytes, + 4 + ); + assert(heap_status != 0); + /* * Set task bar to begin of sram */ - mpc5200.taskBar = (uint32_t)(&(mpc5200.sram[0])); + mpc5200.sdma.taskBar = (uint32_t)(&(mpc5200.sram[0])); #if 0 /* @@ -244,18 +227,35 @@ void bestcomm_glue_init * the COMM bus. (Yes, _PE -- prefetch enable -- should probably be * named _PD.) */ - mpc5200.PtdCntrl |= SDMA_PTDCNTRL_PE; + mpc5200.sdma.PtdCntrl |= SDMA_PTDCNTRL_PE; TasksInitAPI((uint8*)&mpc5200); - TasksLoadImage( (void *)&(mpc5200.taskBar)); + TasksLoadImage( (void *)&(mpc5200.sdma.taskBar)); /* * initialize interrupt dispatcher */ - if(!BSP_install_rtems_irq_handler (&bestcomm_glue_irq_data)) { - rtems_panic ("Can't attach MPC5x00 BestComm interrupt handler\n"); - } + sc = rtems_interrupt_handler_install( + BSP_SIU_IRQ_SMARTCOMM, + "BESTCOMM", + RTEMS_INTERRUPT_UNIQUE, + bestcomm_glue_irq_dispatcher, + NULL + ); + assert(sc == RTEMS_SUCCESSFUL); + } +} +void *bestcomm_malloc(size_t size) +{ + return _Heap_Allocate(&bestcomm_heap, size); +} + +void bestcomm_free(void *ptr) +{ + if (ptr != NULL) { + bool ok = _Heap_Free(&bestcomm_heap, ptr); + assert(ok); } } diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h index 13c3687fc0..aa78ce3209 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h @@ -19,7 +19,11 @@ #ifndef _BESTCOMM_GLUE_H #define _BESTCOMM_GLUE_H -#include <rtems.h> +#include <rtems/irq-extension.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ /*=========================================================================*\ | Function: | @@ -69,8 +73,8 @@ void bestcomm_glue_irq_install | Input Parameters: | \*-------------------------------------------------------------------------*/ int bestcomm_taskno, /* task number for handler */ - void (*the_handler)(rtems_irq_hdl_param), /* function to call */ - rtems_irq_hdl_param the_param + rtems_interrupt_handler handler, /* function to call */ + void *arg ); /*-------------------------------------------------------------------------*\ | Return Value: | @@ -99,4 +103,12 @@ void bestcomm_glue_init | none | \*=========================================================================*/ +void *bestcomm_malloc(size_t size); + +void bestcomm_free(void *ptr); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + #endif /* _BESTCOMM_GLUE_H */ diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h index 1a3d932b5f..102fc082cb 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h @@ -31,7 +31,6 @@ * private data structures that should not be manipulated by API users. */ -extern uint32 SramOffsetGlobal; extern TaskBDIdxTable_t TaskBDIdxTable[MAX_TASKS]; extern int TaskRunning[MAX_TASKS]; extern sint64 MBarPhysOffsetGlobal; diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c index 2c4c96d84c..c6632955ff 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c @@ -81,6 +81,4 @@ void TasksLoadImage(sdma_regs *sdma) tt->fdt = (sdma->taskBar & 0xFFFFFF00) + tt->fdt; tt->context += sdma->taskBar; } - - SramOffsetGlobal = taskTableBytes; } diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h index f4273cdb82..3712bae3d0 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h @@ -88,46 +88,54 @@ * Task control macros ******************************************************************************/ #define SDMA_TASK_CFG(RegAddr, TaskNum, AutoStart, AutoStartNum) { \ - *(((uint16 *)RegAddr)+TaskNum) = (uint16)(0x0000 | \ + *(((volatile uint16 *)RegAddr)+TaskNum) = (uint16)(0x0000 | \ ((AutoStart!=0)<<7) | \ (AutoStartNum&0xF) ); \ } #define SDMA_TASK_AUTO_START(RegAddr, TaskNum, AutoStart, AutoStartNum) { \ - *(((uint16 *)RegAddr)+TaskNum) = (uint16)((*(((uint16 *)RegAddr)+TaskNum) & \ + *(((volatile uint16 *)RegAddr)+TaskNum) = (uint16)((*(((volatile uint16 *)RegAddr)+TaskNum) & \ (uint16) 0xff30) | ((uint16)(0x0000 | \ ((AutoStart!=0)<<7) | \ (AutoStartNum&0xF)) )); \ } #define SDMA_TASK_ENABLE(RegAddr, TaskNum) { \ - *(((uint16 *)RegAddr)+TaskNum) |= (uint16)0x8000; \ + *(((volatile uint16 *)RegAddr)+TaskNum) |= (uint16)0x8000; \ } #define SDMA_TASK_DISABLE(RegAddr, TaskNum) { \ - *(((uint16 *)RegAddr)+TaskNum) &= ~(uint16)0x8000; \ + *(((volatile uint16 *)RegAddr)+TaskNum) &= ~(uint16)0x8000; \ } #define SDMA_TASK_STATUS(RegAddr, TaskNum) \ - *(((uint16 *)RegAddr)+TaskNum) + *(((volatile uint16 *)RegAddr)+TaskNum) /******************************************************************************* * Interrupt control macros ******************************************************************************/ -#define SDMA_INT_ENABLE(RegAddr, Bit) { \ - *((uint32 *)RegAddr) &= ~((uint32)(1<<Bit)); \ -} - -#define SDMA_INT_DISABLE(RegAddr, Bit) { \ - *((uint32 *)(RegAddr)) |= ((uint32)(1<<Bit)); \ -} +#define SDMA_INT_ENABLE(RegAddr, Bit) \ + do { \ + rtems_interrupt_level level; \ + rtems_interrupt_disable(level); \ + *((volatile uint32 *) RegAddr) &= ~((uint32) (1 << Bit)); \ + rtems_interrupt_enable(level); \ + } while (0) + +#define SDMA_INT_DISABLE(RegAddr, Bit) \ + do { \ + rtems_interrupt_level level; \ + rtems_interrupt_disable(level); \ + *((volatile uint32 *) (RegAddr)) |= ((uint32)(1 << Bit)); \ + rtems_interrupt_enable(level); \ + } while (0) #define SDMA_INT_SOURCE(RegPend, RegMask) \ - (*((uint32 *)(RegPend)) & (~*((uint32 *)(RegMask))) & (uint32)SDMA_INT_BIT_IMPL) + (*((volatile uint32 *)(RegPend)) & (~*((volatile uint32 *)(RegMask))) & (uint32)SDMA_INT_BIT_IMPL) #define SDMA_INT_PENDING(RegPend, RegMask) \ - (*((uint32 *)(RegPend)) & (~*((uint32 *)(RegMask)))) + (*((volatile uint32 *)(RegPend)) & (~*((volatile uint32 *)(RegMask)))) #define SDMA_INT_TEST(IntSource, Bit) \ (((uint32)IntSource) & ((uint32)(1<<Bit))) @@ -139,7 +147,7 @@ /* Clear the IntPend bit */ #define SDMA_CLEAR_IEVENT(RegAddr, Bit) { \ - *((uint32 *)RegAddr) = ((uint32)(1<<Bit)); \ + *((volatile uint32 *)RegAddr) = ((uint32)(1<<Bit)); \ } #define SDMA_GET_PENDINGBIT(sdma, Bit) \ @@ -175,7 +183,7 @@ /* Determine which task caused a TEA on the XLB */ #define SDMA_TEA_SOURCE(RegPend) \ - (uint32)(((*(uint32 *)RegPend)>>SDMA_INT_BIT_TEA_TASK) & 0xF) + (uint32)(((*(volatile uint32 *)RegPend)>>SDMA_INT_BIT_TEA_TASK) & 0xF) /******************************************************************************* @@ -221,8 +229,8 @@ /* Note that masking the size w/ 0x3 gives the desired value for uint32 */ /* (expressed as 4), namely 0. */ #define SDMA_SET_SIZE(RegAddr, TaskNum, SrcSize, DstSize) \ - *(((uint8 *)RegAddr)+((uint32)(TaskNum/2))) = \ - (uint8)((*(((uint8 *)RegAddr)+((uint32)(TaskNum/2))) & \ + *(((volatile uint8 *)RegAddr)+((uint32)(TaskNum/2))) = \ + (uint8)((*(((volatile uint8 *)RegAddr)+((uint32)(TaskNum/2))) & \ ((TaskNum%2) ? 0xf0 : 0x0f)) | \ ((uint8)(((SrcSize & 0x3)<<2) | \ ( DstSize & 0x3 ) ) <<(4*((int)(1-(TaskNum%2)))))); @@ -231,8 +239,8 @@ /* Set the Initiator in TCR */ #define SDMA_SET_INIT(RegAddr, TaskNum, Initiator) \ { \ - *(((uint16 *)RegAddr)+TaskNum) &= (uint16)0xE0FF; \ - *(((uint16 *)RegAddr)+TaskNum) |= (((0x01F & Initiator)<<8) | \ + *(((volatile uint16 *)RegAddr)+TaskNum) &= (uint16)0xE0FF; \ + *(((volatile uint16 *)RegAddr)+TaskNum) |= (((0x01F & Initiator)<<8) | \ (0<<SDMA_TCR_BIT_HOLD)); \ } @@ -248,16 +256,16 @@ /* Set the Initiator Priority */ #define SDMA_SET_INITIATOR_PRIORITY(sdma, initiator, priority) \ - *(((uint8 *)&sdma->IPR0)+initiator) = priority; + *(((volatile uint8 *)&sdma->IPR0)+initiator) = priority; /* Read DRD initiator number */ #define SDMA_INIT_READ(PtrDRD) \ - (((*(uint32 *)PtrDRD)>>SDMA_DRD_BIT_INIT) & (uint32)0x1F) + (((*(volatile uint32 *)PtrDRD)>>SDMA_DRD_BIT_INIT) & (uint32)0x1F) /* Write DRD initiator number */ #define SDMA_INIT_WRITE(PtrDRD, Initiator) { \ - *(uint32 *)PtrDRD = ((*(uint32 *)PtrDRD) & 0xFC1FFFFF) | \ + *(volatile uint32 *)PtrDRD = ((*(volatile uint32 *)PtrDRD) & 0xFC1FFFFF) | \ (Initiator<<SDMA_DRD_BIT_INIT); \ } diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c index a51c63e625..ee8e0939d9 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c +++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c @@ -22,7 +22,10 @@ * ******************************************************************************/ +#include <assert.h> + #include "bestcomm_api.h" +#include "bestcomm_glue.h" #include "task_api/tasksetup_bdtable.h" #include "include/mgt5200/mgt5200.h" @@ -40,8 +43,6 @@ extern const uint32 offsetEntry; TaskBDIdxTable_t TaskBDIdxTable[MAX_TASKS]; -static uint8 *TaskTableFree = 0; - void TaskSetup_BDTable(volatile uint32 *BasePtr, volatile uint32 *LastPtr, volatile uint32 *StartPtr, int TaskNum, uint32 NumBD, uint16 MaxBD, uint8 NumPtr, ApiConfig_t ApiConfig, uint32 Status) @@ -50,16 +51,6 @@ void TaskSetup_BDTable(volatile uint32 *BasePtr, volatile uint32 *LastPtr, volat uint32 *ptr; /* - * If another process has not used SRAM already, then the start value - * will have to be passed in using the TasksSetSramOffset() function. - */ - if (SramOffsetGlobal == 0) { - SramOffsetGlobal = taskTableBytes; - } - - TaskTableFree = MBarGlobal + MBAR_SRAM + SramOffsetGlobal; - - /* * First time through the Buffer Descriptor table configuration * set the buffer descriptor table with parameters that will not * change since they are determined by the task itself. The @@ -70,25 +61,31 @@ void TaskSetup_BDTable(volatile uint32 *BasePtr, volatile uint32 *LastPtr, volat * of the table. */ if (TaskBDIdxTable[TaskNum].BDTablePtr == 0) { - TaskBDIdxTable[TaskNum].BDTablePtr = TaskTableFree; - TaskBDIdxTable[TaskNum].numPtr = NumPtr; - TaskBDIdxTable[TaskNum].apiConfig = ApiConfig; - TaskBDIdxTable[TaskNum].BDStartPtr = StartPtr; - - *StartPtr = *BasePtr = (uint32)((uint32)TaskBDIdxTable[TaskNum].BDTablePtr - + MBarPhysOffsetGlobal); + size_t AllocSize = 0; + void *AllocBegin = NULL; switch (NumPtr) { case 1: - SramOffsetGlobal += MaxBD*sizeof(TaskBD1_t); + AllocSize += MaxBD*sizeof(TaskBD1_t); break; case 2: - SramOffsetGlobal += MaxBD*sizeof(TaskBD2_t); + AllocSize += MaxBD*sizeof(TaskBD2_t); break; default: - /* error */ + assert(0); break; } + + AllocBegin = bestcomm_malloc(AllocSize); + assert(AllocBegin != NULL); + + TaskBDIdxTable[TaskNum].BDTablePtr = AllocBegin; + TaskBDIdxTable[TaskNum].numPtr = NumPtr; + TaskBDIdxTable[TaskNum].apiConfig = ApiConfig; + TaskBDIdxTable[TaskNum].BDStartPtr = StartPtr; + + *StartPtr = *BasePtr = (uint32)((uint32)TaskBDIdxTable[TaskNum].BDTablePtr + + MBarPhysOffsetGlobal); } TaskBDIdxTable[TaskNum].currBDInUse = 0; |