OpenCores
URL https://opencores.org/ocsvn/tosnet/tosnet/trunk

Subversion Repositories tosnet

[/] [tosnet/] [trunk/] [gateware/] [MicroBlaze_Peripheral_rev3_2/] [drivers/] [tosnet_v3_20_a/] [src/] [tosnet.c] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 sonicwave
/*****************************************************************************
2
* Filename:          /drivers/tosnet_v1_00_a/src/tosnet.c
3
* Version:           3.20.a
4
* Description:       tosnet Driver Source File
5
* Date:              Mon Feb 15 11:56:16 2010 (by Create and Import Peripheral Wizard)
6
*****************************************************************************/
7
 
8
 
9
#define NODE_ID_BITS 0xf
10
#define NODE_ID_OFFSET 8
11
#define NODE_ADDRESS_BITS 0xf
12
#define NODE_ADDRESS_OFFSET 12
13
#define REG_ENABLE_BITS 0xff 
14
#define REG_ENABLE_OFFSET 16
15
#define SYSTEM_HALT_BITS 0x1
16
#define SYSTEM_HALT_OFFSET 4
17
#define ONLINE_BITS 0x1
18
#define ONLINE_OFFSET 2
19
#define IS_MASTER_BITS 0x1
20
#define IS_MASTER_OFFSET 3
21
#define ASYNC_VALID_BITS 0x1
22
#define ASYNC_VALID_OFFSET 7
23
#define ASYNC_NODE_ID_BITS 0xf
24
#define ASYNC_NODE_ID_OFFSET 28
25
#define ASYNC_BE_BITS 0x3
26
#define ASYNC_BE_OFFSET 26
27
#define ASYNC_FULL_BITS 0x1
28
#define ASYNC_FULL_OFFSET 5
29
 
30
/***************************** Include Files *******************************/
31
 
32
#include "tosnet.h"
33
 
34
/************************** Function Definitions ***************************/
35
 
36
XStatus TosNet_Initialize(TosNet *instancePtr, unsigned int *MemBaseAddress, unsigned int *RegBaseAddress)
37
{
38
        instancePtr->MemBaseAddress = (volatile unsigned int*) MemBaseAddress;
39
        instancePtr->RegBaseAddress = (volatile unsigned int*) RegBaseAddress;
40
 
41
        (instancePtr->RegBaseAddress)[0] = 0x00000003;
42
        (instancePtr->RegBaseAddress)[0] = 0x0;
43
 
44
        return XST_SUCCESS;
45
}
46
 
47
unsigned int TosNet_GetNodeID(TosNet *instancePtr)
48
{
49
        return (((instancePtr->RegBaseAddress)[0] >> NODE_ID_OFFSET) & NODE_ID_BITS);
50
}
51
 
52
unsigned int TosNet_GetNodeAddress(TosNet *instancePtr)
53
{
54
        return (((instancePtr->RegBaseAddress)[0] >> NODE_ADDRESS_OFFSET) & NODE_ADDRESS_BITS);
55
}
56
 
57
unsigned int TosNet_GetRegEnable(TosNet *instancePtr)
58
{
59
        return (((instancePtr->RegBaseAddress)[0] >> REG_ENABLE_OFFSET) & REG_ENABLE_BITS);
60
}
61
 
62
int TosNet_IsOnline(TosNet *instancePtr)
63
{
64
        return (((instancePtr->RegBaseAddress)[0] >> ONLINE_OFFSET) & ONLINE_BITS);
65
}
66
 
67
int TosNet_IsMaster(TosNet *instancePtr)
68
{
69
        return (((instancePtr->RegBaseAddress)[0] >> IS_MASTER_OFFSET) & IS_MASTER_BITS);
70
}
71
 
72
int TosNet_SystemHalted(TosNet *instancePtr)
73
{
74
        return (((instancePtr->RegBaseAddress)[0] >> SYSTEM_HALT_OFFSET) & SYSTEM_HALT_BITS);
75
}
76
 
77
void TosNet_CommitIn(TosNet *instancePtr)
78
{
79
        unsigned int regTemp = (instancePtr->RegBaseAddress)[0] & 0xfffffffc;
80
        (instancePtr->RegBaseAddress)[0] = regTemp + 1;
81
        (instancePtr->RegBaseAddress)[0] = regTemp;
82
 
83
        return;
84
}
85
 
86
void TosNet_CommitOut(TosNet *instancePtr)
87
{
88
        unsigned int regTemp = (instancePtr->RegBaseAddress)[0] & 0xfffffffc;
89
        (instancePtr->RegBaseAddress)[0] = regTemp + 2;
90
        (instancePtr->RegBaseAddress)[0] = regTemp;
91
 
92
        return;
93
}
94
 
95
unsigned int TosNet_GetPacketCounter(TosNet *instancePtr)
96
{
97
        return (instancePtr->RegBaseAddress)[1];
98
}
99
 
100
unsigned int TosNet_GetErrorCounter(TosNet *instancePtr)
101
{
102
        return (instancePtr->RegBaseAddress)[2];
103
}
104
 
105
unsigned int TosNet_GetResetCounter(TosNet *instancePtr)
106
{
107
        return (instancePtr->RegBaseAddress)[3];
108
}
109
 
110
inline volatile unsigned int *TosNet_CalcInAddress(TosNet *instancePtr, unsigned int nodeId, unsigned int regId, unsigned int index)
111
{
112
        return (instancePtr->MemBaseAddress) + (nodeId << 6) + (regId << 3) + (1 << 2) + index;
113
}
114
 
115
inline volatile unsigned int *TosNet_CalcOutAddress(TosNet *instancePtr, unsigned int nodeId, unsigned int regId, unsigned int index)
116
{
117
        return (instancePtr->MemBaseAddress) + (nodeId << 6) + (regId << 3) + index;
118
}
119
 
120
int TosNet_AsyncDataReady(TosNet *instancePtr)
121
{
122
        return ((((instancePtr->RegBaseAddress)[0]) >> ASYNC_VALID_OFFSET) & ASYNC_VALID_BITS);
123
}
124
 
125
int TosNet_ReadAsync(TosNet *instancePtr, unsigned char *readBuffer, unsigned int maxBytes, unsigned int *nodeId)
126
{
127
        int currentNode = ((((instancePtr->RegBaseAddress)[0]) >> ASYNC_NODE_ID_OFFSET) & ASYNC_NODE_ID_BITS);
128
        unsigned int dataBuffer, beBuffer, byteCount = 0, n, done = 0;
129
 
130
        while(TosNet_AsyncDataReady(instancePtr) && (currentNode == (((instancePtr->RegBaseAddress)[0] >> ASYNC_NODE_ID_OFFSET) & ASYNC_NODE_ID_BITS)) && (byteCount < maxBytes) && (done == 0))
131
        {
132
                beBuffer = (((instancePtr->RegBaseAddress)[0] >> ASYNC_BE_OFFSET) & ASYNC_BE_BITS);
133
                dataBuffer = (instancePtr->RegBaseAddress)[4];          //This performs the read, and triggers the core to read out the next value from the FIFO
134
 
135
                if(beBuffer < 3)
136
                {
137
                        done = 1;
138
                }
139
 
140
                for(n=0; n<(beBuffer+1); n++)
141
                {
142
                        readBuffer[byteCount++] = ((unsigned char*)(&dataBuffer))[n];
143
                        if(byteCount == maxBytes)
144
                        {
145
                                break;
146
                        }
147
                }
148
        }
149
 
150
        *nodeId = currentNode;
151
 
152
        return byteCount;
153
}
154
 
155
 
156
int TosNet_WriteAsync(TosNet *instancePtr, unsigned char *writeBuffer, unsigned int writeBytes, unsigned nodeId)
157
{
158
        unsigned int dataBuffer, beBuffer, n, byteCount = 0;
159
        unsigned int regTemp = ((instancePtr->RegBaseAddress)[0] & 0x03ffffff) + ((nodeId & ASYNC_NODE_ID_BITS) << ASYNC_NODE_ID_OFFSET);
160
 
161
        while(!(((instancePtr->RegBaseAddress)[0] >> ASYNC_FULL_OFFSET) & ASYNC_FULL_BITS) && (byteCount < writeBytes))
162
        {
163
                dataBuffer = 0;
164
                beBuffer = 0;
165
 
166
                for(n=0; n<4; n++)
167
                {
168
                        dataBuffer += (unsigned int)(writeBuffer[byteCount++] << (8*(3-n)));
169
                        beBuffer++;
170
                        if(byteCount == writeBytes)
171
                        {
172
                                break;
173
                        }
174
                }
175
 
176
                (instancePtr->RegBaseAddress)[0] = regTemp + (((beBuffer-1) & ASYNC_BE_BITS) << ASYNC_BE_OFFSET);
177
                (instancePtr->RegBaseAddress)[4] = dataBuffer;          //This performs the write, and triggers the core to write the value into the FIFO
178
        }
179
 
180
        return byteCount;
181
}
182
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.