2 * Copyright (C) 2007 Anton Blad
3 * Copyright (C) 2007 Fredrik Kuivinen
4 * Copyright (C) 2007 Jakob Rosén
6 * This file is licensed under GPL v2.
14 #include <avr/interrupt.h>
16 // Defines the buffer size in words.
18 # define BUFFER_CAPACITY 128
20 # define BUFFER_CAPACITY 1024
23 #if BUFFER_CAPACITY >= 256
24 typedef uint16_t buf_t
;
26 typedef uint8_t buf_t
;
29 enum buffer_status
{BUFFER_OK
= 0, BUFFER_UNDERFLOW
= 1, BUFFER_OVERFLOW
= 2};
30 volatile extern enum buffer_status buffer_flags
;
31 volatile extern uint16_t buffer
[BUFFER_CAPACITY
];
32 volatile extern buf_t buffer_start
;
33 volatile extern buf_t buffer_size
;
35 volatile extern uint16_t buffer_crc
;
36 volatile extern uint32_t buffer_crc_len
;
37 void update_crc(uint16_t w
);
39 static inline void buffer_init() { }
41 static inline void buffer_clear()
43 buffer_flags
= BUFFER_OK
;
50 static inline uint8_t buffer_isempty()
52 return buffer_size
== 0;
55 static inline uint8_t buffer_isfull()
57 return buffer_size
== BUFFER_CAPACITY
;
60 static inline buf_t
buffer_numfree()
62 return BUFFER_CAPACITY
- buffer_size
;
65 static inline buf_t
buffer_numused()
70 static inline uint8_t buffer_isok()
72 return buffer_flags
== BUFFER_OK
;
75 static inline uint8_t buffer_hadunderflow()
77 if(buffer_flags
& BUFFER_UNDERFLOW
)
79 buffer_flags
&= (uint8_t) ~BUFFER_UNDERFLOW
;
86 static inline uint8_t buffer_hadoverflow()
88 if(buffer_flags
& BUFFER_OVERFLOW
)
90 buffer_flags
&= (uint8_t) ~BUFFER_OVERFLOW
;
97 // Add one word to buffer.
98 static inline void buffer_addword(uint16_t a
)
100 uint8_t interrupts_enabled
= (SREG
& _BV(SREG_I
));
105 // The CRC computations are disabled for now due to latency
106 // problems when dumping.
109 if(buffer_size
>= BUFFER_CAPACITY
)
111 buffer_flags
|= BUFFER_OVERFLOW
;
115 idx
= buffer_start
+buffer_size
;
116 if(idx
>= BUFFER_CAPACITY
)
117 idx
-= BUFFER_CAPACITY
;
123 if(interrupts_enabled
)
127 // Reads one word from buffer.
128 static inline uint16_t buffer_getword()
130 uint8_t interrupts_enabled
= (SREG
& _BV(SREG_I
));
137 buffer_flags
|= BUFFER_UNDERFLOW
;
142 a
= buffer
[buffer_start
];
146 if(buffer_start
>= BUFFER_CAPACITY
)
150 if(interrupts_enabled
)