Mercurial > hg > Members > kono > Cerium
diff TaskManager/Fifo/FifoDmaManager.cc @ 263:001583879ac3 akira
merge 12 & 122
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 03 Jun 2009 23:55:07 +0900 |
parents | 2356238ebea7 5c194c71eca8 |
children | 58fd16298954 |
line wrap: on
line diff
--- a/TaskManager/Fifo/FifoDmaManager.cc Thu Feb 07 19:17:06 2008 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.cc Wed Jun 03 23:55:07 2009 +0900 @@ -1,16 +1,19 @@ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include "FifoDmaManager.h" void -FifoDmaManager::dma_load(void *buf, unsigned int addr, int size, int mask) +FifoDmaManager::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { + if (size == 0) return; memcpy(buf, (void*)addr, size); } void -FifoDmaManager::dma_store(void *buf, unsigned int addr, int size, int mask) +FifoDmaManager::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask) { + if (size == 0) return; memcpy((void*)addr, buf, size); } @@ -18,26 +21,25 @@ * mask で設定した DMA 転送の完了を待つ */ void -FifoDmaManager::dma_wait(int mask) +FifoDmaManager::dma_wait(uint32 mask) { //spu_writech(MFC_WrTagMask, 1 << mask); //spu_mfcstat(MFC_TAG_UPDATE_ALL); } void -FifoDmaManager::mail_write(unsigned int data) +FifoDmaManager::mail_write(uint32 data) { - //spu_writech(SPU_WrOutMbox, data); - - mail_sendQueue = append_mailQueue(mail_sendQueue, - mailManager->create_mail(data)); + mail_sendQueue + = MailManager::append_mailQueue(mail_sendQueue, + mailManager->create(data)); } unsigned int FifoDmaManager::mail_read(void) { MailQueuePtr q; - unsigned int ret; + uint32 ret; q = mail_recvQueue; @@ -48,7 +50,63 @@ mail_recvQueue = mail_recvQueue->next; ret = q->data; - mailManager->free_mailQueue(q); + mailManager->free(q); return ret; } + +void +FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) +{ + int list_size = list->length; + int bound; + + bound = (int)(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; + } +} + +#if 0 +void* +FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) +{ + void **buffList; + int bound; + + dma_wait(mask); + + if (list->length == 1) { + return buff; + } + + bound = (int)buff; + buffList = (void**)malloc(list->length); + buffList[0] = (void*)bound; + + for (int i = 1; i < list->length; i++) { + bound += list->element[i-1].size; + buffList[i] = (void*)(bound); + } + + return (void*)buffList; +} +#endif + +void +FifoDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) +{ + int list_size = list->length; + int bound; + + bound = (int)(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; + } +}