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

Subversion Repositories igor

[/] [igor/] [trunk/] [avr/] [eth-test/] [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
volatile struct req reqpool[MAXREQ];
9
 
10
static uint8_t req_exists(struct igordev *, uint8_t, uint8_t, uint32_t,
11
    req_fn_t *);
12
 
13
 
14
void req_init() {
15
    int8_t i;
16
    volatile struct req* nreq;
17
    for ( i = 0 ; i < MAXREQ ; i++ ) {
18
        nreq = &reqpool[i];
19
        nreq->dev = NULL;
20
        nreq->type = 0;
21
        nreq->flags = 0;
22
        nreq->taken = 0;
23
        nreq->devnum = 0xFF;
24
        nreq->func = NULL;
25
    }
26
}
27
 
28
volatile struct req *
29
req_alloc(void)
30
{
31
        int8_t i;
32
 
33
        for (i = 0; i < MAXREQ; i++) {
34
                if (!reqpool[i].taken) {
35
                        reqpool[i].taken = 1;
36
                        return (&reqpool[i]);
37
                }
38
 
39
        }
40
        return (NULL);
41
}
42
 
43
void
44
req_free(volatile struct req *req)
45
{
46
        req->dev = NULL;
47
        req->type = 0;
48
        req->flags = 0;
49
        req->taken = 0;
50
        req->devnum = 0xFF;
51
        req->func = NULL;
52
}
53
 
54
/*
55
 * Check if a request of the same type have already been allocated.
56
 */
57
static uint8_t
58
req_exists(struct igordev *dev, uint8_t type, uint8_t flags, uint32_t devnum,
59
    req_fn_t *func)
60
{
61
        volatile struct req *nreq;
62
        int8_t i;
63
 
64
        /*
65
         * XXX: This should perhaps check the queue, but since the taken field
66
         * in principle marks the request to be executed, we use that as a
67
         * requirement for an active request
68
         */
69
        for (i = 0; i < MAXREQ; i++) {
70
                if (reqpool[i].taken) {
71
                        nreq = &reqpool[i];
72
                        /* It is the same. */
73
                        if (nreq->dev == dev && nreq->type == type &&
74
                            nreq->flags == flags && nreq->func == func &&
75
                            nreq->devnum == devnum) {
76
                                return (1);
77
 
78
                        }
79
                }
80
                display_char(i);
81
                _delay_ms(50);
82
 
83
        }
84
        return (0);
85
}
86
 
87
volatile struct req *
88
req_make(struct igordev *dev, uint8_t type, uint8_t flags, uint32_t devnum,
89
    req_fn_t *func)
90
{
91
        volatile struct req *nreq;
92
 
93
        /* Do not make a request if it already exists in the pool. */
94
        if (req_exists(dev, type, flags, devnum, func)) {
95
                display_char(8);
96
                _delay_ms(1000);
97
                return (NULL);
98
        }
99
        nreq = req_alloc();
100
        if ( nreq == NULL) {
101
                display_char(3);
102
                _delay_ms(1000);
103
                return (NULL);
104
        }
105
        nreq->dev = dev;
106
        nreq->type = type;
107
        nreq->flags = flags;
108
        nreq->func = func;
109
        nreq->devnum = devnum;
110
        return (nreq);
111
}

powered by: WebSVN 2.1.0

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