annotate packages/devs/serial/powerpc/quicc/current/src/quicc_smc_serial.c @ 143:6b5f480c6929 ecos-sw-2000-12-08

Merge from eCos master repository on 2000-12-08-02:09:36-GMT
author jlarmour
date Fri, 08 Dec 2000 03:30:06 +0000
parents 0ae0bc38e387
children 2e9a636d9de9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
2 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
3 // io/serial/powerpc/quicc_smc_serial.c
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
4 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
5 // PowerPC QUICC (SMC) Serial I/O Interface Module (interrupt driven)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
6 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
9 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
10 // -------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
14 // http://www.redhat.com/
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
15 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
19 // the License.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
20 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
22 // released September 30, 1998.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
23 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
25 // Portions created by Red Hat are
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
27 // All Rights Reserved.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
28 // -------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
29 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
31 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
33 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
34 // Author(s): gthomas
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
35 // Contributors: gthomas
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
36 // Date: 1999-06-20
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
37 // Purpose: QUICC SMC Serial I/O module (interrupt driven version)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
38 // Description:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
39 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
40 //####DESCRIPTIONEND####
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
41 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
42 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
43
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
44 #include <pkgconf/system.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
45 #include <pkgconf/io_serial.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
46 #include <pkgconf/io.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
47 #include <cyg/io/io.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
48 #include <cyg/hal/hal_intr.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
49 #include <cyg/io/devtab.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
50 #include <cyg/io/serial.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
51 #include <cyg/infra/diag.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
52 #include <cyg/hal/hal_cache.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
53 #include CYGBLD_HAL_PLATFORM_H
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
54
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
55 #ifdef CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
56
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
57 // Buffer descriptor control bits
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
58 #define QUICC_BD_CTL_Ready 0x8000 // Buffer contains data (tx) or is empty (rx)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
59 #define QUICC_BD_CTL_Wrap 0x2000 // Last buffer in list
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
60 #define QUICC_BD_CTL_Int 0x1000 // Generate interrupt when empty (tx) or full (rx)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
61 #define QUICC_BD_CTL_MASK 0xB000 // User settable bits
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
62
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
63 // SMC Mode Register
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
64 #define QUICC_SMCMR_CLEN(n) ((n+1)<<11) // Character length
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
65 #define QUICC_SMCMR_SB(n) ((n-1)<<10) // Stop bits (1 or 2)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
66 #define QUICC_SMCMR_PE(n) (n<<9) // Parity enable (0=disable, 1=enable)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
67 #define QUICC_SMCMR_PM(n) (n<<8) // Parity mode (0=odd, 1=even)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
68 #define QUICC_SMCMR_UART (2<<4) // UART mode
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
69 #define QUICC_SMCMR_TEN (1<<1) // Enable transmitter
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
70 #define QUICC_SMCMR_REN (1<<0) // Enable receiver
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
71
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
72 // SMC Events (interrupts)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
73 #define QUICC_SMCE_BRK 0x10 // Break received
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
74 #define QUICC_SMCE_BSY 0x04 // Busy - receive buffer overrun
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
75 #define QUICC_SMCE_TX 0x02 // Tx interrupt
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
76 #define QUICC_SMCE_RX 0x01 // Rx interrupt
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
77
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
78 // SMC Commands
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
79 #define QUICC_SMC_CMD_InitTxRx (0<<8)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
80 #define QUICC_SMC_CMD_InitTx (1<<8)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
81 #define QUICC_SMC_CMD_InitRx (2<<8)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
82 #define QUICC_SMC_CMD_StopTx (4<<8)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
83 #define QUICC_SMC_CMD_RestartTx (6<<8)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
84 #define QUICC_SMC_CMD_Reset 0x8000
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
85 #define QUICC_SMC_CMD_Go 0x0001
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
86
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
87 #include "quicc_smc_serial.h"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
88
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
89 typedef struct quicc_smc_serial_info {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
90 CYG_ADDRWORD channel; // Which channel SMC1/SMC2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
91 CYG_WORD int_num; // Interrupt number
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
92 cyg_uint32 *brg; // Which baud rate generator
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
93 volatile struct smc_uart_pram *pram; // Parameter RAM pointer
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
94 volatile struct smc_regs *ctl; // SMC control registers
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
95 volatile struct cp_bufdesc *txbd, *rxbd; // Next Tx,Rx descriptor to use
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
96 struct cp_bufdesc *tbase, *rbase; // First Tx,Rx descriptor
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
97 int txsize, rxsize; // Length of individual buffers
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
98 cyg_interrupt serial_interrupt;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
99 cyg_handle_t serial_interrupt_handle;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
100 } quicc_smc_serial_info;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
101
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
102 static bool quicc_smc_serial_init(struct cyg_devtab_entry *tab);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
103 static bool quicc_smc_serial_putc(serial_channel *chan, unsigned char c);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
104 static Cyg_ErrNo quicc_smc_serial_lookup(struct cyg_devtab_entry **tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
105 struct cyg_devtab_entry *sub_tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
106 const char *name);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
107 static unsigned char quicc_smc_serial_getc(serial_channel *chan);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
108 static Cyg_ErrNo quicc_smc_serial_set_config(serial_channel *chan,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
109 cyg_uint32 key, const void *xbuf,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
110 cyg_uint32 *len);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
111 static void quicc_smc_serial_start_xmit(serial_channel *chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
112 static void quicc_smc_serial_stop_xmit(serial_channel *chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
113
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
114 static cyg_uint32 quicc_smc_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
115 static void quicc_smc_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
116
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
117 static SERIAL_FUNS(quicc_smc_serial_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
118 quicc_smc_serial_putc,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
119 quicc_smc_serial_getc,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
120 quicc_smc_serial_set_config,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
121 quicc_smc_serial_start_xmit,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
122 quicc_smc_serial_stop_xmit
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
123 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
124
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
125 #ifdef CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
126 static quicc_smc_serial_info quicc_smc_serial_info1 = {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
127 0x90, // Channel indicator
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
128 CYGNUM_HAL_INTERRUPT_CPM_SMC1 // interrupt
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
129 };
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
130 #if CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_BUFSIZE > 0
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
131 static unsigned char quicc_smc_serial_out_buf1[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
132 static unsigned char quicc_smc_serial_in_buf1[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
133
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
134 static SERIAL_CHANNEL_USING_INTERRUPTS(quicc_smc_serial_channel1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
135 quicc_smc_serial_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
136 quicc_smc_serial_info1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
137 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
138 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
139 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
140 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
141 CYG_SERIAL_FLAGS_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
142 &quicc_smc_serial_out_buf1[0], sizeof(quicc_smc_serial_out_buf1),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
143 &quicc_smc_serial_in_buf1[0], sizeof(quicc_smc_serial_in_buf1)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
144 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
145 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
146 static SERIAL_CHANNEL(quicc_smc_serial_channel1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
147 quicc_smc_serial_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
148 quicc_smc_serial_info1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
149 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
150 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
151 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
152 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
153 CYG_SERIAL_FLAGS_DEFAULT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
154 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
155 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
156
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
157 static unsigned char quicc_smc1_txbuf[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_TxNUM][CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_TxSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
158 static unsigned char quicc_smc1_rxbuf[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_RxNUM][CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_RxSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
159
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
160 DEVTAB_ENTRY(quicc_smc_serial_io1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
161 CYGDAT_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_NAME,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
162 0, // Does not depend on a lower level interface
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
163 &cyg_io_serial_devio,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
164 quicc_smc_serial_init,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
165 quicc_smc_serial_lookup, // Serial driver may need initializing
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
166 &quicc_smc_serial_channel1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
167 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
168 #endif // CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
169
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
170 #ifdef CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
171 static quicc_smc_serial_info quicc_smc_serial_info2 = {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
172 0xD0, // Channel indicator
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
173 CYGNUM_HAL_INTERRUPT_CPM_SMC2_PIP // interrupt
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
174 };
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
175 #if CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_BUFSIZE > 0
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
176 static unsigned char quicc_smc_serial_out_buf2[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
177 static unsigned char quicc_smc_serial_in_buf2[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_BUFSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
178
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
179 static SERIAL_CHANNEL_USING_INTERRUPTS(quicc_smc_serial_channel2,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
180 quicc_smc_serial_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
181 quicc_smc_serial_info2,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
182 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
183 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
184 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
185 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
186 CYG_SERIAL_FLAGS_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
187 &quicc_smc_serial_out_buf2[0], sizeof(quicc_smc_serial_out_buf2),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
188 &quicc_smc_serial_in_buf2[0], sizeof(quicc_smc_serial_in_buf2)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
189 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
190 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
191 static SERIAL_CHANNEL(quicc_smc_serial_channel2,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
192 quicc_smc_serial_funs,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
193 quicc_smc_serial_info2,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
194 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_BAUD),
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
195 CYG_SERIAL_STOP_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
196 CYG_SERIAL_PARITY_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
197 CYG_SERIAL_WORD_LENGTH_DEFAULT,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
198 CYG_SERIAL_FLAGS_DEFAULT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
199 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
200 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
201 static unsigned char quicc_smc2_txbuf[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_TxNUM][CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_TxSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
202 static unsigned char quicc_smc2_rxbuf[CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_RxNUM][CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_RxSIZE];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
203
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
204 DEVTAB_ENTRY(quicc_smc_serial_io2,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
205 CYGDAT_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_NAME,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
206 0, // Does not depend on a lower level interface
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
207 &cyg_io_serial_devio,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
208 quicc_smc_serial_init,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
209 quicc_smc_serial_lookup, // Serial driver may need initializing
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
210 &quicc_smc_serial_channel2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
211 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
212 #endif // CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
213
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
214 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
215 extern int enable_diag_uart;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
216 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
217
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
218 // Internal function to actually configure the hardware to desired baud rate, etc.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
219 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
220 quicc_smc_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
221 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
222 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
223 unsigned int baud_divisor = select_baud[new_config->baud];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
224 cyg_uint32 _lcr;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
225 EPPC *eppc = eppc_base();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
226 if (baud_divisor == 0) return false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
227 // Disable channel during setup
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
228 smc_chan->ctl->smc_smcmr = QUICC_SMCMR_UART; // Disabled, UART mode
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
229 // Disable port interrupts while changing hardware
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
230 _lcr = select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5] |
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
231 select_stop_bits[new_config->stop] |
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
232 select_parity[new_config->parity];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
233 // Stop transmitter while changing baud rate
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
234 eppc->cp_cr = smc_chan->channel | QUICC_SMC_CMD_Go | QUICC_SMC_CMD_StopTx;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
235 // Set baud rate generator
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
236 *smc_chan->brg = 0x10000 | (UART_BITRATE(baud_divisor)<<1);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
237 #ifdef XX_CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
238 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
239 diag_printf("Set BAUD RATE[%x], %d = %x, tstate = %x\n", smc_chan->brg, baud_divisor, *smc_chan->brg, smc_chan->pram->tstate);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
240 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
241 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
242
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
243 // Enable channel with new configuration
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
244 smc_chan->ctl->smc_smcmr = QUICC_SMCMR_UART|QUICC_SMCMR_TEN|QUICC_SMCMR_REN|_lcr;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
245 eppc->cp_cr = smc_chan->channel | QUICC_SMC_CMD_Go | QUICC_SMC_CMD_RestartTx;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
246 if (new_config != &chan->config) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
247 chan->config = *new_config;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
248 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
249 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
250 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
251
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
252 // Function to set up internal tables for device.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
253 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
254 quicc_smc_serial_init_info(quicc_smc_serial_info *smc_chan,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
255 volatile struct smc_uart_pram *uart_pram,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
256 volatile struct smc_regs *ctl,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
257 int TxBD, int TxNUM, int TxSIZE,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
258 cyg_uint8 *TxBUF,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
259 int RxBD, int RxNUM, int RxSIZE,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
260 cyg_uint8 *RxBUF,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
261 int portBmask,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
262 int BRG, int SIpos)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
263 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
264 EPPC *eppc = eppc_base();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
265 struct cp_bufdesc *txbd, *rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
266 cyg_uint32 simode = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
267 int i;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
268
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
269 // Disable channel during setup
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
270 ctl->smc_smcmr = QUICC_SMCMR_UART; // Disabled, UART mode
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
271 smc_chan->pram = uart_pram;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
272 smc_chan->ctl = ctl;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
273 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
274 * SDMA & LCD bus request level 5
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
275 * (Section 16.10.2.1)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
276 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
277 eppc->dma_sdcr = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
278 switch (BRG) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
279 case 1:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
280 smc_chan->brg = (cyg_uint32 *)&eppc->brgc1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
281 simode = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
282 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
283 case 2:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
284 smc_chan->brg = (cyg_uint32 *)&eppc->brgc2;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
285 simode = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
286 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
287 case 3:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
288 smc_chan->brg = (cyg_uint32 *)&eppc->brgc3;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
289 simode = 2;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
290 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
291 case 4:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
292 smc_chan->brg = (cyg_uint32 *)&eppc->brgc4;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
293 simode = 3;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
294 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
295 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
296 // NMSI mode, BRGn to SMCm (Section 16.12.5.2)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
297 eppc->si_simode = (eppc->si_simode & ~(0xF<<SIpos)) | (simode<<SIpos);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
298 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
299 * Set up the PortB pins for UART operation.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
300 * Set PAR and DIR to allow SMCTXDx and SMRXDx
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
301 * (Table 16-39)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
302 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
303 eppc->pip_pbpar |= portBmask;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
304 eppc->pip_pbdir &= ~portBmask;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
305 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
306 * Reset Rx & Tx params
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
307 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
308 eppc->cp_cr = smc_chan->channel | QUICC_SMC_CMD_Go | QUICC_SMC_CMD_InitTxRx;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
309 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
310 * SDMA & LCD bus request level 5
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
311 * (Section 16.10.2.1)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
312 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
313 eppc->dma_sdcr = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
314 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
315 * Set Rx and Tx function code
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
316 * (Section 16.15.4.2)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
317 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
318 uart_pram->rfcr = 0x18;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
319 uart_pram->tfcr = 0x18;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
320 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
321 * Set pointers to buffer descriptors.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
322 * (Sections 16.15.4.1, 16.15.7.12, and 16.15.7.13)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
323 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
324 uart_pram->rbase = RxBD;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
325 uart_pram->tbase = TxBD;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
326 /* tx and rx buffer descriptors */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
327 txbd = (struct cp_bufdesc *)((char *)eppc + TxBD);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
328 rxbd = (struct cp_bufdesc *)((char *)eppc + RxBD);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
329 smc_chan->txbd = txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
330 smc_chan->tbase = txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
331 smc_chan->txsize = TxSIZE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
332 smc_chan->rxbd = rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
333 smc_chan->rbase = rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
334 smc_chan->rxsize = RxSIZE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
335 /* max receive buffer length */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
336 uart_pram->mrblr = RxSIZE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
337 /* set max_idle feature - generate interrupt after 4 chars idle period */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
338 uart_pram->max_idl = 4;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
339 /* no last brk char received */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
340 uart_pram->brkln = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
341 /* no break condition occurred */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
342 uart_pram->brkec = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
343 /* 1 break char sent on top XMIT */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
344 uart_pram->brkcr = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
345 /* setup RX buffer descriptors */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
346 for (i = 0; i < RxNUM; i++) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
347 rxbd->length = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
348 rxbd->buffer = RxBUF;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
349 rxbd->ctrl = QUICC_BD_CTL_Ready | QUICC_BD_CTL_Int;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
350 if (i == (RxNUM-1)) rxbd->ctrl |= QUICC_BD_CTL_Wrap; // Last buffer
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
351 RxBUF += RxSIZE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
352 rxbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
353 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
354 /* setup TX buffer descriptors */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
355 for (i = 0; i < TxNUM; i++) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
356 txbd->length = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
357 txbd->buffer = TxBUF;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
358 txbd->ctrl = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
359 if (i == (TxNUM-1)) txbd->ctrl |= QUICC_BD_CTL_Wrap; // Last buffer
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
360 TxBUF += TxSIZE;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
361 txbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
362 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
363 /*
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
364 * Clear any previous events. Enable interrupts.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
365 * (Section 16.15.7.14 and 16.15.7.15)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
366 */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
367 ctl->smc_smce = 0xFF;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
368 ctl->smc_smcm = QUICC_SMCE_BSY|QUICC_SMCE_TX|QUICC_SMCE_RX;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
369 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
370
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
371 // Function to initialize the device. Called at bootstrap time.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
372 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
373 quicc_smc_serial_init(struct cyg_devtab_entry *tab)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
374 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
375 serial_channel *chan = (serial_channel *)tab->priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
376 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
377 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
378 int TxBD, RxBD;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
379 static int first_init = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
380 int cache_state;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
381 HAL_DCACHE_IS_ENABLED(cache_state);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
382 HAL_DCACHE_SYNC();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
383 HAL_DCACHE_DISABLE();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
384 #ifdef CYGDBG_IO_INIT
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
385 diag_printf("QUICC_SMC SERIAL init - dev: %x.%d\n", smc_chan->channel, smc_chan->int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
386 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
387 if (first_init) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
388 // Set up tables since many fields are dynamic [computed at runtime]
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
389 first_init = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
390 #ifdef CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
391 eppc->cp_cr = QUICC_SMC_CMD_Reset | QUICC_SMC_CMD_Go; // Totally reset CP
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
392 while (eppc->cp_cr & QUICC_SMC_CMD_Reset) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
393 TxBD = 0x2800; // Note: this should be configurable
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
394 RxBD = TxBD + CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_TxNUM*8;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
395 quicc_smc_serial_init_info(&quicc_smc_serial_info1,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
396 &eppc->pram[2].scc.pothers.smc_modem.psmc.u, // PRAM
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
397 &eppc->smc_regs[0], // Control registers
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
398 TxBD,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
399 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_TxNUM,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
400 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_TxSIZE,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
401 &quicc_smc1_txbuf[0][0],
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
402 RxBD,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
403 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_RxNUM,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
404 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_RxSIZE,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
405 &quicc_smc1_rxbuf[0][0],
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
406 0xC0, // PortB mask
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
407 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_BRG,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
408 12 // SI mask position
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
409 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
410 TxBD = RxBD + CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_RxNUM*8;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
411 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
412 #ifdef CYGPKG_HAL_POWERPC_MBX
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
413 // Ensure the SMC1 side is initialized first and use shared mem
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
414 // above where it plays:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
415 diag_init(); // (pull in constructor that inits diag channel)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
416 TxBD = 0x2830; // Note: this should be inferred from the chip state
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
417 #else
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
418 // there is no diag device wanting to use the QUICC, so prepare it
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
419 // for SMC2 use only.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
420 eppc->cp_cr = QUICC_SMC_CMD_Reset | QUICC_SMC_CMD_Go; // Totally reset CP
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
421 while (eppc->cp_cr & QUICC_SMC_CMD_Reset) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
422 TxBD = 0x2800; // Note: this should be configurable
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
423 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
424 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
425 #ifdef CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC2
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
426 RxBD = TxBD + CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_TxNUM*8;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
427 quicc_smc_serial_init_info(&quicc_smc_serial_info2,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
428 &eppc->pram[3].scc.pothers.smc_modem.psmc.u, // PRAM
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
429 &eppc->smc_regs[1], // Control registers
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
430 TxBD,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
431 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_TxNUM,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
432 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_TxSIZE,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
433 &quicc_smc2_txbuf[0][0],
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
434 RxBD,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
435 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_RxNUM,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
436 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_RxSIZE,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
437 &quicc_smc2_rxbuf[0][0],
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
438 0xC00, // PortB mask
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
439 CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC2_BRG,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
440 28 // SI mask position
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
441 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
442 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
443 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
444 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
445 if (chan->out_cbuf.len != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
446 cyg_drv_interrupt_create(smc_chan->int_num,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
447 CYGARC_SIU_PRIORITY_HIGH, // Priority - unused (but asserted)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
448 (cyg_addrword_t)chan, // Data item passed to interrupt handler
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
449 quicc_smc_serial_ISR,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
450 quicc_smc_serial_DSR,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
451 &smc_chan->serial_interrupt_handle,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
452 &smc_chan->serial_interrupt);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
453 cyg_drv_interrupt_attach(smc_chan->serial_interrupt_handle);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 132
diff changeset
454 cyg_drv_interrupt_unmask(smc_chan->int_num);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
455 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
456 quicc_smc_serial_config_port(chan, &chan->config, true);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
457 if (cache_state)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
458 HAL_DCACHE_ENABLE();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
459 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
460 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
461
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
462 // This routine is called when the device is "looked" up (i.e. attached)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
463 static Cyg_ErrNo
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
464 quicc_smc_serial_lookup(struct cyg_devtab_entry **tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
465 struct cyg_devtab_entry *sub_tab,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
466 const char *name)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
467 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
468 serial_channel *chan = (serial_channel *)(*tab)->priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
469 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
470 return ENOERR;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
471 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
472
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
473 // Force the current transmit buffer to be sent
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
474 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
475 quicc_smc_serial_flush(quicc_smc_serial_info *smc_chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
476 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
477 volatile struct cp_bufdesc *txbd = smc_chan->txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
478 if ((txbd->length > 0) && ((txbd->ctrl & QUICC_BD_CTL_Ready) == 0)) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
479 txbd->ctrl |= QUICC_BD_CTL_Ready|QUICC_BD_CTL_Int; // Signal buffer ready
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
480 if (txbd->ctrl & QUICC_BD_CTL_Wrap) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
481 txbd = smc_chan->tbase;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
482 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
483 txbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
484 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
485 smc_chan->txbd = txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
486 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
487 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
488
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
489 // Send a character to the device output buffer.
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
490 // Return 'true' if character is sent to device
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
491 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
492 quicc_smc_serial_putc(serial_channel *chan, unsigned char c)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
493 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
494 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
495 volatile struct cp_bufdesc *txbd, *txfirst;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
496 EPPC *eppc = eppc_base();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
497 bool res;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
498 cyg_drv_dsr_lock(); // Avoid race condition testing pointers
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
499 txbd = (struct cp_bufdesc *)((char *)eppc + smc_chan->pram->tbptr);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
500 txfirst = txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
501 // Scan for a non-busy buffer
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
502 while (txbd->ctrl & QUICC_BD_CTL_Ready) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
503 // This buffer is busy, move to next one
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
504 if (txbd->ctrl & QUICC_BD_CTL_Wrap) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
505 txbd = smc_chan->tbase;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
506 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
507 txbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
508 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
509 if (txbd == txfirst) break; // Went all the way around
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
510 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
511 smc_chan->txbd = txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
512 if ((txbd->ctrl & (QUICC_BD_CTL_Ready|QUICC_BD_CTL_Int)) == 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
513 // Transmit buffer is not full/busy
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
514 txbd->buffer[txbd->length++] = c;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
515 if (txbd->length == smc_chan->txsize) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
516 // This buffer is now full, tell SMC to start processing it
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
517 quicc_smc_serial_flush(smc_chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
518 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
519 res = true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
520 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
521 // No space
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
522 res = false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
523 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
524 cyg_drv_dsr_unlock();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
525 return res;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
526 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
527
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
528 // Fetch a character from the device input buffer, waiting if necessary
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
529 static unsigned char
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
530 quicc_smc_serial_getc(serial_channel *chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
531 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
532 unsigned char c;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
533 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
534 volatile struct cp_bufdesc *rxbd = smc_chan->rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
535 while ((rxbd->ctrl & QUICC_BD_CTL_Ready) != 0) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
536 c = rxbd->buffer[0];
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
537 rxbd->length = smc_chan->rxsize;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
538 rxbd->ctrl |= QUICC_BD_CTL_Ready;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
539 if (rxbd->ctrl & QUICC_BD_CTL_Wrap) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
540 rxbd = smc_chan->rbase;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
541 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
542 rxbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
543 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
544 smc_chan->rxbd = (struct cp_bufdesc *)rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
545 return c;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
546 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
547
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
548 // Set up the device characteristics; baud rate, etc.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
549 static Cyg_ErrNo
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
550 quicc_smc_serial_set_config(serial_channel *chan, cyg_uint32 key,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
551 const void *xbuf, cyg_uint32 *len)
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
552 {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
553 switch (key) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
554 case CYG_IO_SET_CONFIG_SERIAL_INFO:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
555 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
556 // FIXME - The documentation says that you can't change the baud rate
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
557 // again until at least two BRG input clocks have occurred.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
558 cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
559 if ( *len < sizeof(cyg_serial_info_t) ) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
560 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
561 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
562 *len = sizeof(cyg_serial_info_t);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
563 if ( true != quicc_smc_serial_config_port(chan, config, false) )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
564 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
565 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
566 break;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
567 default:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
568 return -EINVAL;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
569 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
570 return ENOERR;
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
571 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
572
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
573 // Enable the transmitter (interrupt) on the device
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
574 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
575 quicc_smc_serial_start_xmit(serial_channel *chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
576 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
577 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 132
diff changeset
578 cyg_drv_dsr_lock();
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
579 if (smc_chan->txbd->length == 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
580 // See if there is anything to put in this buffer, just to get it going
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
581 (chan->callbacks->xmt_char)(chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
582 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
583 if (smc_chan->txbd->length != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
584 // Make sure it gets started
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
585 quicc_smc_serial_flush(smc_chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
586 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 132
diff changeset
587 cyg_drv_dsr_unlock();
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
588 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
589
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
590 // Disable the transmitter on the device
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
591 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
592 quicc_smc_serial_stop_xmit(serial_channel *chan)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
593 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
594 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
595 // If anything is in the last buffer, need to get it started
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
596 if (smc_chan->txbd->length != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
597 quicc_smc_serial_flush(smc_chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
598 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
599 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
600
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
601 // Serial I/O - low level interrupt handler (ISR)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
602 static cyg_uint32
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
603 quicc_smc_serial_ISR(cyg_vector_t vector, cyg_addrword_t data)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
604 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
605 serial_channel *chan = (serial_channel *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
606 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
607 cyg_drv_interrupt_mask(smc_chan->int_num);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 115
diff changeset
608 return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR); // Cause DSR to be run
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
609 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
610
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
611 // Serial I/O - high level interrupt handler (DSR)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
612 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
613 quicc_smc_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
614 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
615 serial_channel *chan = (serial_channel *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
616 quicc_smc_serial_info *smc_chan = (quicc_smc_serial_info *)chan->dev_priv;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
617 volatile struct smc_regs *ctl = smc_chan->ctl;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
618 volatile struct cp_bufdesc *txbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
619 volatile struct cp_bufdesc *rxbd = smc_chan->rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
620 struct cp_bufdesc *rxlast;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
621 int i, cache_state;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
622 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
623 int _time, _stime;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
624 externC cyg_tick_count_t cyg_current_time(void);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
625 cyg_drv_isr_lock();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
626 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
627 HAL_CLOCK_READ(&_time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
628 _stime = (int)cyg_current_time();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
629 diag_printf("DSR start - CE: %x, time: %x.%x\n", ctl->smc_smce, _stime, _time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
630 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
631 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
632 if (ctl->smc_smce & QUICC_SMCE_TX) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
633 #ifdef XX_CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
634 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
635 txbd = smc_chan->tbase;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
636 for (i = 0; i < CYGNUM_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_TxNUM; i++, txbd++) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
637 diag_printf("Tx BD: %x, length: %d, ctl: %x\n", txbd, txbd->length, txbd->ctrl);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
638 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
639 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
640 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
641 // Transmit interrupt
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
642 ctl->smc_smce = QUICC_SMCE_TX; // Reset interrupt state;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
643 txbd = smc_chan->tbase; // First buffer
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
644 while (true) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
645 if ((txbd->ctrl & (QUICC_BD_CTL_Ready|QUICC_BD_CTL_Int)) == QUICC_BD_CTL_Int) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
646 #ifdef XX_CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
647 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
648 HAL_CLOCK_READ(&_time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
649 _stime = (int)cyg_current_time();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
650 diag_printf("TX Done - Tx: %x, length: %d, time: %x.%x\n", txbd, txbd->length, _stime, _time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
651 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
652 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
653 txbd->length = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
654 txbd->ctrl &= ~QUICC_BD_CTL_Int; // Reset interrupt bit
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
655 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
656 if (txbd->ctrl & QUICC_BD_CTL_Wrap) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
657 txbd = smc_chan->tbase;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
658 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
659 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
660 txbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
661 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
662 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
663 (chan->callbacks->xmt_char)(chan);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
664 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
665 while (ctl->smc_smce & QUICC_SMCE_RX) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
666 // Receive interrupt
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
667 ctl->smc_smce = QUICC_SMCE_RX; // Reset interrupt state;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
668 rxlast = (struct cp_bufdesc *) (
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
669 (char *)eppc_base() + smc_chan->pram->rbptr );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
670 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
671 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
672 HAL_CLOCK_READ(&_time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
673 _stime = (int)cyg_current_time();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
674 diag_printf("Scan RX - rxbd: %x, rbptr: %x, time: %x.%x\n", rxbd, rxlast, _stime, _time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
675 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
676 while (rxbd != rxlast) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
677 if ((rxbd->ctrl & QUICC_BD_CTL_Ready) == 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
678 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
679 diag_printf("rxbuf: %x, flags: %x, length: %d\n", rxbd, rxbd->ctrl, rxbd->length);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
680 diag_dump_buf(rxbd->buffer, rxbd->length);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
681 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
682 for (i = 0; i < rxbd->length; i++) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
683 (chan->callbacks->rcv_char)(chan, rxbd->buffer[i]);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
684 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
685 // Note: the MBX860 does not seem to snoop/invalidate the data cache properly!
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
686 HAL_DCACHE_IS_ENABLED(cache_state);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
687 if (cache_state) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
688 HAL_DCACHE_INVALIDATE(rxbd->buffer, smc_chan->rxsize); // Make sure no stale data
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
689 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
690 rxbd->length = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
691 rxbd->ctrl |= QUICC_BD_CTL_Ready;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
692 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
693 if (rxbd->ctrl & QUICC_BD_CTL_Wrap) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
694 rxbd = smc_chan->rbase;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
695 } else {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
696 rxbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
697 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
698 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
699 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
700 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
701 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
702 smc_chan->rxbd = (struct cp_bufdesc *)rxbd;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
703 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
704 if (ctl->smc_smce & QUICC_SMCE_BSY) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
705 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
706 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
707 diag_printf("RX BUSY interrupt\n");
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
708 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
709 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
710 ctl->smc_smce = QUICC_SMCE_BSY; // Reset interrupt state;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
711 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
712 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
713 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
714 HAL_CLOCK_READ(&_time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
715 _stime = (int)cyg_current_time();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
716 diag_printf("DSR done - CE: %x, time: %x.%x\n", ctl->smc_smce, _stime, _time);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
717 enable_diag_uart = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
718 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
719 cyg_drv_interrupt_acknowledge(smc_chan->int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
720 cyg_drv_interrupt_unmask(smc_chan->int_num);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
721 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
722 cyg_drv_isr_unlock();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
723 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
724 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
725
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
726 void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
727 show_rxbd(int dump_all)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
728 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
729 #ifdef CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
730 EPPC *eppc = eppc_base();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
731 struct smc_uart_pram *pram = &eppc->pram[2].scc.pothers.smc_modem.psmc.u;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
732 struct cp_bufdesc *rxbd = (struct cp_bufdesc *)((char *)eppc+pram->rbase);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
733 int _enable = enable_diag_uart;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
734 enable_diag_uart = 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
735 #if 1
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
736 diag_printf("SMC Mask: %x, Events: %x, Rbase: %x, Rbptr: %x\n",
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
737 eppc->smc_regs[0].smc_smcm, eppc->smc_regs[0].smc_smce,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
738 pram->rbase, pram->rbptr);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
739 while (true) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
740 diag_printf("Rx BD: %x, ctl: %x, length: %d\n", rxbd, rxbd->ctrl, rxbd->length);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
741 if (rxbd->ctrl & QUICC_BD_CTL_Wrap) break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
742 rxbd++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
743 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
744 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
745 enable_diag_uart = _enable;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
746 if (dump_all) dump_diag_buf();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
747 #endif // CYGDBG_DIAG_BUF
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
748 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
749 #endif // CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
750
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
751 // ------------------------------------------------------------------------
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
752 // EOF powerpc/quicc_smc_serial.c