⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal_diag.c

📁 移植到WLIT项目的redboot源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*=============================================================================////      hal_diag.c////      HAL diagnostic output code////=============================================================================//####COPYRIGHTBEGIN####//// -------------------------------------------// The contents of this file are subject to the Red Hat eCos Public License// Version 1.1 (the "License"); you may not use this file except in// compliance with the License.  You may obtain a copy of the License at// http://www.redhat.com///// Software distributed under the License is distributed on an "AS IS"// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the// License for the specific language governing rights and limitations under// the License. //// The Original Code is eCos - Embedded Configurable Operating System,// released September 30, 1998.//// The Initial Developer of the Original Code is Red Hat.// Portions created by Red Hat are// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.// All Rights Reserved.// -------------------------------------------////####COPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s):   gthomas// Contributors:nickg, gthomas, dmoseley//              Travis C. Furrer <furrer@mit.edu>// Date:        2000-05-08// Purpose:     HAL diagnostic output// Description: Implementations of HAL diagnostic output support.////####DESCRIPTIONEND####////===========================================================================*/#include <pkgconf/hal.h>#include <pkgconf/system.h>#include CYGBLD_HAL_PLATFORM_H#include <cyg/infra/cyg_type.h>         // base types#include <cyg/infra/cyg_trac.h>         // tracing macros#include <cyg/infra/cyg_ass.h>          // assertion macros#include <cyg/hal/hal_arch.h>           // basic machine info#include <cyg/hal/hal_intr.h>           // interrupt macros#include <cyg/hal/hal_io.h>             // IO macros#include <cyg/hal/hal_if.h>             // Calling interface definitions#include <cyg/hal/hal_diag.h>#include <cyg/hal/drv_api.h>            // cyg_drv_interrupt_acknowledge#include <cyg/hal/hal_misc.h>           // Helper functions#include <cyg/hal/hal_sa11x0.h>         // Hardware definitionsstruct sa11x0_serial {  volatile cyg_uint32 utcr0;  volatile cyg_uint32 utcr1;  volatile cyg_uint32 utcr2;  volatile cyg_uint32 utcr3;  volatile cyg_uint32 pad0010;  volatile cyg_uint32 utdr;  volatile cyg_uint32 pad0018;  volatile cyg_uint32 utsr0;  volatile cyg_uint32 utsr1;};//-----------------------------------------------------------------------------typedef struct {    volatile struct sa11x0_serial* base;    cyg_int32 msec_timeout;    int isr_vector;} channel_data_t;/*---------------------------------------------------------------------------*/// SA11x0 Serial Port (UARTx) for Debugstatic voidinit_channel(channel_data_t* __ch_data){    volatile struct sa11x0_serial* base = __ch_data->base;    cyg_uint32 brd;    // Disable Receiver and Transmitter (clears FIFOs)    base->utcr3 = SA11X0_UART_RX_DISABLED | SA11X0_UART_TX_DISABLED;    // Clear sticky (writable) status bits.    base->utsr0 = SA11X0_UART_RX_IDLE | SA11X0_UART_RX_BEGIN_OF_BREAK |                  SA11X0_UART_RX_END_OF_BREAK;#if defined(CYGPKG_HAL_ARM_SA11X0_SA1100MM) || defined(CYGPKG_HAL_ARM_SA11X0_BRUTUS)   // This setup is specific to only a few boards.   if (SA11X0_UART1_BASE == (volatile unsigned long *)base) {        cyg_uint32 pdr, afr, par;        HAL_READ_UINT32(SA11X0_GPIO_PIN_DIRECTION, pdr);        HAL_READ_UINT32(SA11X0_GPIO_ALTERNATE_FUNCTION, afr);        HAL_READ_UINT32(SA11X0_PPC_PIN_ASSIGNMENT, par);        //Set pin 14 as an output (Tx) and pin 15 as in input (Rx).        HAL_WRITE_UINT32(SA11X0_GPIO_PIN_DIRECTION, ((pdr | SA11X0_GPIO_PIN_14) & ~SA11X0_GPIO_PIN_15));        // Use GPIO 14 & 15 pins for serial port 1.        HAL_WRITE_UINT32(SA11X0_GPIO_ALTERNATE_FUNCTION, afr | SA11X0_GPIO_PIN_14 | SA11X0_GPIO_PIN_15);        // Pin reassignment for serial port 1.        HAL_WRITE_UINT32(SA11X0_PPC_PIN_ASSIGNMENT, par | SA11X0_PPC_UART_PIN_REASSIGNMENT_MASK);    }#endif    // Set UART to 8N1 (8 data bits, no partity, 1 stop bit)    base->utcr0 = SA11X0_UART_PARITY_DISABLED | SA11X0_UART_STOP_BITS_1 |                  SA11X0_UART_DATA_BITS_8;    // Set the desired baud rate.    brd = SA11X0_UART_BAUD_RATE_DIVISOR(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD);    base->utcr1 = (brd >> 8) & SA11X0_UART_H_BAUD_RATE_DIVISOR_MASK;    base->utcr2 = brd & SA11X0_UART_L_BAUD_RATE_DIVISOR_MASK;    // Enable the receiver and the transmitter.    base->utcr3 = SA11X0_UART_RX_ENABLED | SA11X0_UART_TX_ENABLED;    // All done}voidcyg_hal_plf_serial_putc(void *__ch_data, char c){    volatile struct sa11x0_serial* base = ((channel_data_t*)__ch_data)->base;    CYGARC_HAL_SAVE_GP();    // Wait for Tx FIFO not full    while ((base->utsr1 & SA11X0_UART_TX_FIFO_NOT_FULL) == 0)        ;    base->utdr = c;    CYGARC_HAL_RESTORE_GP();}// FIXME: shouldn't we check for PARITY_ERROR, FRAMING_ERROR, or// RECEIVE_FIFO_OVERRUN_ERROR in the received data?  This// means check the appropriate bits in UTSR1.static cyg_boolcyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch){    volatile struct sa11x0_serial* base = ((channel_data_t*)__ch_data)->base;    // If receive fifo is empty, return false    if ((base->utsr1 & SA11X0_UART_RX_FIFO_NOT_EMPTY) == 0)        return false;    *ch = (char)base->utdr;    // Clear receiver idle status bit, to allow another interrupt to    // occur in the case where the receive fifo is almost empty.    base->utsr0 = SA11X0_UART_RX_IDLE;    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;}#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \    || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES)static channel_data_t ser_channels[2] = {    { (volatile struct sa11x0_serial*)SA11X0_UART1_BASE, 1000, CYGNUM_HAL_INTERRUPT_UART1 },    { (volatile struct sa11x0_serial*)SA11X0_UART3_BASE, 1000, CYGNUM_HAL_INTERRUPT_UART3 }};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){    int delay_count;    channel_data_t* chan = (channel_data_t*)__ch_data;    cyg_bool res;    CYGARC_HAL_SAVE_GP();    delay_count = chan->msec_timeout * 10; // delay in .1 ms steps    for(;;) {        res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch);        if (res || 0 == delay_count--)            break;                CYGACC_CALL_IF_DELAY_US(100);    }    CYGARC_HAL_RESTORE_GP();    return res;}static intcyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...){    static int irq_state = 0;    channel_data_t* chan = (channel_data_t*)__ch_data;    int ret = 0;    CYGARC_HAL_SAVE_GP();    switch (__func) {    case __COMMCTL_IRQ_ENABLE:        irq_state = 1;        chan->base->utcr3 |= SA11X0_UART_RX_FIFO_INT_ENABLED;        HAL_INTERRUPT_UNMASK(chan->isr_vector);        break;    case __COMMCTL_IRQ_DISABLE:        ret = irq_state;        irq_state = 0;        chan->base->utcr3 &= ~SA11X0_UART_RX_FIFO_INT_ENABLED;        HAL_INTERRUPT_MASK(chan->isr_vector);        break;    case __COMMCTL_DBG_ISR_VECTOR:        ret = chan->isr_vector;        break;    case __COMMCTL_SET_TIMEOUT:    {        va_list ap;        va_start(ap, __func);        ret = chan->msec_timeout;        chan->msec_timeout = va_arg(ap, cyg_uint32);        va_end(ap);    }            default:        break;    }

⌨️ 快捷键说明

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