Mercurial > hg > Game > Cerium
view TaskManager/Fifo/FifoDmaManager.cc @ 1300:3a04b2e24df1 draft
add dma_loadList
author | Daichi Toma <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 06 Dec 2011 18:01:33 +0900 |
parents | a49c02dffe6f |
children | 2fa31362ead0 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "FifoDmaManager.h" #include "Scheduler.h" #include "TaskManagerImpl.h" void * FifoDmaManager::dma_load(Scheduler *s, void *buf, memaddr addr, uint32 size, uint32 mask) { if (size == 0) return buf; if (s) buf = s->manager->allocate(size); memcpy(buf, (void*)addr, size); return buf; } void * FifoDmaManager::get_writebuf(Scheduler *s,memaddr addr, uint32 size) { void *b = s->manager->allocate(size); return b; } void * FifoDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) { if (size == 0) return buf; memcpy((void*)addr, buf, size); return buf; } /** * mask で設定した DMA 転送の完了を待つ */ void FifoDmaManager::dma_wait(uint32 mask) { } void * FifoDmaManager::dma_loadList(Scheduler *s, ListDataPtr list, void *buff, uint32 mask) { int list_size = list->length; long bound; buff = s->manager->allocate(list->size); bound = (long)(buff); for (int i = 0; i < list_size; i++) { ListElementPtr elm = &list->element[i]; memcpy((void*)bound, (void*)elm->addr, elm->size); bound += elm->size; } return buff; } void * FifoDmaManager::get_writebuf(Scheduler *s,ListDataPtr addr, uint32 size) { void *b = s->manager->allocate(addr->size); return b; } void FifoDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) { int list_size = list->length; memaddr bound; bound = (memaddr)(buff); for (int i = 0; i < list_size; i++) { ListElementPtr elm = &list->element[i]; memcpy((void*)elm->addr, (void*)bound, elm->size); bound += elm->size; } } uint32 FifoDmaManager::get_tag() { static int tag = 16; tag ++; tag &= 0x0f; return tag+16; } /** * DMA buffer offset in rbuf */ void FifoDmaManager::bound(ListData *list) { ListElement *elm = list->element; int *bound = list->bound; int offset=0; for(int i=0;i<list->length;i++) { bound[i] = offset; offset += elm[i].size; } } /* end */