hal_diag.c

来自「eCos操作系统源码」· C语言 代码 · 共 618 行 · 第 1/2 页

C
618
字号
//=============================================================================////      hal_diag.c////      HAL diagnostic output code////=============================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// 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):    Bob Koninckx// Contributors: Bob Koninckx// Date:         2001-12-11// Purpose:      HAL diagnostic output// Description:  Implementations of HAL diagnostic output support.////####DESCRIPTIONEND####////=============================================================================#include <pkgconf/hal.h>#include <cyg/hal/hal_diag.h>           // our header.#include <cyg/infra/cyg_type.h>         // base types, externC#include <cyg/hal/drv_api.h>            // CYG_ISR_HANDLED#include <cyg/hal/hal_misc.h>           // Helper functions#include <cyg/hal/hal_io.h>             // IO macros#include <cyg/hal/hal_intr.h>           // Interrupt macros#include <cyg/hal/hal_arch.h>           // SAVE/RESTORE GP#include <cyg/hal/hal_if.h>             // Calling-if APIstatic void cyg_hal_plf_serial_init(void);voidcyg_hal_plf_comms_init(void){    static int initialized = 0;    if (initialized)        return;    initialized = 1;    cyg_hal_plf_serial_init();}//=============================================================================// Serial driver//=============================================================================//-----------------------------------------------------------------------------// There are two serial ports.#define CYG_DEV_SERIAL_BASE_A    0x305008 // SCI0#define CYG_DEV_SERIAL_BASE_B    0x305020 // SCI1//-----------------------------------------------------------------------------// Define CYG_DEVICE_SERIAL_RS232_SCIBR// Default baudrate is 38400// These values are calculated for a 40Mhz clock frequency// This should be enough, we did not provide clock frequency as a configuration // option anyway#define CYG_DEV_SERIAL_RS232_SCxBR_300    4167#define CYG_DEV_SERIAL_RS232_SCxBR_600    2083#define CYG_DEV_SERIAL_RS232_SCxBR_1200   1042#define CYG_DEV_SERIAL_RS232_SCxBR_2400    521#define CYG_DEV_SERIAL_RS232_SCxBR_4800    260#define CYG_DEV_SERIAL_RS232_SCxBR_9600    130 #define CYG_DEV_SERIAL_RS232_SCxBR_14400    87#define CYG_DEV_SERIAL_RS232_SCxBR_19200    65#define CYG_DEV_SERIAL_RS232_SCxBR_28800    43#define CYG_DEV_SERIAL_RS232_SCxBR_38400    33#define CYG_DEV_SERIAL_RS232_SCxBR_57600    22#define CYG_DEV_SERIAL_RS232_SCxBR_115200   11//-----------------------------------------------------------------------------// Define the serial registers.#define CYG_DEV_SERIAL_RS232_SCCR0 0x00#define CYG_DEV_SERIAL_RS232_SCCR1 0x01#define CYG_DEV_SERIAL_RS232_SCSR  0x02#define CYG_DEV_SERIAL_RS232_SCDR  0x03#define SCCR0_OTHR   0x8000 // Select baud rate other than system clock#define SCCR0_LINKBD 0x4000 // Link baud#define SCCR0_SCxBR  0x1fff // SCI baud rate#define SCCR1_LOOPS  0x4000 // Loop mode#define SCCR1_WOMS   0x2000 // Wired or for SCI pins#define SCCR1_ILT    0x1000 // Idle line detect type#define SCCR1_PT     0x0800 // Parity type (0 = Odd, 1 = Even)#define SCCR1_PE     0x0400 // Parity enable#define SCCR1_M      0x0200 // Mode select (0 = 10 bit frame, 1 = 11 bit frame)#define SCCR1_WAKE   0x0100 // Wakeup by address mark#define SCCR1_TIE    0x0080 // Transmit interrupt enable#define SCCR1_TCIE   0x0040 // Transmit complete interrupt enable#define SCCR1_RIE    0x0020 // Receiver interrupt enable#define SCCR1_ILIE   0x0010 // Idle line interrupt enable#define SCCR1_TE     0x0008 // Transmiter enable#define SCCR1_RE     0x0004 // Receiver enable#define SCCR1_RWU    0x0002 // Receiver wakeup#define SCCR1_SBK    0x0001 // Send break#define SCSR_TDRE    0x0100 // Transmit data register empty#define SCSR_TC      0x0080 // Transmit complete#define SCSR_RDRF    0x0040 // Receive data register full#define SCSR_RAF     0x0020 // Receive active flag#define SCSR_IDLE    0x0010 // Idle line detected#define SCSR_OR      0x0008 // Overrun error#define SCSR_NF      0x0004 // Noise error flag#define SCSR_FE      0x0002 // Framing error#define SCSR_PF      0x0001 // Parity error//-----------------------------------------------------------------------------typedef struct {    cyg_uint16*  base;                // Base address of the register set    cyg_int32    msec_timeout;        // How long do we wait    int          imb3_vector;         // The vector on the IMB3. No need to worry                                      // about SIU levels or vectors, that's the                                      // responsibility of the application	int          baud_rate;} channel_data_t;//-----------------------------------------------------------------------------static voidinit_serial_channel(const channel_data_t* __ch_data){    cyg_uint16 * base = __ch_data->base;    cyg_uint16 br;        switch(__ch_data->baud_rate)    {    case 300:        br = CYG_DEV_SERIAL_RS232_SCxBR_300;	    break;    case 600:        br = CYG_DEV_SERIAL_RS232_SCxBR_600;        break;    case 1200:        br = CYG_DEV_SERIAL_RS232_SCxBR_1200;        break;    case 2400:        br = CYG_DEV_SERIAL_RS232_SCxBR_2400;        break;    case 4800:        br = CYG_DEV_SERIAL_RS232_SCxBR_4800;        break;    case 9600:        br = CYG_DEV_SERIAL_RS232_SCxBR_9600;        break;    case 14400:        br = CYG_DEV_SERIAL_RS232_SCxBR_14400;        break;    case 19200:        br = CYG_DEV_SERIAL_RS232_SCxBR_19200;        break;    case 28800:        br = CYG_DEV_SERIAL_RS232_SCxBR_28800;        break;    case 38400:        br = CYG_DEV_SERIAL_RS232_SCxBR_38400;        break;    case 57600:        br = CYG_DEV_SERIAL_RS232_SCxBR_57600;        break;    case 115200:        br = CYG_DEV_SERIAL_RS232_SCxBR_115200;        break;    default:        // Use the default if something unknown is requested        br = CYG_DEV_SERIAL_RS232_SCxBR_38400;        break;    }        // 8-1-No parity, enable transmitter and receiver, leave interrupts	// as they are    HAL_WRITE_UINT16(base+CYG_DEV_SERIAL_RS232_SCCR1, (SCCR1_TE | SCCR1_RE));           // Set baud rate    HAL_WRITE_UINT16(base+CYG_DEV_SERIAL_RS232_SCCR0, br);}static cyg_boolcyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch){    cyg_uint16 status;    cyg_uint16 result;    cyg_uint16 * base = ((channel_data_t *)__ch_data)->base;    HAL_READ_UINT16(base+CYG_DEV_SERIAL_RS232_SCSR, status);    if((status & SCSR_RDRF) == 0)        return false;    HAL_READ_UINT16(base+CYG_DEV_SERIAL_RS232_SCDR, result);    *ch = (cyg_uint8)(result & 0x00ff);    return true;}cyg_uint8cyg_hal_plf_serial_getc(void* __ch_data){    cyg_uint8 ch;    CYGARC_HAL_SAVE_GP();    while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch));    CYGARC_HAL_RESTORE_GP();    return ch;}voidcyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 c){    cyg_uint16 status;    cyg_uint16 * base = ((channel_data_t *)__ch_data)->base;    CYGARC_HAL_SAVE_GP();        do {       HAL_READ_UINT16(base+CYG_DEV_SERIAL_RS232_SCSR, status);    } while((status & SCSR_TDRE) == 0);    HAL_WRITE_UINT16(base+CYG_DEV_SERIAL_RS232_SCDR, (short)c);    // Hang around until the character is safely sent    do {       HAL_READ_UINT16(base+CYG_DEV_SERIAL_RS232_SCSR, status);    } while((status & SCSR_TDRE) == 0);             CYGARC_HAL_RESTORE_GP();}// Channel data// Do NOT make them const, will cause problems when trying// to change the timeout parameter ... (Is this a bug in other)// PowerPC platform hals ?? You only see it when you really start from// flash ....static channel_data_t channels[2] = {    { (cyg_uint16*)CYG_DEV_SERIAL_BASE_A,       1000,      CYGNUM_HAL_INTERRUPT_IMB3_SCI0_RX,      CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD },    { (cyg_uint16*)CYG_DEV_SERIAL_BASE_B,       1000,       CYGNUM_HAL_INTERRUPT_IMB3_SCI1_RX,      CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD }};static voidcyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf,                          cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        cyg_hal_plf_serial_putc(__ch_data, *__buf++);    CYGARC_HAL_RESTORE_GP();}static voidcyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        *__buf++ = cyg_hal_plf_serial_getc(__ch_data);    CYGARC_HAL_RESTORE_GP();}cyg_boolcyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch){

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?