OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [powerpc/] [quicc/] [current/] [src/] [cpm.c] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
//==========================================================================
2
//
3
//      cpm.c
4
//
5
//      PowerPC QUICC support functions
6
//
7
//==========================================================================
8
// ####ECOSGPLCOPYRIGHTBEGIN####                                            
9
// -------------------------------------------                              
10
// This file is part of eCos, the Embedded Configurable Operating System.   
11
// Copyright (C) 2003 Free Software Foundation, Inc.                        
12
//
13
// eCos is free software; you can redistribute it and/or modify it under    
14
// the terms of the GNU General Public License as published by the Free     
15
// Software Foundation; either version 2 or (at your option) any later      
16
// version.                                                                 
17
//
18
// eCos is distributed in the hope that it will be useful, but WITHOUT      
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
20
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
21
// for more details.                                                        
22
//
23
// You should have received a copy of the GNU General Public License        
24
// along with eCos; if not, write to the Free Software Foundation, Inc.,    
25
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
26
//
27
// As a special exception, if other files instantiate templates or use      
28
// macros or inline functions from this file, or you compile this file      
29
// and link it with other works to produce a work based on this file,       
30
// this file does not by itself cause the resulting work to be covered by   
31
// the GNU General Public License. However the source code for this file    
32
// must still be made available in accordance with section (3) of the GNU   
33
// General Public License v2.                                               
34
//
35
// This exception does not invalidate any other reasons why a work based    
36
// on this file might be covered by the GNU General Public License.         
37
// -------------------------------------------                              
38
// ####ECOSGPLCOPYRIGHTEND####                                              
39
//==========================================================================
40
//#####DESCRIPTIONBEGIN####
41
//
42
// Author(s):    Gary Thomas 
43
// Contributors: 
44
// Date:         2003-03-04
45
// Purpose:      Common support for the QUICC/CPM
46
// Description:  
47
//               
48
// Usage:
49
// Notes:        
50
//
51
//####DESCRIPTIONEND####
52
//
53
//==========================================================================
54
 
55
#include <pkgconf/hal.h>
56
#include <pkgconf/hal_powerpc_quicc.h>
57
#include <cyg/infra/cyg_type.h>
58
#include <cyg/infra/cyg_ass.h>
59
#include <cyg/hal/hal_arch.h>
60
#include <string.h>           // memset
61
 
62
// eCos headers decribing PowerQUICC:
63
#include <cyg/hal/quicc/ppc8xx.h>
64
 
65
// Information about DPRAM usage
66
// This lets the CPM/DPRAM information be shared by all environments
67
//
68
static short *nextBd = (short *)(CYGHWR_HAL_VSR_TABLE + 0x1F0);
69
 
70
/*
71
 * Reset the communications processor
72
 */
73
 
74
void
75
_mpc8xx_reset_cpm(void)
76
{
77
    EPPC *eppc = eppc_base();
78
    static int init_done = 0;
79
 
80
    if (init_done) return;
81
    init_done++;
82
 
83
    eppc->cp_cr = QUICC_CPM_CR_RESET | QUICC_CPM_CR_BUSY;
84
    memset(eppc->pram, 0, sizeof(eppc->pram));
85
    while (eppc->cp_cr & QUICC_CPM_CR_BUSY)
86
        CYG_EMPTY_STATEMENT;
87
 
88
    *nextBd = QUICC_BD_BASE;
89
}
90
 
91
//
92
// Allocate a chunk of memory in the shared CPM memory, typically
93
// used for buffer descriptors, etc.  The length will be aligned
94
// to a multiple of 8 bytes.
95
//
96
unsigned short
97
_mpc8xx_allocBd(int len)
98
{
99
    unsigned short bd;
100
 
101
    bd = *nextBd;
102
    if ((bd < QUICC_BD_BASE) || (bd > QUICC_BD_END)) {
103
        // Most likely not set up - make a guess :-(
104
        bd = *nextBd = QUICC_BD_BASE+0x400;
105
    }
106
    CYG_ASSERT((len & 0x7) == 0, "BD length must be multiple of 8 bytes");
107
    len = (len + 7) & ~7;  // Multiple of 8 bytes
108
    *nextBd += len;
109
    CYG_ASSERT(*nextBd < QUICC_BD_END, "Out of buffer descriptors!");
110
    if (*nextBd >= QUICC_BD_END) {
111
        *nextBd = QUICC_BD_BASE;
112
    }
113
    return bd;
114
}
115
 
116
#define BRG_MAX      4
117
#define BRG_UNAVAIL -1
118
#define BRG_FREE    -2
119
static unsigned long *brg[BRG_MAX];  // Available generators
120
static int alloc[BRG_MAX];           // Which port is assigned where
121
                                     // -1 indicates unavailable
122
                                     // -2 indicates free
123
                                     // xx indicates port assignment
124
 
125
static void
126
_mpc8xx_mark_brg(int port, int brgnum)
127
{
128
    if (brgnum >= BRG_MAX) {
129
        return;  // Invalid selection
130
    }
131
    if (alloc[brgnum] == BRG_FREE) {
132
        // Allocation unknown
133
        alloc[brgnum] = port;
134
    }
135
}
136
 
137
unsigned long *
138
_mpc8xx_allocate_brg(int port)
139
{
140
    EPPC *eppc = eppc_base();
141
    static int init = 0;
142
    int brgnum;
143
 
144
    if (!init) {
145
        // Set up available pool
146
#if defined(CYGHWR_HAL_POWERPC_MPC8XX_852T)
147
        // The 852T variant only has BRG3/BRG4
148
        alloc[0] = BRG_UNAVAIL;
149
        alloc[1] = BRG_UNAVAIL;
150
#else
151
        brg[0] = (unsigned long *)&eppc->brgc1;  alloc[0] = BRG_FREE;
152
        brg[1] = (unsigned long *)&eppc->brgc2;  alloc[1] = BRG_FREE;
153
#endif
154
        brg[2] = (unsigned long *)&eppc->brgc3;  alloc[2] = BRG_FREE;
155
        brg[3] = (unsigned long *)&eppc->brgc4;  alloc[3] = BRG_FREE;
156
#if !defined(CYGSEM_HAL_ROM_MONITOR)
157
        // Figure out how hardware was set by previous ROM monitor
158
#if CYGNUM_HAL_QUICC_SMC1 > 0
159
        _mpc8xx_mark_brg(QUICC_CPM_SMC1, (eppc->si_simode >> 12) & 0x07);
160
#endif
161
#if CYGNUM_HAL_QUICC_SMC2 > 0
162
        _mpc8xx_mark_brg(QUICC_CPM_SMC2, (eppc->si_simode >> 28) & 0x07);
163
#endif
164
#if CYGNUM_HAL_QUICC_SCC1 > 0
165
        _mpc8xx_mark_brg(QUICC_CPM_SCC1, (eppc->si_sicr >> 0) & 0x07);
166
#endif
167
#if CYGNUM_HAL_QUICC_SCC2 > 0
168
        _mpc8xx_mark_brg(QUICC_CPM_SCC2, (eppc->si_sicr >> 8) & 0x07);
169
#endif
170
#if CYGNUM_HAL_QUICC_SCC3 > 0
171
        _mpc8xx_mark_brg(QUICC_CPM_SCC3, (eppc->si_sicr >> 16) & 0x07);
172
#endif
173
#if CYGNUM_HAL_QUICC_SCC4 > 0
174
        _mpc8xx_mark_brg(QUICC_CPM_SCC4, (eppc->si_sicr >> 24) & 0x07);
175
#endif
176
#endif
177
        init = 1;
178
    }
179
    // Find a free generator (or if port has already been assigned)
180
    for (brgnum = 0;  brgnum < BRG_MAX;  brgnum++) {
181
        if (alloc[brgnum] >= 0) {
182
            // See if it is for this port
183
            if (alloc[brgnum] == port) {
184
                // It is - just reuse it (already set up)
185
                return brg[brgnum];
186
            }
187
        }
188
    }
189
    // Not currently assigned, try and find a free one
190
    for (brgnum = 0;  brgnum < BRG_MAX;  brgnum++) {
191
        if (alloc[brgnum] == BRG_FREE) {
192
            // Allocate to this port.
193
            alloc[brgnum] = port;
194
            break;
195
        }
196
    }
197
    CYG_ASSERT(brgnum < BRG_MAX, "Out of baud rate generators!");
198
    // If no generator found - punt!
199
    if (brgnum == BRG_MAX) {
200
        brgnum = BRG_MAX-1;
201
    }
202
    // Set up clock routing for new assignment
203
    switch (port) {
204
#if CYGNUM_HAL_QUICC_SMC1 > 0
205
    case QUICC_CPM_SMC1:
206
        eppc->si_simode = (eppc->si_simode & ~(0x07<<12)) | (brgnum<<12);
207
        break;
208
#endif
209
#if CYGNUM_HAL_QUICC_SMC2 > 0
210
    case QUICC_CPM_SMC2:
211
        eppc->si_simode = (eppc->si_simode & ~(0x07<<28)) | (brgnum<<28);
212
        break;
213
#endif
214
#if CYGNUM_HAL_QUICC_SCC1 > 0
215
    case QUICC_CPM_SCC1:
216
        eppc->si_sicr = (eppc->si_sicr & ~(0xFF<<0)) | (((brgnum<<3)|(brgnum<<0))<<0);
217
        break;
218
#endif
219
#if CYGNUM_HAL_QUICC_SCC2 > 0
220
    case QUICC_CPM_SCC2:
221
        eppc->si_sicr = (eppc->si_sicr & ~(0xFF<<8)) | (((brgnum<<3)|(brgnum<<0))<<8);
222
        break;
223
#endif
224
#if CYGNUM_HAL_QUICC_SCC3 > 0
225
    case QUICC_CPM_SCC3:
226
        eppc->si_sicr = (eppc->si_sicr & ~(0xFF<<16)) | (((brgnum<<3)|(brgnum<<0))<<16);
227
        break;
228
#endif
229
#if CYGNUM_HAL_QUICC_SCC4 > 0
230
    case QUICC_CPM_SCC4:
231
        eppc->si_sicr = (eppc->si_sicr & ~(0xFF<<24)) | (((brgnum<<3)|(brgnum<<0))<<24);
232
        break;
233
#endif
234
    }
235
    return brg[brgnum];
236
}
237
 
238
// EOF cpm.c

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.