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

📄 hal_if.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 3 页
字号:
        CYGACC_CALL_IF_DEBUG_PROCS_SET(0);        __selected_id = __comm_id;        break;    case CYGNUM_CALL_IF_SET_COMM_ID_MANGLER:        __comm_id = 0;        update = 1;        break;    default:        __comm_id++;                    // skip mangler entry        update = 1;        break;    }    if (update) {        // Find the interrupt state of the channel.        __chan = CYGACC_CALL_IF_DEBUG_PROCS();        if (__chan)            interrupt_state = CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_DISABLE);        __selected_id = __comm_id;        CYGACC_CALL_IF_DEBUG_PROCS_SET(comm_channels[__comm_id]);        // Set interrupt state on the new channel.        __chan = CYGACC_CALL_IF_DEBUG_PROCS();        if (interrupt_state)            CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_ENABLE);        else            CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_DISABLE);    }    CYGARC_HAL_RESTORE_GP();    return res;}static intset_console_comm(int __comm_id){    static int __selected_id = CYGNUM_CALL_IF_SET_COMM_ID_EMPTY;    int res = 1, update = 0;    CYGARC_HAL_SAVE_GP();    CYG_ASSERT(__comm_id >= CYGNUM_CALL_IF_SET_COMM_ID_MANGLER               && __comm_id < CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS,               "Invalid channel");    switch (__comm_id) {    case CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT:        if (__selected_id > 0)            res = __selected_id-1;        else if (__selected_id == 0)            res = CYGNUM_CALL_IF_SET_COMM_ID_MANGLER;        else            res = __selected_id;        break;    case CYGNUM_CALL_IF_SET_COMM_ID_EMPTY:        CYGACC_CALL_IF_CONSOLE_PROCS_SET(0);        __selected_id = __comm_id;        break;    case CYGNUM_CALL_IF_SET_COMM_ID_MANGLER:        __comm_id = 0;        update = 1;        break;    default:        __comm_id++;                    // skip mangler entry        update = 1;        break;    }        if (update) {        __selected_id = __comm_id;            CYGACC_CALL_IF_CONSOLE_PROCS_SET(comm_channels[__comm_id]);    }    CYGARC_HAL_RESTORE_GP();    return res;}#endif//----------------------------------// Cache functions#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_CACHEstatic voidflush_icache(void *__p, int __nbytes){    CYGARC_HAL_SAVE_GP();#ifdef HAL_ICACHE_FLUSH    HAL_ICACHE_FLUSH( __p , __nbytes );#elif defined(HAL_ICACHE_INVALIDATE)    HAL_ICACHE_INVALIDATE();#endif    CYGARC_HAL_RESTORE_GP();}static voidflush_dcache(void *__p, int __nbytes){    CYGARC_HAL_SAVE_GP();#ifdef HAL_DCACHE_FLUSH    HAL_DCACHE_FLUSH( __p , __nbytes );#elif defined(HAL_DCACHE_INVALIDATE)    HAL_DCACHE_INVALIDATE();#endif    CYGARC_HAL_RESTORE_GP();}#endif#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG)//-----------------------------------------------------------------------------// GDB console output mangler (O-packetizer)// COMMS init function at end.// This gets called via the virtual vector console comms entry and// handles O-packetization. The debug comms entries are used for the// actual device IO.static cyg_uint8cyg_hal_diag_mangler_gdb_getc(void* __ch_data){    cyg_uint8 __ch;    hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS();    CYGARC_HAL_SAVE_GP();    __ch = CYGACC_COMM_IF_GETC(*__chan);    CYGARC_HAL_RESTORE_GP();    return __ch;}static char __mangler_line[100];static int  __mangler_pos = 0;static voidcyg_hal_diag_mangler_gdb_flush(void* __ch_data){    CYG_INTERRUPT_STATE old;    hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS();    // Nothing to do if mangler buffer is empty.    if (__mangler_pos == 0)        return;    // 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.#if defined(CYG_HAL_STARTUP_ROM) \    || !defined(CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION)    HAL_DISABLE_INTERRUPTS(old);#else    CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old);#endif        #if CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES != 0    // Only wait 500ms for data to arrive - avoid "stuck" connections    CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_SET_TIMEOUT, CYGNUM_HAL_DEBUG_GDB_PROTOCOL_TIMEOUT);#endif    while(1)    {	static const char hex[] = "0123456789ABCDEF";	cyg_uint8 csum = 0, c1;	int i;        	CYGACC_COMM_IF_PUTC(*__chan, '$');	CYGACC_COMM_IF_PUTC(*__chan, 'O');	csum += 'O';	for( i = 0; i < __mangler_pos; i++ )        {	    char ch = __mangler_line[i];	    char h = hex[(ch>>4)&0xF];	    char l = hex[ch&0xF];	    CYGACC_COMM_IF_PUTC(*__chan, h);	    CYGACC_COMM_IF_PUTC(*__chan, l);	    csum += h;	    csum += l;	}	CYGACC_COMM_IF_PUTC(*__chan, '#');	CYGACC_COMM_IF_PUTC(*__chan, hex[(csum>>4)&0xF]);	CYGACC_COMM_IF_PUTC(*__chan, hex[csum&0xF]);    nak:#if CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES != 0	if (CYGACC_COMM_IF_GETC_TIMEOUT(*__chan, &c1) == 0) {	    c1 = '-';	    if (tries && (--tries == 0)) c1 = '+';	}#else	c1 = CYGACC_COMM_IF_GETC(*__chan);#endif	if( c1 == '+' ) break;	if( cyg_hal_is_break( &c1 , 1 ) ) {	    // Caller's responsibility to react on this.	    CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(1);	    break;	}	if( c1 != '-' ) goto nak;    }    __mangler_pos = 0;    // And re-enable interrupts#if defined(CYG_HAL_STARTUP_ROM) \    || !defined(CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION)    HAL_RESTORE_INTERRUPTS(old);#else    CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old);#endif}static voidcyg_hal_diag_mangler_gdb_putc(void* __ch_data, cyg_uint8 c){#if CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES != 0    int tries = CYGNUM_HAL_DEBUG_GDB_PROTOCOL_RETRIES;#endif    // No need to send CRs    if( c == '\r' ) return;    CYGARC_HAL_SAVE_GP();    __mangler_line[__mangler_pos++] = c;    if( c == '\n' || __mangler_pos == sizeof(__mangler_line) )	cyg_hal_diag_mangler_gdb_flush(__ch_data);    CYGARC_HAL_RESTORE_GP();}static voidcyg_hal_diag_mangler_gdb_write(void* __ch_data,                               const cyg_uint8* __buf, cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        cyg_hal_diag_mangler_gdb_putc(__ch_data, *__buf++);    CYGARC_HAL_RESTORE_GP();}static voidcyg_hal_diag_mangler_gdb_read(void* __ch_data,                               cyg_uint8* __buf, cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        *__buf++ = cyg_hal_diag_mangler_gdb_getc(__ch_data);    CYGARC_HAL_RESTORE_GP();}static intcyg_hal_diag_mangler_gdb_control(void *__ch_data,                                  __comm_control_cmd_t __func, ...){    CYGARC_HAL_SAVE_GP();    if (__func == __COMMCTL_FLUSH_OUTPUT)	cyg_hal_diag_mangler_gdb_flush(__ch_data);    CYGARC_HAL_RESTORE_GP();    return 0;}// This is the COMMS init function. It gets called both by the stubs// and diag init code to initialize the COMMS mangler channel table -// that's all. The callers have to decide whether to actually use this// channel.voidcyg_hal_diag_mangler_gdb_init(void){    hal_virtual_comm_table_t* comm;    int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);    // Initialize mangler procs    CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_MANGLER);    comm = CYGACC_CALL_IF_CONSOLE_PROCS();    CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_diag_mangler_gdb_write);    CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_diag_mangler_gdb_read);    CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_diag_mangler_gdb_putc);    CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_diag_mangler_gdb_getc);    CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_diag_mangler_gdb_control);        // Restore the original console channel.    CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);}//-----------------------------------------------------------------------------// Null console output mangler// COMMS init function at end.// This gets called via the virtual vector console comms entry and// just forwards IO to the debug comms entries.// This differs from setting the console channel to the same as the// debug channel in that console output will go to the debug channel// even if the debug channel is changed.static cyg_uint8cyg_hal_diag_mangler_null_getc(void* __ch_data){    cyg_uint8 __ch;    hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS();    CYGARC_HAL_SAVE_GP();    __ch = CYGACC_COMM_IF_GETC(*__chan);    CYGARC_HAL_RESTORE_GP();    return __ch;}static voidcyg_hal_diag_mangler_null_putc(void* __ch_data, cyg_uint8 c){    hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS();    CYGARC_HAL_SAVE_GP();    CYGACC_COMM_IF_PUTC(*__chan, c);    CYGARC_HAL_RESTORE_GP();}static voidcyg_hal_diag_mangler_null_write(void* __ch_data,                                const cyg_uint8* __buf, cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        cyg_hal_diag_mangler_null_putc(__ch_data, *__buf++);    CYGARC_HAL_RESTORE_GP();}static voidcyg_hal_diag_mangler_null_read(void* __ch_data,                                cyg_uint8* __buf, cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        *__buf++ = cyg_hal_diag_mangler_null_getc(__ch_data);    CYGARC_HAL_RESTORE_GP();

⌨️ 快捷键说明

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