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

📄 hal_diag.c

📁 移植到WLIT项目的redboot源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}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((void*)UART_BASE_0);    // 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, UART_BASE_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);    // 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#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS#include <cyg/hal/hal_stub.h>           // cyg_hal_gdb_interrupt#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_DIAG_DISABLE_GDB_PROTOCOL)#define HAL_DIAG_USES_HARDWARE#endif/*---------------------------------------------------------------------------*/// EBSA285 Serial Port (UARTx) for Debugvoid hal_diag_init(void){  init_channel((void*)UART_BASE_0);}// Actually send character down the wirestatic voidhal_diag_write_char_serial(char c){    cyg_hal_plf_serial_putc((void*)UART_BASE_0, c);}static boolhal_diag_read_serial(char *c){    long timeout = 1000000000;  // A long time...    while (! cyg_hal_plf_serial_getc_nonblock((void*)UART_BASE_0, c) )        if ( --timeout == 0 ) return false;    return true;}/* * Baud rate selection stuff */#if 0struct _baud {    int baud;    unsigned short divisor_high, divisor_low;};const static struct _baud bauds[] = {#if (FCLK_MHZ == 50)    {   300, 0xA, 0x2B},                  /* 2603  = 0x0A2B */    {   600, 0x5, 0x15},                  /* 1301  = 0x0515 */    {  1200, 0x2, 0x8A},                  /* 650   = 0x028A */    {  2400, 0x1, 0x45},                  /* 325   = 0x0145 */    {  4800, 0x0, 0xA2},                  /* 162   = 0x00A2 */    {  9600, 0x0, 0x50},                  /* 80    = 0x0050 */    { 19200, 0x0, 0x28},                  /* 40    = 0x0028 */    { 38400, 0x0, 0x13},                  /* 19    = 0x0013 */#elif (FCLK_MHZ == 60)    {   300, 0xC, 0x34},                  /* 2603  = 0x0A2B */    {   600, 0x6, 0x19},                  /* 1301  = 0x0515 */    {  1200, 0x3, 0x0C},                  /* 650   = 0x028A */    {  2400, 0x1, 0x86},                  /* 325   = 0x0145 */    {  4800, 0x0, 0xC2},                  /* 162   = 0x00A2 */    {  9600, 0x0, 0x61},                  /* 80    = 0x0050 */    { 19200, 0x0, 0x30},                  /* 40    = 0x0028 */    { 38400, 0x0, 0x17},                  /* 19    = 0x0013 */#endif};#endif#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){    while (!hal_diag_read_serial(c)) ;}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    hal_diag_write_char_serial(c);}#else // not HAL_DIAG_USES_HARDWARE - it uses GDB protocolvoid hal_diag_read_char(char *c){    while (!hal_diag_read_serial(c)) ;}void hal_diag_write_char(char c){    static char line[100];    static int pos = 0;#if 0    // Do not unconditionally poke the XBUS LED location - XBUS may not be    // available if external arbiter is in use.  This fragment may still be    // useful for debugging in the future, so left thus:    {//        int i;        *(cyg_uint32 *)0x40012000 = 7 & (cyg_uint32)c; // LED XBUS location//        for ( i = 0x1000000; i > 0; i-- ) ;    }#endif    // 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                    hal_diag_write_char_serial('$');            hal_diag_write_char_serial('O');            csum += 'O';            for( i = 0; i < pos; i++ )            {                char ch = line[i];                char h = hex[(ch>>4)&0xF];                char l = hex[ch&0xF];                hal_diag_write_char_serial(h);                hal_diag_write_char_serial(l);                csum += h;                csum += l;            }            hal_diag_write_char_serial('#');            hal_diag_write_char_serial(hex[(csum>>4)&0xF]);            hal_diag_write_char_serial(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.            if (!hal_diag_read_serial(&c1))                continue;   // No response - try sending packet again            if( c1 == '+' )                break;              // a good acknowledge#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT            cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_SERIAL_RX);            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 + -