s_pri.c

来自「Linux Kernel 2.6.9 for OMAP1710」· 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 + -
显示快捷键?