/*
-Copyright (c) 2010,2011 Jun WAKO <wakojun@gmail.com>
+Copyright 2010,2011 Jun WAKO <wakojun@gmail.com>
This software is licensed with a Modified BSD License.
All of this is supposed to be Free Software, Open Source, DFSG-free,
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <stdbool.h>
#include <avr/io.h>
#include <avr/interrupt.h>
{
if (!data)
return;
+
+ uint8_t sreg = SREG;
+ cli();
uint8_t next = (pbuf_head + 1) % PBUF_SIZE;
if (next != pbuf_tail) {
pbuf[pbuf_head] = data;
} else {
debug("pbuf: full\n");
}
+ SREG = sreg;
}
static inline uint8_t pbuf_dequeue(void)
{
uint8_t val = 0;
+
uint8_t sreg = SREG;
cli();
if (pbuf_head != pbuf_tail) {
pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE;
}
SREG = sreg;
+
return val;
}
/* get data received by interrupt */
uint8_t ps2_host_recv(void)
{
- // TODO: release clock line after 100us when inhibited by error
if (ps2_error) {
+ print("x");
+ phex(ps2_error);
ps2_host_send(0xFE); // request to resend
ps2_error = PS2_ERR_NONE;
}
+ idle();
return pbuf_dequeue();
}
+#if 0
#define DEBUGP_INIT() do { DDRC = 0xFF; } while (0)
#define DEBUGP(x) do { PORTC = x; } while (0)
+#else
+#define DEBUGP_INIT()
+#define DEBUGP(x)
+#endif
ISR(PS2_INT_VECT)
{
static enum {
}
goto RETURN;
ERROR:
- DEBUGP(0xFF);
+ DEBUGP(0x0F);
inhibit();
ps2_error = state;
DONE: