quicc2_diag.c
来自「eCos操作系统源码」· C语言 代码 · 共 1,130 行 · 第 1/4 页
C
1,130 行
//=============================================================================//// quicc2_diag.c//// HAL diagnostic I/O support routines for MPC8260/QUICC2////=============================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.// Copyright (C) 2002 Gary Thomas//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): hmt// Contributors:hmt, gthomas// Date: 1999-06-08// Purpose: HAL diagnostics I/O support// Description: ////####DESCRIPTIONEND####////=============================================================================#include <pkgconf/hal.h>#include <cyg/hal/hal_mem.h> // HAL memory definitions#include <cyg/infra/cyg_type.h>#include <cyg/hal/hal_if.h> // hal_if_init#include <cyg/hal/hal_io.h> // hal_if_init#include <cyg/hal/hal_misc.h> // cyg_hal_is_break#include <cyg/hal/drv_api.h> // CYG_ISR_HANDLED// Added by WPD#include <cyg/hal/hal_diag.h>#include <cyg/hal/ppc_regs.h>#include <cyg/hal/var_intr.h>#include <cyg/hal/mpc8260.h> // Needed for IMMR structure// For Baud Rate Calculation, see MPC8260 PowerQUICC II User's Manual// 16.3 UART Baud Rate Examples, page 16-5.// BRGCx[DIV16] = 0 ==> value of 1 (Prescale divider)// BRGCx[EXTC] = 16.667 MHz (Baud Rate generator input clock)// GSMRx_L[xDCR] = 16 (Sampling Rate)// UART_CLK_DIV + 1 = // BRGCx[EXTC] / (BRGCx[DIV16] * UART_BAUD_RATE * GSMRx_L[xDCR])// UART_CLK_DIV = ((66.667 MHz / 4) / (UART_BAUD_RATE * 16)) - 1// UART_CLK_DIV = ((66.667 MHz ) / (UART_BAUD_RATE * 64)) - 1// UART_CLK_DIV = ((CYGHWR_HAL_POWERPC_BOARD_SPEED*1000000 ) // / (UART_BAUD_RATE * 64)) (Calculation will truncate, so // lose the -1 )#define UART_BIT_RATE(n) \ (((int)(CYGHWR_HAL_POWERPC_BOARD_SPEED*1000000))/(n * 64))#define UART_BAUD_RATE CYGNUM_HAL_DIAG_BAUD/***********************//* Global Declarations *//***********************///#define USE_SMC1volatile t_PQ2IMM *IMM; /* IMM base pointer */volatile BDRINGS *RxTxBD; /* buffer descriptors base pointer */volatile LB *SCC1Buffers; /* SCC1 base pointers */#define SMC1_PRAM 0x04703800#define BD_RX_ERROR 0xBF /* Mask for set of Receive Buffer Errors, including: DE, LG, NO, AB, CR, OV, CD *//*---------------------*//* Function Prototypes *//*---------------------*/static void InitSCC1Uart(void);static void ConfigSCC1Clock(void);static void InitParallelPorts(void);static cyg_uint8 SCC1Poll(void);static void InitBDs(void);static cyg_uint8cyg_hal_plf_serial_getc(void* __ch_data);static cyg_boolcyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch);static cyg_boolcyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch);static voidcyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 ch);static voidcyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len);static voidcyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len);static voidcyg_hal_plf_serial_init_channel(void);static intcyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc, CYG_ADDRWORD __vector, CYG_ADDRWORD __data);static intcyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...);static intcyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc, CYG_ADDRWORD __vector, CYG_ADDRWORD __data){ t_PQ2IMM *immr = (t_PQ2IMM*) __ch_data; struct cp_bufdesc *bd; char ch; int res = 0; cyg_uint32 regval; CYGARC_HAL_SAVE_GP(); //GREEN_LED_ON;/* dbg_values[3]++; dbg_values[10+dbg_values[3]] = RxTxBD->RxBD.bd_cstatus | (immr->scc_regs[SCC1].scce<<16);*/ *__ctrlc = 0; if (immr->scc_regs[SCC1].scce & 0x0001) { // Clear the event by writing a "1" to the prpoper bit. immr->scc_regs[SCC1].scce = 0x0001; if((RxTxBD->RxBD.bd_cstatus & 0x8000) == 0){ ch = *(RxTxBD->RxBD.bd_addr); /*----------------------*/ /* Set Buffer Empty bit */ /*----------------------*/ //dbg_values[10+dbg_values[3]] = __vector | 0xffff0000; //dbg_values[10+dbg_values[3]] |= ch << 8; RxTxBD->RxBD.bd_cstatus |= 0x8000; if( cyg_hal_is_break( &ch , 1 ) ){ //GREEN_LED_ON; *__ctrlc = 1; //dbg_values[7] = immr->ic_sivec; } } // Interrupt handled. Acknowledge it. //eppc->cpmi_cisr = 0x10; // Clear interrupt in SIPNR_L by writing a one to bit 8 (0x800000) HAL_READ_UINT32( ((char *) IMM) + 0x10000 + CYGARC_REG_IMM_SIPNR_L, regval); regval |= 0x00800000; HAL_WRITE_UINT32( ((char *) IMM) + 0x10000 + CYGARC_REG_IMM_SIPNR_L, regval); res = CYG_ISR_HANDLED; } //GREEN_LED_OFF; CYGARC_HAL_RESTORE_GP(); return res;}/* Early initialization of comm channels. Must not rely * on interrupts, yet. Interrupt operation can be enabled * in _bsp_board_init(). */voidcyg_hal_plf_serial_init(void){#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT hal_virtual_comm_table_t* comm; int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); static int init = 0; // It's wrong to do this more than once if (init) return; init++; // init_channel sets the global *IMM == 0x04700000, the base of the // Internal Memory map for the MPC8260 cyg_hal_plf_serial_init_channel(); // Setup procs in the vector table // Set channel 0 CYGACC_CALL_IF_SET_CONSOLE_COMM(0);// Should be configurable! comm = CYGACC_CALL_IF_CONSOLE_PROCS(); CYGACC_COMM_IF_CH_DATA_SET(*comm, IMM); CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write); CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read); CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc); CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc); CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control); CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr); CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout); // Restore original console CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);#else // No CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT static int init = 0; // It's wrong to do this more than once if (init) return; init++; cyg_hal_plf_serial_init_channel();#endif}static voidcyg_hal_plf_serial_init_channel(void){ /* We will assume here that the IMMR has been programmed such that * the internal Memory Map starts at 0x04700000. Initialization * should have done that setup. */ IMM = (t_PQ2IMM *)0x04700000; /* MPC8260 internal register map */ /*----------------------------------------------------------------------*/ /* Get a pointer to the BD area on DP RAM. The buffer descriptors (BDs) */ /* and the Rx/Tx data buffers will be located right after SCC1's para- */ /* meter RAM area because only 2 BDs and 2 data buffers are being used */ /* for this port and SCC1 only uses 64 bytes of it's allotted 256 for */ /* it's parameter ram. One BD and one data buffer each for transmit and */ /* receive will be used. This buffer descriptor area will take up 16 */ /* bytes. */ /*----------------------------------------------------------------------*/ RxTxBD = (BDRINGS *) 0x04708070; // (((CYG_WORD)&(IMM->pram.serials.scc_pram[SCC1])) + 72); //RxTxBD = (BDRINGS *) // (((CYG_WORD)&(IMM->pram.serials.scc_pram[SCC1])) + 72); /*-------------------------------------------------------------------*/ /* Establish the buffer pool in Dual Port RAM. We do this because the*/ /* pool size is only 2 bytes (1 for Rx and 1 for Tx) and to avoid */ /* disabling data cache for the memory region where BufferPool would */ /* reside. The CPM does not recognize data in buffer pools once it */ /* been cached. It's acesses are direct through DMA to external */ /* memory. */ /*-------------------------------------------------------------------*/ //SCC1Buffers = (LB *) // (((CYG_WORD)&(IMM->pram.serials.scc_pram[SCC1])) + 96); SCC1Buffers = (LB *) 0x04708090; // (((CYG_WORD)&(IMM->pram.serials.scc_pram[SCC1])) // + 72 + 14); /*----------------------------------------*/ /* Initialize SCC1 and buffer descriptors */ /*----------------------------------------*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?