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

Subversion Repositories igor

[/] [igor/] [trunk/] [avr/] [src/] [req.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
#include <stdlib.h>
2
#include "device.h"
3
//#include "global.h"
4
#include "req.h"
5
//#include "dev/7seg.h"
6
 
7
 
8
#if 0
9
static uint8_t req_exists(struct igordev *, uint8_t, uint8_t, uint32_t,
10
    req_fn_t *);
11
#endif
12
 
13
static uint8_t  increqptr(uint8_t);
14
 
15
/*
16
 * Initialize an rqueue.
17
 */
18
void
19
rqueue_init(struct rqueue *rq)
20
{
21
        struct req *req;
22
        uint8_t i;
23
 
24
        for (i = 0 ; i < MAXREQ; i++) {
25
                req = &rq->queue[i];
26
                req->dev = NULL;
27
                req->type = 0;
28
                req->flags = 0;
29
                req->devnum = 0xFF;
30
                req->func = NULL;
31
        }
32
        rq->off_read = 0;
33
        rq->off_write = 0;
34
        rq->wcount = 0;
35
        rq->rcount = 0;
36
        rq->status = RQUEUE_STATUS_EMPTY;
37
}
38
 
39
 
40
/* Allocate space for new request, if possible. */
41
int8_t
42
req_alloc(struct rqueue *rq, struct igordev *dev, uint8_t type, uint8_t flags,
43
    uint32_t devnum, req_fn_t *func)
44
{
45
        struct req *req;
46
 
47
        if (rqueue_unused(rq) == 0) {
48
                rq->status |= RQUEUE_STATUS_FULL;
49
                return (-1);
50
        }
51
        req = &rq->queue[rq->off_write];
52
        req->dev = dev;
53
        req->type = type;
54
        req->flags = flags;
55
        req->devnum = devnum;
56
        req->func = func;
57
        rq->off_write = increqptr(rq->off_write);
58
        rq->wcount++;
59
        rq->status &= ~RQUEUE_STATUS_EMPTY;
60
        return (0);
61
}
62
 
63
/* Just peak at the next element. */
64
struct req *
65
req_peak(struct rqueue *rq)
66
{
67
        struct req *req;
68
 
69
        if (rqueue_used(rq) == 0) {
70
                rq->status |= RQUEUE_STATUS_EMPTY;
71
                return (NULL);
72
        }
73
        req = &rq->queue[rq->off_read];
74
        return (req);
75
}
76
 
77
/* Free the next element. */
78
int8_t
79
req_free(struct rqueue *rq)
80
{
81
        struct req *req;
82
        if (rqueue_used(rq) == 0) {
83
                rq->status |= RQUEUE_STATUS_EMPTY;
84
                return (-1);
85
        }
86
        /* Initialize struct again. */
87
        req = &rq->queue[rq->off_read];
88
        req->dev = NULL;
89
        req->type = 0;
90
        req->flags = 0;
91
        req->devnum = 0xFF;
92
        req->func = NULL;
93
        rq->off_read = increqptr(rq->off_read);
94
        rq->rcount++;
95
        rq->status &= ~RQUEUE_STATUS_FULL;
96
        return (0);
97
}
98
 
99
/* Calculate number of allocations done. */
100
uint8_t
101
rqueue_used(struct rqueue *rq)
102
{
103
        return (rq->wcount > rq->rcount ?
104
            rq->wcount - rq->rcount :
105
            rq->rcount - rq->wcount);
106
}
107
 
108
/* Calculate the number of allocations left */
109
uint8_t
110
rqueue_unused(struct rqueue *rq)
111
{
112
        return (MAXREQ - rqueue_used(rq));
113
}
114
 
115
static uint8_t
116
increqptr(uint8_t val)
117
{
118
        return ((val + 1) % MAXREQ);
119
}
120
 
121
#if 0
122
/*
123
 * Check if a request of the same type have already been allocated.
124
 */
125
static uint8_t
126
req_exists(struct igordev *dev, uint8_t type, uint8_t flags, uint32_t devnum,
127
    req_fn_t *func)
128
{
129
        volatile struct req *nreq;
130
        int8_t i;
131
 
132
        /*
133
         * XXX: This should perhaps check the queue, but since the taken field
134
         * in principle marks the request to be executed, we use that as a
135
         * requirement for an active request
136
         */
137
        for (i = 0; i < MAXREQ; i++) {
138
                if (reqpool[i].taken) {
139
                        nreq = &reqpool[i];
140
                        /* It is the same. */
141
                        if (nreq->dev == dev && nreq->type == type &&
142
                            nreq->flags == flags && nreq->func == func &&
143
                            nreq->devnum == devnum) {
144
                                return (1);
145
 
146
                        }
147
                }
148
                display_char(i);
149
                _delay_ms(50);
150
 
151
        }
152
        return (0);
153
}
154
 
155
volatile struct req *
156
req_make(struct igordev *dev, uint8_t type, uint8_t flags, uint32_t devnum,
157
    req_fn_t *func)
158
{
159
        volatile struct req *nreq;
160
 
161
        /* Do not make a request if it already exists in the pool. */
162
        if (req_exists(dev, type, flags, devnum, func)) {
163
                display_char(8);
164
                _delay_ms(1000);
165
                return (NULL);
166
        }
167
        nreq = req_alloc();
168
        if ( nreq == NULL) {
169
                display_char(3);
170
                _delay_ms(1000);
171
                return (NULL);
172
        }
173
        nreq->dev = dev;
174
        nreq->type = type;
175
        nreq->flags = flags;
176
        nreq->func = func;
177
        nreq->devnum = devnum;
178
        return (nreq);
179
}
180
#endif

powered by: WebSVN 2.1.0

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