comparison 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
comparison
equal deleted inserted replaced
12:29e333952985 263:001583879ac3
1 #include <stdio.h> 1 #include <stdio.h>
2 #include <stdlib.h>
2 #include <string.h> 3 #include <string.h>
3 #include "FifoDmaManager.h" 4 #include "FifoDmaManager.h"
4 5
5 void 6 void
6 FifoDmaManager::dma_load(void *buf, unsigned int addr, int size, int mask) 7 FifoDmaManager::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask)
7 { 8 {
9 if (size == 0) return;
8 memcpy(buf, (void*)addr, size); 10 memcpy(buf, (void*)addr, size);
9 } 11 }
10 12
11 void 13 void
12 FifoDmaManager::dma_store(void *buf, unsigned int addr, int size, int mask) 14 FifoDmaManager::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask)
13 { 15 {
16 if (size == 0) return;
14 memcpy((void*)addr, buf, size); 17 memcpy((void*)addr, buf, size);
15 } 18 }
16 19
17 /** 20 /**
18 * mask で設定した DMA 転送の完了を待つ 21 * mask で設定した DMA 転送の完了を待つ
19 */ 22 */
20 void 23 void
21 FifoDmaManager::dma_wait(int mask) 24 FifoDmaManager::dma_wait(uint32 mask)
22 { 25 {
23 //spu_writech(MFC_WrTagMask, 1 << mask); 26 //spu_writech(MFC_WrTagMask, 1 << mask);
24 //spu_mfcstat(MFC_TAG_UPDATE_ALL); 27 //spu_mfcstat(MFC_TAG_UPDATE_ALL);
25 } 28 }
26 29
27 void 30 void
28 FifoDmaManager::mail_write(unsigned int data) 31 FifoDmaManager::mail_write(uint32 data)
29 { 32 {
30 //spu_writech(SPU_WrOutMbox, data); 33 mail_sendQueue
31 34 = MailManager::append_mailQueue(mail_sendQueue,
32 mail_sendQueue = append_mailQueue(mail_sendQueue, 35 mailManager->create(data));
33 mailManager->create_mail(data));
34 } 36 }
35 37
36 unsigned int 38 unsigned int
37 FifoDmaManager::mail_read(void) 39 FifoDmaManager::mail_read(void)
38 { 40 {
39 MailQueuePtr q; 41 MailQueuePtr q;
40 unsigned int ret; 42 uint32 ret;
41 43
42 q = mail_recvQueue; 44 q = mail_recvQueue;
43 45
44 if (q == NULL) { 46 if (q == NULL) {
45 return 0; // error か 正しい値か判断できないな・・・ 47 return 0; // error か 正しい値か判断できないな・・・
46 } 48 }
47 49
48 mail_recvQueue = mail_recvQueue->next; 50 mail_recvQueue = mail_recvQueue->next;
49 51
50 ret = q->data; 52 ret = q->data;
51 mailManager->free_mailQueue(q); 53 mailManager->free(q);
52 54
53 return ret; 55 return ret;
54 } 56 }
57
58 void
59 FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
60 {
61 int list_size = list->length;
62 int bound;
63
64 bound = (int)(buff);
65
66 for (int i = 0; i < list_size; i++) {
67 ListElementPtr elm = &list->element[i];
68 memcpy((void*)bound, (void*)elm->addr, elm->size);
69 bound += elm->size;
70 }
71 }
72
73 #if 0
74 void*
75 FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
76 {
77 void **buffList;
78 int bound;
79
80 dma_wait(mask);
81
82 if (list->length == 1) {
83 return buff;
84 }
85
86 bound = (int)buff;
87 buffList = (void**)malloc(list->length);
88 buffList[0] = (void*)bound;
89
90 for (int i = 1; i < list->length; i++) {
91 bound += list->element[i-1].size;
92 buffList[i] = (void*)(bound);
93 }
94
95 return (void*)buffList;
96 }
97 #endif
98
99 void
100 FifoDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask)
101 {
102 int list_size = list->length;
103 int bound;
104
105 bound = (int)(buff);
106
107 for (int i = 0; i < list_size; i++) {
108 ListElementPtr elm = &list->element[i];
109 memcpy((void*)elm->addr, (void*)bound, elm->size);
110 bound += elm->size;
111 }
112 }