Add dual-license information.
[bertos.git] / drv / ser_i196.c
1 /*!
2  * \file
3  * <!--
4  * Copyright (C) 2003,2004 Develer S.r.l. (http://www.develer.com/)
5  * Copyright (C) 2000 Bernardo Innocenti <bernie@codewiz.org>
6  * This file is part of DevLib - See devlib/README for information.
7  * -->
8  *
9  * \version $Id$
10  *
11  * \author Bernardo Innocenti <bernie@develer.com>
12  *
13  * \brief CPU specific serial I/O driver
14  */
15
16 /*
17  * $Log$
18  * Revision 1.3  2004/06/03 11:27:09  bernie
19  * Add dual-license information.
20  *
21  * Revision 1.2  2004/05/23 18:21:53  bernie
22  * Trim CVS logs and cleanup header info.
23  *
24  */
25
26 #include "hw.h"
27 #include "serhw.h"
28
29 #define SER_HW_ENABLE_TX \
30         DISABLE_INTS; \
31         if (!ser_sending) \
32         { \
33                 ser_sending = true; \
34                 (INT_PEND1 |= INT1F_TI) \
35         } \
36         ENABLE_INTS;
37
38 static volatile bool ser_sending;
39
40 // Serial TX intr
41 INTERRUPT(0x30) void TI_interrupt(void)
42 {
43         if (CANT_SEND)
44         {
45                 ser_sending = false;
46                 return;
47         }
48
49         /* Can we send two bytes at the same time? */
50         if (SP_STAT & SPSF_TX_EMPTY)
51         {
52                 SBUF = fifo_pop(&ser_txfifo);
53
54                 if (CANT_SEND)
55                 {
56                         ser_sending = false;
57                         return;
58                 }
59         }
60
61         SBUF = fifo_pop(&ser_txfifo);
62 }
63
64 INTERRUPT(0x32) void RI_interrupt(void)
65 {
66         ser_status |= SP_STAT &
67                 (SPSF_OVERRUN_ERROR | SPSF_PARITY_ERROR | SPSF_FRAMING_ERROR);
68         if (fifo_isfull(&ser_rxfifo))
69                 ser_status |= SERRF_RXFIFOOVERRUN;
70         else
71                 fifo_push(&ser_rxfifo, SBUF);
72 }
73
74 static void ser_setbaudrate(unsigned long rate)
75 {
76         // Calcola il periodo per la generazione del baud rate richiesto
77         uint16_t baud = (uint16_t)(((CLOCK_FREQ / 16) / rate) - 1) | 0x8000;
78         BAUD_RATE = (uint8_t)baud;
79         BAUD_RATE = (uint8_t)(baud >> 8);
80 }
81
82 static void ser_hw_init(void)
83 {
84         // Inizializza la porta seriale
85         SP_CON = SPCF_RECEIVE_ENABLE | SPCF_MODE1;
86         ioc1_img |= IOC1F_TXD_SEL | IOC1F_EXTINT_SRC;
87         IOC1 = ioc1_img;
88
89         // Svuota il buffer di ricezione
90         {
91                 uint8_t dummy = SBUF;
92         }
93
94         // Abilita gli interrupt
95         INT_MASK1 |= INT1F_TI | INT1F_RI;
96 }
97