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

Subversion Repositories igor

[/] [igor/] [trunk/] [avr/] [eth-test/] [dev/] [kvga.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
#include <global.h>
5
#include <device.h>
6
#include <dispatch.h>
7
#include <req.h>
8
#include <stdlib.h>
9
#include <string.h>
10
 
11
#define BAUD 9600
12
#define MUBRR ((FOSC/16/BAUD)-1)
13
 
14
 
15
static struct {
16
        struct buf readbuf;
17
        struct buf writebuf;
18
} kvga_data;
19
 
20
/* Commands to KVGA. */
21
#define ECHO_ON "\033[12h"
22
#define ECHO_OFF "\033[12l"
23
 
24
/* Newline, linefeed, carriage return commands. */
25
#define SET_NEWLINE_MODE "\033[20h"
26
#define SET_LINEFEED_MODE "\033[20l"
27
#define ENABLE_AUTO_LF "\033[>8h"
28
#define DISABLE_AUTO_LF "\033[>8l"
29
#define ENABLE_AUTO_CR "\033[>9h"
30
#define DISABLE_AUTO_CR "\033[>9l"
31
 
32
/* Status line commands. */
33
#define ENABLE_STATUSLINE "\033[?15l"
34
#define DISABLE_STATUSLINE "\033[?15h"
35
 
36
 
37
static igordev_read_fn_t kvga_recv;
38
static igordev_write_fn_t kvga_send;
39
static igordev_init_fn_t kvga_init;
40
static igordev_flush_fn_t kvga_flush;
41
 
42
struct igordev igordev_kvga = {
43
        .init = kvga_init,
44
        .read = kvga_recv,
45
        .write = kvga_send,
46
        .flush = kvga_flush,
47
        .read_status = 0,
48
        .write_status = 0,
49
        .priv = &kvga_data
50
};
51
 
52
 
53
void
54
kvga_init(void)
55
{
56
        const char *hello = "Hello, world from TVT-KVGA!\r\n";
57
        const char *dummyprompt = "igor> ";
58
        volatile struct req *req;
59
 
60
        /* Set internal stuff first. */
61
        buf_init(&kvga_data.readbuf);
62
        buf_init(&kvga_data.writebuf);
63
        igordev_kvga.read_status = igordev_kvga.write_status = IDEV_STATUS_OK;
64
 
65
        // Set identification register.
66
        igordev_kvga.id = (CAN_READ | CAN_WRITE |
67
            (DEVTYPE_TERM << DEVTYPE_OFFSET));
68
 
69
        // Disable powersaving
70
        PRR1 &= ~(1<<PRUSART1);
71
 
72
        // Set tranfser speed
73
        UBRR1L = (uint8_t)MUBRR;
74
        UBRR1H = (uint8_t)(MUBRR>>8);
75
 
76
        // Enable reciever, transmitter and interrupts ( Not active until global interrupts are enabled)
77
        UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
78
 
79
        // Set format, stopbits, mode: 8n1
80
        UCSR1C = (0<<USBS1)|(0<<UPM11)|(0<<UPM10)|(0<<UMSEL11)|(0<<UMSEL10)|(3<<UCSZ10);
81
 
82
        /* Shut down echo by default. */
83
        buf_write(&kvga_data.writebuf, (uint8_t *)ECHO_OFF, strlen(ECHO_OFF));
84
        buf_write(&kvga_data.writebuf, (uint8_t *)DISABLE_AUTO_CR,
85
            strlen(DISABLE_AUTO_CR));
86
        buf_write(&kvga_data.writebuf, (uint8_t *)ENABLE_STATUSLINE,
87
            strlen(ENABLE_STATUSLINE));
88
        buf_write(&kvga_data.writebuf, (uint8_t *)hello, strlen(hello));
89
        /* XXX: Just a dummy-prompt until we have the FPGA doing stuff. */
90
        buf_write(&kvga_data.writebuf, (uint8_t *)dummyprompt,
91
            strlen(dummyprompt));
92
        req = req_make(&igordev_kvga, REQ_TYPE_FLUSH, 0, 0, NULL);
93
        if (req != NULL)
94
                dispatch_request_notify(req);
95
        /* Auto linefeed */
96
//      kvga_send((uint8_t *)AUTO_LINEFEED, strlen(AUTO_LINEFEED));
97
}
98
 
99
// Received a word
100
ISR(SIG_USART1_RECV)
101
{
102
        // Read UDR to reset interrupt flag
103
        struct buf *rbuf, *wbuf;
104
        volatile struct req *req;
105
        uint8_t data;
106
 
107
        igordev_kvga.read_status = IDEV_STATUS_INTR;
108
        /* Store in the buffers. */
109
        data = UDR1;
110
 
111
        /* Swallow newlines. */
112
        rbuf = &kvga_data.readbuf;
113
        wbuf = &kvga_data.writebuf;
114
#define ONESQUARE (MAXBUFLEN / 4)
115
        /*
116
         * If buffer is getting full, don't echo the input to signal that the
117
         * user have to wait
118
         */
119
        if (buf_writesleft(rbuf) < (ONESQUARE - 1))
120
                return;
121
 
122
        buf_write(rbuf, &data, 1);
123
        /* Echo to output buffer. */
124
        buf_write(wbuf, &data, 1);
125
        req = req_make(&igordev_kvga, REQ_TYPE_FLUSH, 0, 0, NULL);
126
        if (req != NULL)
127
                dispatch_request_notify(req);
128
        /* XXX: As a way to allow us to test it. */
129
        req = req_make((struct igordev *)&igordev_kvga, REQ_TYPE_FUNC, 0, 0,
130
            dispatch_vga_to_usart);
131
        if (req != NULL)
132
                dispatch_request_notify(req);
133
 
134
        igordev_kvga.read_status = IDEV_STATUS_OK;
135
}
136
 
137
/*
138
 * Read num bytes from addr and place it into data.
139
 * Data assumed to be a buffer large enough for num bytes.
140
 * Addr here is ignored, since serial is a streaming device.
141
 */
142
uint8_t
143
kvga_recv(uint64_t addr, uint8_t *data, uint8_t num)
144
{
145
        struct buf *buf;
146
        uint8_t byte;
147
        uint8_t i;
148
 
149
        buf = &kvga_data.readbuf;
150
        /* Avoid making larger buffers for now. */
151
        for (i = 0; i < num; i++) {
152
                buf_read(buf, &byte, 1);
153
                if (BUF_EMPTY(buf))
154
                        break;
155
                *(data + i) = byte;
156
        }
157
        return (i);
158
}
159
 
160
/*
161
 k* KVGA transmit, initiates a data transfer by writing to the outputbuffer and
162
 * starting the transfer of the first character.
163
 */
164
uint8_t
165
kvga_send(uint64_t addr, uint8_t *data, uint8_t num)
166
{
167
        struct buf *buf;
168
        uint8_t i;
169
        /* Transmit only once, and the buffer will be flushed anyway. */
170
        i = 0;
171
        /* If we're not provided with data, just flush it. */
172
        if (num > 0 && data != NULL) {
173
                /* Copy data into write buffer. */
174
                buf = &kvga_data.writebuf;
175
                i = buf_write(buf, data, num);
176
        }
177
        return (i);
178
}
179
 
180
/* Send whatever we have in the output buffers. */
181
void
182
kvga_flush(void)
183
{
184
        struct buf *buf;
185
        uint8_t data;
186
 
187
        igordev_kvga.write_status = IDEV_STATUS_BUSY;
188
        buf = &kvga_data.writebuf;
189
        buf_read(buf, &data, 1);
190
        while (!BUF_EMPTY(buf)) {
191
                /* Wait until output buffer is ready. */
192
                while (!( UCSR1A & (1<<UDRE1)));
193
 
194
                UDR1 = data; /* Initiate transfer. */
195
                buf_read(buf, &data, 1);
196
        }
197
        igordev_kvga.write_status = IDEV_STATUS_OK;
198
}

powered by: WebSVN 2.1.0

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