s_pri.c
来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 568 行 · 第 1/2 页
C
568 行
DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base); p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); *(volatile byte*)(p) = _MP_RISC_RESET | _MP_LED1 | _MP_LED2; diva_os_wait (50) ; /* Verify modules */ for (dsp_row = 0; dsp_row < 4; dsp_row++) { row_state = (byte)((ret >> (dsp_row*7)) & 0x7F); if (row_state && (row_state != 0x7F)) { for (dsp_index = 0; dsp_index < 7; dsp_index++) { if (!(row_state & (1 << dsp_index))) { DBG_ERR (("A: MODULE[%d]-DSP[%d] failed", dsp_row+1, dsp_index+1)) } } } } if (!(ret & 0x10000000)) { DBG_ERR (("A: ON BOARD-DSP[1] failed")) } if (!(ret & 0x20000000)) { DBG_ERR (("A: ON BOARD-DSP[2] failed")) } /* Print module population now */ DBG_LOG(("+-----------------------+")) DBG_LOG(("| DSP MODULE POPULATION |")) DBG_LOG(("+-----------------------+")) DBG_LOG(("| 1 | 2 | 3 | 4 |")) DBG_LOG(("+-----------------------+")) DBG_LOG(("| %s | %s | %s | %s |", ((ret >> (0*7)) & 0x7F) ? "Y" : "N", ((ret >> (1*7)) & 0x7F) ? "Y" : "N", ((ret >> (2*7)) & 0x7F) ? "Y" : "N", ((ret >> (3*7)) & 0x7F) ? "Y" : "N")) DBG_LOG(("+-----------------------+")) DBG_LOG(("DSP's(present-absent):%08x-%08x", ret, ~ret & 0x3fffffff)) *(volatile byte*)(p) = 0 ; DIVA_OS_MEM_DETACH_RESET(IoAdapter, p); diva_os_wait (50) ; IoAdapter->InitialDspInfo |= DspCount << 16 ; return (ret);}/* ------------------------------------------------------------------------- helper used to download dsp code toi PRI Card ------------------------------------------------------------------------- */static long pri_download_buffer (OsFileHandle *fp, long length, void **addr) { PISDN_ADAPTER IoAdapter = (PISDN_ADAPTER)fp->sysLoadDesc ; dword *sharedRam ; byte *p; *addr = (void *)IoAdapter->downloadAddr ; if ( ((dword) length) > IoAdapter->DspCodeBaseAddr + IoAdapter->MaxDspCodeSize - IoAdapter->downloadAddr ) { DBG_FTL(("%s: out of card memory during DSP download (0x%X)", IoAdapter->Properties.Name, IoAdapter->downloadAddr + length)) return (-1) ; } p = DIVA_OS_MEM_ATTACH_RAM(IoAdapter); sharedRam = (dword *)(&p[DOWNLOAD_ADDR(IoAdapter)]); if ( fp->sysFileRead (fp, sharedRam, length) != length ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); return (-1) ; } IoAdapter->downloadAddr += length ; IoAdapter->downloadAddr = (IoAdapter->downloadAddr + 3) & (~3) ; DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); return (0) ;}/* ------------------------------------------------------------------------- Download DSP code to PRI Card ------------------------------------------------------------------------- */static dword pri_telindus_load (PISDN_ADAPTER IoAdapter) { char *error ; OsFileHandle *fp ; t_dsp_portable_desc download_table[DSP_MAX_DOWNLOAD_COUNT] ; word download_count ; dword *sharedRam ; dword FileLength ; byte *p; if ( !(fp = OsOpenFile (DSP_TELINDUS_FILE)) ) return (0) ; IoAdapter->downloadAddr = (IoAdapter->DspCodeBaseAddr + sizeof(dword) + sizeof(download_table) + 3) & (~3) ; FileLength = fp->sysFileSize ; fp->sysLoadDesc = (void *)IoAdapter ; fp->sysCardLoad = pri_download_buffer ; download_count = DSP_MAX_DOWNLOAD_COUNT ; memset (&download_table[0], '\0', sizeof(download_table)) ;/* * set start address for download (use autoincrement mode !) */ error = dsp_read_file (fp, (word)(IoAdapter->cardType), &download_count, NULL, &download_table[0]) ; if ( error ) { DBG_FTL(("download file error: %s", error)) OsCloseFile (fp) ; return (0) ; } OsCloseFile (fp) ;/* * store # of separate download files extracted from archive */ IoAdapter->downloadAddr = IoAdapter->DspCodeBaseAddr ; p = DIVA_OS_MEM_ATTACH_RAM(IoAdapter); sharedRam = (dword *)(&p[DOWNLOAD_ADDR(IoAdapter)]); WRITE_DWORD(&(sharedRam[0]), (dword)download_count); memcpy (&sharedRam[1], &download_table[0], sizeof(download_table)) ; DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); return (FileLength) ;}/* ------------------------------------------------------------------------- Download PRI Card ------------------------------------------------------------------------- */#define MIN_DSPS 0x30000000static int load_pri_hardware (PISDN_ADAPTER IoAdapter) { dword i ; struct mp_load *boot = (struct mp_load *)DIVA_OS_MEM_ATTACH_RAM(IoAdapter); if ( IoAdapter->Properties.Card != CARD_MAEP ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); return (0) ; } boot->err = 0 ;#if 0 IoAdapter->rstFnc (IoAdapter) ;#else if ( MIN_DSPS != (MIN_DSPS & diva_pri_detect_dsps(IoAdapter)) ) { /* makes reset */ DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); DBG_FTL(("%s: DSP error!", IoAdapter->Properties.Name)) return (0) ; }#endif/* * check if CPU is alive */ diva_os_wait (10) ; i = boot->live ; diva_os_wait (10) ; if ( i == boot->live ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); DBG_FTL(("%s: CPU is not alive!", IoAdapter->Properties.Name)) return (0) ; } if ( boot->err ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); DBG_FTL(("%s: Board Selftest failed!", IoAdapter->Properties.Name)) return (0) ; }/* * download protocol and dsp files */ if ( !xdiSetProtocol (IoAdapter, IoAdapter->ProtocolSuffix) ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); return (0) ; } if ( !pri_protocol_load (IoAdapter) ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); return (0) ; } if ( !pri_telindus_load (IoAdapter) ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); return (0) ; }/* * copy configuration parameters */ IoAdapter->ram += MP_SHARED_RAM_OFFSET ; memset (boot + MP_SHARED_RAM_OFFSET, '\0', 256) ; diva_configure_protocol (IoAdapter);/* * start adapter */ boot->addr = MP_UNCACHED_ADDR (MP_PROTOCOL_OFFSET) ; boot->cmd = 3 ;/* * wait for signature in shared memory (max. 3 seconds) */ for ( i = 0 ; i < 300 ; ++i ) { diva_os_wait (10) ; if ( (boot->signature >> 16) == 0x4447 ) { DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); DBG_TRC(("Protocol startup time %d.%02d seconds", (i / 100), (i % 100) )) return (1) ; } } DIVA_OS_MEM_DETACH_RAM(IoAdapter, boot); DBG_FTL(("%s: Adapter selftest failed (0x%04X)!", IoAdapter->Properties.Name, boot->signature >> 16)) pri_cpu_trapped (IoAdapter) ; return (0) ;}#else /* } { */static int load_pri_hardware (PISDN_ADAPTER IoAdapter) { return (0);}#endif /* } *//* -------------------------------------------------------------------------- PRI Adapter interrupt Service Routine -------------------------------------------------------------------------- */static int pri_ISR (struct _ISDN_ADAPTER* IoAdapter) { byte *cfg = DIVA_OS_MEM_ATTACH_CFG(IoAdapter); if ( !((READ_DWORD((dword *)cfg)) & 0x80000000) ) { DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfg); return (0) ; } /* clear interrupt line */ WRITE_DWORD(((dword *)cfg), (dword)~0x03E00000) ; DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfg); IoAdapter->IrqCount++ ; if ( IoAdapter->Initialized ) { diva_os_schedule_soft_isr (&IoAdapter->isr_soft_isr); } return (1) ;}/* ------------------------------------------------------------------------- Disable interrupt in the card hardware ------------------------------------------------------------------------- */static void disable_pri_interrupt (PISDN_ADAPTER IoAdapter) { dword volatile *cfgReg = (dword volatile *)DIVA_OS_MEM_ATTACH_CFG(IoAdapter) ; cfgReg[3] = 0x00000000 ; cfgReg[1] = 0x00000000 ; WRITE_DWORD(&cfgReg[0], (dword)(~0x03E00000)) ; DIVA_OS_MEM_DETACH_CFG(IoAdapter, cfgReg);}/* ------------------------------------------------------------------------- Install entry points for PRI Adapter ------------------------------------------------------------------------- */static void prepare_common_pri_functions (PISDN_ADAPTER IoAdapter) { ADAPTER *a = &IoAdapter->a ; a->ram_in = mem_in ; a->ram_inw = mem_inw ; a->ram_in_buffer = mem_in_buffer ; a->ram_look_ahead = mem_look_ahead ; a->ram_out = mem_out ; a->ram_outw = mem_outw ; a->ram_out_buffer = mem_out_buffer ; a->ram_inc = mem_inc ; a->ram_offset = pri_ram_offset ; a->ram_out_dw = mem_out_dw; a->ram_in_dw = mem_in_dw; a->istream_wakeup = pr_stream; IoAdapter->out = pr_out ; IoAdapter->dpc = pr_dpc ; IoAdapter->tst_irq = scom_test_int ; IoAdapter->clr_irq = scom_clear_int ; IoAdapter->pcm = (struct pc_maint *)(MIPS_MAINT_OFFS - MP_SHARED_RAM_OFFSET) ; IoAdapter->load = load_pri_hardware ; IoAdapter->disIrq = disable_pri_interrupt ; IoAdapter->rstFnc = reset_pri_hardware ; IoAdapter->stop = stop_pri_hardware ; IoAdapter->trapFnc = pri_cpu_trapped ; IoAdapter->diva_isr_handler = pri_ISR;}/* ------------------------------------------------------------------------- Install entry points for PRI Adapter ------------------------------------------------------------------------- */void prepare_pri_functions (PISDN_ADAPTER IoAdapter) { IoAdapter->MemorySize = MP_MEMORY_SIZE ; prepare_common_pri_functions (IoAdapter) ; diva_os_prepare_pri_functions (IoAdapter);}/* ------------------------------------------------------------------------- Install entry points for PRI Rev.2 Adapter ------------------------------------------------------------------------- */void prepare_pri2_functions (PISDN_ADAPTER IoAdapter) { IoAdapter->MemorySize = MP2_MEMORY_SIZE ; prepare_common_pri_functions (IoAdapter) ; diva_os_prepare_pri2_functions (IoAdapter);}/* ------------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?