3 * Martin Winistoerfer, martinwinistoerfer@gmx.ch.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
26 * Discription: Serial interface driver for SCI1 and SCI2.
27 * Since this code will be called from ROM use
28 * only non-static local variables.
37 DECLARE_GLOBAL_DATA_PTR
;
40 * Local function prototypes
43 static int ready_to_send(void);
46 * Minimal global serial functions needed to use one of the SCI modules.
49 int serial_init (void)
51 volatile immap_t
*immr
= (immap_t
*)CFG_IMMR
;
55 #if defined(CONFIG_5xx_CONS_SCI1)
56 /* 10-Bit, 1 start bit, 8 data bit, no parity, 1 stop bit */
57 immr
->im_qsmcm
.qsmcm_scc1r1
= SCI_M_10
;
58 immr
->im_qsmcm
.qsmcm_scc1r1
= SCI_TE
| SCI_RE
;
60 immr
->im_qsmcm
.qsmcm_scc2r1
= SCI_M_10
;
61 immr
->im_qsmcm
.qsmcm_scc2r1
= SCI_TE
| SCI_RE
;
66 void serial_putc(const char c
)
68 volatile immap_t
*immr
= (immap_t
*)CFG_IMMR
;
70 /* Test for completition */
72 #if defined(CONFIG_5xx_CONS_SCI1)
73 immr
->im_qsmcm
.qsmcm_sc1dr
= (short)c
;
75 immr
->im_qsmcm
.qsmcm_sc2dr
= (short)c
;
79 #if defined(CONFIG_5xx_CONS_SCI1)
80 immr
->im_qsmcm
.qsmcm_sc1dr
= (short)'\r';
82 immr
->im_qsmcm
.qsmcm_sc2dr
= (short)'\r';
90 volatile immap_t
*immr
= (immap_t
*)CFG_IMMR
;
91 volatile short status
;
96 #if defined(CONFIG_5xx_CONS_SCI1)
97 status
= immr
->im_qsmcm
.qsmcm_sc1sr
;
99 status
= immr
->im_qsmcm
.qsmcm_sc2sr
;
102 #if defined(CONFIG_WATCHDOG)
103 reset_5xx_watchdog (immr
);
105 } while ((status
& SCI_RDRF
) == 0);
108 #if defined(CONFIG_5xx_CONS_SCI1)
109 tmp
= (unsigned char)(immr
->im_qsmcm
.qsmcm_sc1dr
& SCI_SCXDR_MK
);
111 tmp
= (unsigned char)( immr
->im_qsmcm
.qsmcm_sc2dr
& SCI_SCXDR_MK
);
118 volatile immap_t
*immr
= (immap_t
*)CFG_IMMR
;
121 /* New data character ? */
122 #if defined(CONFIG_5xx_CONS_SCI1)
123 status
= immr
->im_qsmcm
.qsmcm_sc1sr
;
125 status
= immr
->im_qsmcm
.qsmcm_sc2sr
;
127 return (status
& SCI_RDRF
);
130 void serial_setbrg (void)
132 volatile immap_t
*immr
= (immap_t
*)CFG_IMMR
;
136 scxbr
= (gd
->cpu_clk
/ (32 * gd
->baudrate
));
137 #if defined(CONFIG_5xx_CONS_SCI1)
138 immr
->im_qsmcm
.qsmcm_scc1r0
= (scxbr
& SCI_SCXBR_MK
);
140 immr
->im_qsmcm
.qsmcm_scc2r0
= (scxbr
& SCI_SCXBR_MK
);
144 void serial_puts (const char *s
)
152 int ready_to_send(void)
154 volatile immap_t
*immr
= (immap_t
*)CFG_IMMR
;
155 volatile short status
;
158 #if defined(CONFIG_5xx_CONS_SCI1)
159 status
= immr
->im_qsmcm
.qsmcm_sc1sr
;
161 status
= immr
->im_qsmcm
.qsmcm_sc2sr
;
164 #if defined(CONFIG_WATCHDOG)
165 reset_5xx_watchdog (immr
);
167 } while ((status
& SCI_TDRE
) == 0);