annotate packages/hal/arm/sa11x0/var/current/src/hal_diag.c @ 3403:8c8767bb9a62 default tip

devs/nand/micron_mt29: Remove defunct references (in comments) to mt29f2g08_oob_ecc.
author Ross Younger <wry@ecoscentric.com>
date Sun, 18 Jan 2015 17:59:01 +1300
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
1 /*=============================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
2 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
3 // hal_diag.c
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
4 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
5 // HAL diagnostic output code
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
6 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
7 //=============================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
21 // for more details.
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 210
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
39 //=============================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
41 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
42 // Author(s): gthomas
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
43 // Contributors:nickg, gthomas, dmoseley
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
44 // Travis C. Furrer <furrer@mit.edu>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
45 // Date: 2000-05-08
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
46 // Purpose: HAL diagnostic output
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
47 // Description: Implementations of HAL diagnostic output support.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
48 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
49 //####DESCRIPTIONEND####
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
50 //
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
51 //===========================================================================*/
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
52
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
53 #include <pkgconf/hal.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
54 #include <pkgconf/system.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
55 #include CYGBLD_HAL_PLATFORM_H
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
56
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
57 #include <cyg/infra/cyg_type.h> // base types
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
58 #include <cyg/infra/cyg_trac.h> // tracing macros
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_ass.h> // assertion macros
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
60
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
61 #include <cyg/hal/hal_arch.h> // basic machine info
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
62 #include <cyg/hal/hal_intr.h> // interrupt macros
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
63 #include <cyg/hal/hal_io.h> // IO macros
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
64 #include <cyg/hal/hal_if.h> // Calling interface definitions
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
65 #include <cyg/hal/hal_diag.h>
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
66 #include <cyg/hal/drv_api.h> // cyg_drv_interrupt_acknowledge
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
67 #include <cyg/hal/hal_misc.h> // Helper functions
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
68 #include <cyg/hal/hal_sa11x0.h> // Hardware definitions
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
69
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
70 struct sa11x0_serial {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
71 volatile cyg_uint32 utcr0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
72 volatile cyg_uint32 utcr1;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
73 volatile cyg_uint32 utcr2;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
74 volatile cyg_uint32 utcr3;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
75 volatile cyg_uint32 pad0010;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
76 volatile cyg_uint32 utdr;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
77 volatile cyg_uint32 pad0018;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
78 volatile cyg_uint32 utsr0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
79 volatile cyg_uint32 utsr1;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
80 };
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
81
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
82 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
83 typedef struct {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
84 volatile struct sa11x0_serial* base;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
85 cyg_int32 msec_timeout;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
86 int isr_vector;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
87 int baud_rate;
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
88 } channel_data_t;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
89
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
90 /*---------------------------------------------------------------------------*/
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
91 // SA11x0 Serial Port (UARTx) for Debug
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
92
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
93 static void
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
94 init_channel(channel_data_t* __ch_data)
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
95 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
96 volatile struct sa11x0_serial* base = __ch_data->base;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
97 cyg_uint32 brd;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
98
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
99 // Disable Receiver and Transmitter (clears FIFOs)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
100 base->utcr3 = SA11X0_UART_RX_DISABLED | SA11X0_UART_TX_DISABLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
101
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
102 // Clear sticky (writable) status bits.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
103 base->utsr0 = SA11X0_UART_RX_IDLE | SA11X0_UART_RX_BEGIN_OF_BREAK |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
104 SA11X0_UART_RX_END_OF_BREAK;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
105
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
106 #if defined(CYGPKG_HAL_ARM_SA11X0_SA1100MM) || defined(CYGPKG_HAL_ARM_SA11X0_BRUTUS)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
107 // This setup is specific to only a few boards.
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
108 if (SA11X0_UART1_BASE == (volatile unsigned long *)base) {
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
109 cyg_uint32 pdr, afr, par;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
110
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
111 HAL_READ_UINT32(SA11X0_GPIO_PIN_DIRECTION, pdr);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
112 HAL_READ_UINT32(SA11X0_GPIO_ALTERNATE_FUNCTION, afr);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
113 HAL_READ_UINT32(SA11X0_PPC_PIN_ASSIGNMENT, par);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
114
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
115 //Set pin 14 as an output (Tx) and pin 15 as in input (Rx).
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
116 HAL_WRITE_UINT32(SA11X0_GPIO_PIN_DIRECTION, ((pdr | SA11X0_GPIO_PIN_14) & ~SA11X0_GPIO_PIN_15));
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
117
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
118 // Use GPIO 14 & 15 pins for serial port 1.
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
119 HAL_WRITE_UINT32(SA11X0_GPIO_ALTERNATE_FUNCTION, afr | SA11X0_GPIO_PIN_14 | SA11X0_GPIO_PIN_15);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
120
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
121 // Pin reassignment for serial port 1.
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 110
diff changeset
122 HAL_WRITE_UINT32(SA11X0_PPC_PIN_ASSIGNMENT, par | SA11X0_PPC_UART_PIN_REASSIGNMENT_MASK);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
123 }
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
124 #endif
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
125
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
126 // Set UART to 8N1 (8 data bits, no partity, 1 stop bit)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
127 base->utcr0 = SA11X0_UART_PARITY_DISABLED | SA11X0_UART_STOP_BITS_1 |
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
128 SA11X0_UART_DATA_BITS_8;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
129
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
130 // Set the desired baud rate.
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
131 brd = SA11X0_UART_BAUD_RATE_DIVISOR(__ch_data->baud_rate);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
132 base->utcr1 = (brd >> 8) & SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
133 base->utcr2 = brd & SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
134
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
135 // Enable the receiver and the transmitter.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
136 base->utcr3 = SA11X0_UART_RX_ENABLED | SA11X0_UART_TX_ENABLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
137
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
138 // All done
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
139 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
140
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
141 void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
142 cyg_hal_plf_serial_putc(void *__ch_data, char c)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
143 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
144 volatile struct sa11x0_serial* base = ((channel_data_t*)__ch_data)->base;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
145 CYGARC_HAL_SAVE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
146
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
147 // Wait for Tx FIFO not full
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
148 while ((base->utsr1 & SA11X0_UART_TX_FIFO_NOT_FULL) == 0)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
149 ;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
150 base->utdr = c;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
151
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
152 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
153 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
154
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
155 // FIXME: shouldn't we check for PARITY_ERROR, FRAMING_ERROR, or
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
156 // RECEIVE_FIFO_OVERRUN_ERROR in the received data? This
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
157 // means check the appropriate bits in UTSR1.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
158
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
159 static cyg_bool
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
160 cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
161 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
162 volatile struct sa11x0_serial* base = ((channel_data_t*)__ch_data)->base;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
163
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
164 // If receive fifo is empty, return false
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
165 if ((base->utsr1 & SA11X0_UART_RX_FIFO_NOT_EMPTY) == 0)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
166 return false;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
167
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
168 *ch = (char)base->utdr;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
169
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
170 // Clear receiver idle status bit, to allow another interrupt to
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
171 // occur in the case where the receive fifo is almost empty.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
172 base->utsr0 = SA11X0_UART_RX_IDLE;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
173
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
174 return true;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
175 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
176
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
177 cyg_uint8
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
178 cyg_hal_plf_serial_getc(void* __ch_data)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
179 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
180 cyg_uint8 ch;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
181 CYGARC_HAL_SAVE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
182
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
183 while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch));
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
184
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
185 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
186 return ch;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
187 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
188
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
189 static channel_data_t ser_channels[] = {
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
190 #if CYGHWR_HAL_ARM_SA11X0_UART1 != 0
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
191 { (volatile struct sa11x0_serial*)SA11X0_UART1_BASE, 1000,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
192 CYGNUM_HAL_INTERRUPT_UART1, CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD },
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
193 #endif
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
194 #if CYGHWR_HAL_ARM_SA11X0_UART3 != 0
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
195 { (volatile struct sa11x0_serial*)SA11X0_UART3_BASE, 1000,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
196 CYGNUM_HAL_INTERRUPT_UART3, CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD },
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
197 #endif
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
198 };
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
199
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
200 static void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
201 cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
202 cyg_uint32 __len)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
203 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
204 CYGARC_HAL_SAVE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
205
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
206 while(__len-- > 0)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
207 cyg_hal_plf_serial_putc(__ch_data, *__buf++);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
208
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
209 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
210 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
211
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
212 static void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
213 cyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
214 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
215 CYGARC_HAL_SAVE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
216
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
217 while(__len-- > 0)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
218 *__buf++ = cyg_hal_plf_serial_getc(__ch_data);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
219
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
220 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
221 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
222
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
223 cyg_bool
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
224 cyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
225 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
226 int delay_count;
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
227 channel_data_t* chan = (channel_data_t*)__ch_data;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
228 cyg_bool res;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
229 CYGARC_HAL_SAVE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
230
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
231 delay_count = chan->msec_timeout * 10; // delay in .1 ms steps
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
232
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
233 for(;;) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
234 res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
235 if (res || 0 == delay_count--)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
236 break;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
237
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
238 CYGACC_CALL_IF_DELAY_US(100);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
239 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
240
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
241 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
242 return res;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
243 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
244
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
245 static int
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
246 cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
247 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
248 static int irq_state = 0;
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
249 channel_data_t* chan = (channel_data_t*)__ch_data;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
250 int ret = -1;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
251 va_list ap;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
252
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
253 CYGARC_HAL_SAVE_GP();
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
254 va_start(ap, __func);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
255
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
256 switch (__func) {
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
257 case __COMMCTL_GETBAUD:
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
258 ret = chan->baud_rate;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
259 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
260 case __COMMCTL_SETBAUD:
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
261 chan->baud_rate = va_arg(ap, cyg_int32);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
262 // Should we verify this value here?
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
263 init_channel(chan);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
264 ret = 0;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
265 break;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
266 case __COMMCTL_IRQ_ENABLE:
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
267 irq_state = 1;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
268
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
269 chan->base->utcr3 |= SA11X0_UART_RX_FIFO_INT_ENABLED;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
270
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
271 HAL_INTERRUPT_UNMASK(chan->isr_vector);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
272 break;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
273 case __COMMCTL_IRQ_DISABLE:
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
274 ret = irq_state;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
275 irq_state = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
276
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
277 chan->base->utcr3 &= ~SA11X0_UART_RX_FIFO_INT_ENABLED;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
278
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
279 HAL_INTERRUPT_MASK(chan->isr_vector);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
280 break;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
281 case __COMMCTL_DBG_ISR_VECTOR:
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
282 ret = chan->isr_vector;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
283 break;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
284 case __COMMCTL_SET_TIMEOUT:
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
285 ret = chan->msec_timeout;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
286 chan->msec_timeout = va_arg(ap, cyg_uint32);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
287 break;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
288 default:
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
289 break;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
290 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents: 154
diff changeset
291 va_end(ap);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
292 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
293 return ret;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
294 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
295
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
296 static int
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
297 cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc,
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
298 CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
299 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
300 int res = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
301 channel_data_t* chan = (channel_data_t*)__ch_data;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
302 char c;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
303 int reg;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
304 CYGARC_HAL_SAVE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
305
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
306 reg = chan->base->utsr1;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
307
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
308 // read it anyway just in case - no harm done and we might prevent an
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
309 // interrupt loop
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
310 c = (char)chan->base->utdr;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
311
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 159
diff changeset
312 // Clear receiver idle status bit, to allow another interrupt to
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 159
diff changeset
313 // occur in the case where the receive fifo is almost empty.
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 159
diff changeset
314 // Also for a break interrupt; these are sticky and nonmaskable.
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 159
diff changeset
315 chan->base->utsr0 = (SA11X0_UART_RX_IDLE |
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 159
diff changeset
316 SA11X0_UART_RX_BEGIN_OF_BREAK |
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 159
diff changeset
317 SA11X0_UART_RX_END_OF_BREAK );
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
318
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
319 cyg_drv_interrupt_acknowledge(chan->isr_vector);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
320
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
321 *__ctrlc = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
322 if ( (reg & SA11X0_UART_RX_FIFO_NOT_EMPTY) != 0 ) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
323 if( cyg_hal_is_break( &c , 1 ) )
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
324 *__ctrlc = 1;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
325
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
326 res = CYG_ISR_HANDLED;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
327 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
328
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
329 CYGARC_HAL_RESTORE_GP();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
330 return res;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
331 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
332
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
333 static void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
334 cyg_hal_plf_serial_init(void)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
335 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
336 hal_virtual_comm_table_t* comm;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
337 int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
338 int i;
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
339
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
340 // Init channels
154
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
341 #define NUMOF(x) (sizeof(x)/sizeof(x[0]))
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
342 for (i = 0; i < NUMOF(ser_channels); i++) {
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
343 init_channel(&ser_channels[i]);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
344 CYGACC_CALL_IF_SET_CONSOLE_COMM(i);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
345 comm = CYGACC_CALL_IF_CONSOLE_PROCS();
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
346 CYGACC_COMM_IF_CH_DATA_SET(*comm, &ser_channels[i]);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
347 CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
348 CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
349 CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
350 CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
351 CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
352 CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
353 CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
e2d866e32dac Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents: 151
diff changeset
354 }
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
355
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
356 // Restore original console
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
357 CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
358 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
359
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
360 void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
361 cyg_hal_plf_comms_init(void)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
362 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
363 static int initialized = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
364
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
365 if (initialized)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
366 return;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
367
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
368 initialized = 1;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
369
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
370 cyg_hal_plf_serial_init();
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
371 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
372
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
373 //=============================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
374 // Compatibility with older stubs
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
375 //=============================================================================
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
376
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
377 #ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
378
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
379 #include <cyg/hal/hal_stub.h> // cyg_hal_gdb_interrupt
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
380
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
381 #if (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL == 0)
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
382 # define __BASE ((void*)SA11X0_UART1_BASE)
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
383 # define CYGHWR_HAL_GDB_PORT_VECTOR CYGNUM_HAL_INTERRUPT_UART1
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
384 #else
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
385 # define __BASE ((void*)SA11X0_UART3_BASE)
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
386 # define CYGHWR_HAL_GDB_PORT_VECTOR CYGNUM_HAL_INTERRUPT_UART3
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
387 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
388
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
389 #ifdef CYGSEM_HAL_ROM_MONITOR
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
390 #define CYG_HAL_STARTUP_ROM
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
391 #undef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
392 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
393
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
394 #if defined(CYG_HAL_STARTUP_ROM) && !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
395 #define HAL_DIAG_USES_HARDWARE
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 143
diff changeset
396 #elif !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN)
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
397 #define HAL_DIAG_USES_HARDWARE
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
398 #elif CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL != CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
399 #define HAL_DIAG_USES_HARDWARE
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
400 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
401
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
402 static channel_data_t ser_channel = {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
403 (volatile struct sa11x0_serial*)__BASE, 0, CYGHWR_HAL_GDB_PORT_VECTOR
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
404 };
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
405
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
406 void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
407 hal_diag_init(void)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
408 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
409 // Init serial device
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
410 init_channel(&ser_channel);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
411 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
412
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
413 #ifdef HAL_DIAG_USES_HARDWARE
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
414
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
415 #ifdef DEBUG_DIAG
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
416 #ifndef CYG_HAL_STARTUP_ROM
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
417 #define DIAG_BUFSIZE 2048
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
418 static char diag_buffer[DIAG_BUFSIZE];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
419 static int diag_bp = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
420 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
421 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
422
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
423 void hal_diag_read_char(char *c)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
424 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
425 *c = cyg_hal_plf_serial_getc(&ser_channel);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
426 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
427
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
428 void hal_diag_write_char(char c)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
429 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
430 #ifdef DEBUG_DIAG
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
431 #ifndef CYG_HAL_STARTUP_ROM
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
432 diag_buffer[diag_bp++] = c;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
433 if (diag_bp == sizeof(diag_buffer)) diag_bp = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
434 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
435 #endif
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
436 cyg_hal_plf_serial_putc(&ser_channel, c);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
437 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
438
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
439 #else // not HAL_DIAG_USES_HARDWARE - it uses GDB protocol
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
440
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
441 void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
442 hal_diag_read_char(char *c)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
443 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
444 *c = cyg_hal_plf_serial_getc(&ser_channel);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
445 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
446
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
447 void
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
448 hal_diag_write_char(char c)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
449 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
450 static char line[100];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
451 static int pos = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
452
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
453 // FIXME: Some LED blinking might be nice right here.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
454
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
455 // No need to send CRs
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
456 if( c == '\r' ) return;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
457
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
458 line[pos++] = c;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
459
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
460 if( c == '\n' || pos == sizeof(line) )
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
461 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
462
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
463 CYG_INTERRUPT_STATE old;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
464
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
465 // Disable interrupts. This prevents GDB trying to interrupt us
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
466 // while we are in the middle of sending a packet. The serial
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
467 // receive interrupt will be seen when we re-enable interrupts
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
468 // later.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
469
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
470 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
471 CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
472 #else
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
473 HAL_DISABLE_INTERRUPTS(old);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
474 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
475
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
476 while(1)
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
477 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
478 static char hex[] = "0123456789ABCDEF";
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
479 cyg_uint8 csum = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
480 int i;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
481 #ifndef CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
482 char c1;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
483 #endif
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
484 cyg_hal_plf_serial_putc(&ser_channel, '$');
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
485 cyg_hal_plf_serial_putc(&ser_channel, 'O');
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
486 csum += 'O';
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
487 for( i = 0; i < pos; i++ )
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
488 {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
489 char ch = line[i];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
490 char h = hex[(ch>>4)&0xF];
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
491 char l = hex[ch&0xF];
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
492 cyg_hal_plf_serial_putc(&ser_channel, h);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
493 cyg_hal_plf_serial_putc(&ser_channel, l);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
494 csum += h;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
495 csum += l;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
496 }
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
497 cyg_hal_plf_serial_putc(&ser_channel, '#');
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
498 cyg_hal_plf_serial_putc(&ser_channel, hex[(csum>>4)&0xF]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
499 cyg_hal_plf_serial_putc(&ser_channel, hex[csum&0xF]);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
500
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
501 #ifdef CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
502
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
503 break; // regardless
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
504
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
505 #else // not CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT Ie. usually...
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
506
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
507 // Wait for the ACK character '+' from GDB here and handle
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
508 // receiving a ^C instead. This is the reason for this clause
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
509 // being a loop.
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 108
diff changeset
510 c1 = cyg_hal_plf_serial_getc(&ser_channel);
108
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
511
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
512 if( c1 == '+' )
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
513 break; // a good acknowledge
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
514
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
515 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
516 cyg_drv_interrupt_acknowledge(CYGHWR_HAL_GDB_PORT_VECTOR);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
517 if( c1 == 3 ) {
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
518 // Ctrl-C: breakpoint.
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
519 cyg_hal_gdb_interrupt(
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
520 (target_register_t)__builtin_return_address(0) );
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
521 break;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
522 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
523 #endif // CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
524
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
525 #endif // ! CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
526 // otherwise, loop round again
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
527 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
528
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
529 pos = 0;
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
530
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
531
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
532 // And re-enable interrupts
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
533 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
534 CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
535 #else
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
536 HAL_RESTORE_INTERRUPTS(old);
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
537 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
538
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
539 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
540 }
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
541 #endif
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
542
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
543 #endif // !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
544
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
545
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
546 /*---------------------------------------------------------------------------*/
ff3f181b64bd Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
diff changeset
547 /* End of hal_diag.c */