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

📄 hal_diag.c

📁 移植到WLIT项目的redboot源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    CYGARC_HAL_RESTORE_GP();    return ret;}static intcyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc,                        CYG_ADDRWORD __vector, CYG_ADDRWORD __data){    int res = 0;    channel_data_t* chan = (channel_data_t*)__ch_data;    char c;    int reg;    CYGARC_HAL_SAVE_GP();    reg = chan->base->utsr1;    // read it anyway just in case - no harm done and we might prevent an    // interrupt loop    c = (char)chan->base->utdr;    //Clear receiver idle status bit, to allow another interrupt to    //occur in the case where the receive fifo is almost empty.    chan->base->utsr0 = SA11X0_UART_RX_IDLE;    cyg_drv_interrupt_acknowledge(chan->isr_vector);    *__ctrlc = 0;    if ( (reg & SA11X0_UART_RX_FIFO_NOT_EMPTY) != 0 ) {        if( cyg_hal_is_break( &c , 1 ) )            *__ctrlc = 1;        res = CYG_ISR_HANDLED;    }    CYGARC_HAL_RESTORE_GP();    return res;}static voidcyg_hal_plf_serial_init(void){    hal_virtual_comm_table_t* comm;    int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);    // Init channels    init_channel(&ser_channels[0]);#if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS == 2)    init_channel(&ser_channels[1]);#endif    // Setup procs in the vector table    // Set channel 0    CYGACC_CALL_IF_SET_CONSOLE_COMM(0);    comm = CYGACC_CALL_IF_CONSOLE_PROCS();    CYGACC_COMM_IF_CH_DATA_SET(*comm, &ser_channels[0]);    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);#if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS == 2)    // Set channel 1    CYGACC_CALL_IF_SET_CONSOLE_COMM(1);    comm = CYGACC_CALL_IF_CONSOLE_PROCS();    CYGACC_COMM_IF_CH_DATA_SET(*comm, &ser_channels[1]);    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);#endif         // Restore original console    CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);}voidcyg_hal_plf_comms_init(void){    static int initialized = 0;    if (initialized)        return;    initialized = 1;    cyg_hal_plf_serial_init();}#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES//=============================================================================// Compatibility with older stubs//=============================================================================#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG#include <cyg/hal/hal_stub.h>           // cyg_hal_gdb_interrupt#if (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL == 0)# define __BASE ((void*)SA11X0_UART1_BASE)# define CYGHWR_HAL_GDB_PORT_VECTOR CYGNUM_HAL_INTERRUPT_UART1#else# define __BASE ((void*)SA11X0_UART3_BASE)# define CYGHWR_HAL_GDB_PORT_VECTOR CYGNUM_HAL_INTERRUPT_UART3#endif#ifdef CYGSEM_HAL_ROM_MONITOR#define CYG_HAL_STARTUP_ROM#undef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS#endif#if defined(CYG_HAL_STARTUP_ROM) && !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)#define HAL_DIAG_USES_HARDWARE#elif defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL)#define HAL_DIAG_USES_HARDWARE#elif CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL != CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL#define HAL_DIAG_USES_HARDWARE#endifstatic channel_data_t ser_channel = {    (volatile struct sa11x0_serial*)__BASE, 0, CYGHWR_HAL_GDB_PORT_VECTOR};void hal_diag_init(void){    // Init serial device    init_channel(&ser_channel);}#ifdef HAL_DIAG_USES_HARDWARE#ifdef DEBUG_DIAG#ifndef CYG_HAL_STARTUP_ROM#define DIAG_BUFSIZE 2048static char diag_buffer[DIAG_BUFSIZE];static int diag_bp = 0;#endif#endifvoid hal_diag_read_char(char *c){    *c = cyg_hal_plf_serial_getc(&ser_channel);}void hal_diag_write_char(char c){#ifdef DEBUG_DIAG#ifndef CYG_HAL_STARTUP_ROM    diag_buffer[diag_bp++] = c;    if (diag_bp == sizeof(diag_buffer)) diag_bp = 0;#endif#endif    cyg_hal_plf_serial_putc(&ser_channel, c);}#else // not HAL_DIAG_USES_HARDWARE - it uses GDB protocolvoid hal_diag_read_char(char *c){    *c = cyg_hal_plf_serial_getc(&ser_channel);}void hal_diag_write_char(char c){    static char line[100];    static int pos = 0;    // FIXME: Some LED blinking might be nice right here.    // No need to send CRs    if( c == '\r' ) return;    line[pos++] = c;    if( c == '\n' || pos == sizeof(line) )    {                CYG_INTERRUPT_STATE old;        // Disable interrupts. This prevents GDB trying to interrupt us        // while we are in the middle of sending a packet. The serial        // receive interrupt will be seen when we re-enable interrupts        // later.        #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS        CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old);#else        HAL_DISABLE_INTERRUPTS(old);#endif        while(1)        {            static char hex[] = "0123456789ABCDEF";            cyg_uint8 csum = 0;            int i;#ifndef CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT            char c1;#endif                    cyg_hal_plf_serial_putc(&ser_channel, '$');            cyg_hal_plf_serial_putc(&ser_channel, 'O');            csum += 'O';            for( i = 0; i < pos; i++ )            {                char ch = line[i];                char h = hex[(ch>>4)&0xF];                char l = hex[ch&0xF];                cyg_hal_plf_serial_putc(&ser_channel, h);                cyg_hal_plf_serial_putc(&ser_channel, l);                csum += h;                csum += l;            }            cyg_hal_plf_serial_putc(&ser_channel, '#');            cyg_hal_plf_serial_putc(&ser_channel, hex[(csum>>4)&0xF]);            cyg_hal_plf_serial_putc(&ser_channel, hex[csum&0xF]);#ifdef CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT            break; // regardless#else // not CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT Ie. usually...            // Wait for the ACK character '+' from GDB here and handle            // receiving a ^C instead.  This is the reason for this clause            // being a loop.            c1 = cyg_hal_plf_serial_getc(&ser_channel);            if( c1 == '+' )                break;              // a good acknowledge#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT            cyg_drv_interrupt_acknowledge(CYGHWR_HAL_GDB_PORT_VECTOR);            if( c1 == 3 ) {                // Ctrl-C: breakpoint.                cyg_hal_gdb_interrupt(                    (target_register_t)__builtin_return_address(0) );                break;            }#endif // CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT#endif // ! CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT            // otherwise, loop round again        }                pos = 0;                // And re-enable interrupts#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS        CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old);#else        HAL_RESTORE_INTERRUPTS(old);#endif            }}#endif#endif // !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG/*---------------------------------------------------------------------------*//* End of hal_diag.c */

⌨️ 快捷键说明

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