hal_diag.c
来自「eCos操作系统源码」· C语言 代码 · 共 621 行 · 第 1/2 页
C
621 行
//=============================================================================//// 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; cyg_int32 msec_timeout; int siu_vector; int imb3_vector; unsigned int level; 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 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_SIU_LVL0, CYGNUM_HAL_INTERRUPT_IMB3_SCI0_RX, 0, CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD }, { (cyg_uint16*)CYG_DEV_SERIAL_BASE_B, 1000, CYGNUM_HAL_INTERRUPT_SIU_LVL0, CYGNUM_HAL_INTERRUPT_IMB3_SCI1_RX, 0, 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 + -
显示快捷键?