Mercurial > hg > Members > kono > Cerium
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 } |