s_4bri.c
来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 1,008 行 · 第 1/3 页
C
1,008 行
for ( bit = 8 ; bit-- > 0 ; val <<= 1 ) /* put byte onto FPGA */ { baseval &= ~FPGA_DOUT ; /* clr data bit */ baseval |= (val & FPGA_DOUT) ; /* copy data bit */ WRITE_WORD(addr, baseval) ; WRITE_WORD(addr, baseval | FPGA_CCLK) ; /* set CCLK hi */ WRITE_WORD(addr, baseval | FPGA_CCLK) ; /* set CCLK hi */ WRITE_WORD(addr, baseval) ; /* set CCLK lo */ } } xdiFreeFile (File) ; diva_os_wait (100) ; val = READ_WORD(addr) ; DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr); if ( !(val & FPGA_BUSY) ) { DBG_FTL(("FPGA download: chip remains in busy state (0x%04x)", val)) return (0) ; } return (1) ;}#if !defined(DIVA_USER_MODE_CARD_CONFIG) /* { *//* -------------------------------------------------------------------------- Download protocol code to the adapter -------------------------------------------------------------------------- */static int qBri_protocol_load (PISDN_ADAPTER BaseIoAdapter, PISDN_ADAPTER IoAdapter) { PISDN_ADAPTER HighIoAdapter; byte *p; dword FileLength ; dword *sharedRam, *File; dword Addr, ProtOffset, SharedRamOffset, i; dword tasks = BaseIoAdapter->tasks ; int factor = (tasks == 1) ? 1 : 2; if (!(File = (dword *)xdiLoadArchive (IoAdapter, &FileLength, 0))) { return (0) ; } IoAdapter->features = diva_get_protocol_file_features ((byte*)File, OFFS_PROTOCOL_ID_STRING, IoAdapter->ProtocolIdString, sizeof(IoAdapter->ProtocolIdString)) ; IoAdapter->a.protocol_capabilities = IoAdapter->features ; DBG_LOG(("Loading %s", IoAdapter->ProtocolIdString)) ProtOffset = IoAdapter->ControllerNumber * (IoAdapter->MemorySize >> factor); SharedRamOffset = (IoAdapter->MemorySize >> factor) - MQ_SHARED_RAM_SIZE; Addr = ((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR])) | (((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR + 1])) << 8) | (((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR + 2])) << 16) | (((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR + 3])) << 24) ; if ( Addr != 0 ) { IoAdapter->DspCodeBaseAddr = (Addr + 3) & (~3) ; IoAdapter->MaxDspCodeSize = (MQ_UNCACHED_ADDR (ProtOffset + SharedRamOffset) - IoAdapter->DspCodeBaseAddr) & ((IoAdapter->MemorySize >> factor) - 1); i = 0 ; while ( BaseIoAdapter->QuadroList->QuadroAdapter[i]->ControllerNumber != tasks - 1 ) i++ ; HighIoAdapter = BaseIoAdapter->QuadroList->QuadroAdapter[i] ; Addr = HighIoAdapter->DspCodeBaseAddr ; if (tasks == 1) { ((byte *) File)[OFFS_DIVA_INIT_TASK_COUNT] =(byte)1; ((byte *) File)[OFFS_DIVA_INIT_TASK_COUNT+1] = (byte)BaseIoAdapter->cardType; } ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR] = (byte) Addr ; ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR + 1] = (byte)(Addr >> 8) ; ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR + 2] = (byte)(Addr >> 16) ; ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR + 3] = (byte)(Addr >> 24) ; IoAdapter->InitialDspInfo = 0x80 ; } else { if ( IoAdapter->features & PROTCAP_VOIP ) { IoAdapter->DspCodeBaseAddr = MQ_CACHED_ADDR (ProtOffset + SharedRamOffset - MQ_VOIP_MAX_DSP_CODE_SIZE) ; IoAdapter->MaxDspCodeSize = MQ_VOIP_MAX_DSP_CODE_SIZE ; } else if ( IoAdapter->features & PROTCAP_V90D ) { IoAdapter->DspCodeBaseAddr = MQ_CACHED_ADDR (ProtOffset + SharedRamOffset - MQ_V90D_MAX_DSP_CODE_SIZE) ; IoAdapter->MaxDspCodeSize = (IoAdapter->ControllerNumber == tasks - 1) ? MQ_V90D_MAX_DSP_CODE_SIZE : 0 ; } else { IoAdapter->DspCodeBaseAddr = MQ_CACHED_ADDR (ProtOffset + SharedRamOffset - MQ_ORG_MAX_DSP_CODE_SIZE) ; IoAdapter->MaxDspCodeSize = (IoAdapter->ControllerNumber == tasks - 1) ? MQ_ORG_MAX_DSP_CODE_SIZE : 0 ; } IoAdapter->InitialDspInfo = (MQ_CACHED_ADDR (ProtOffset + SharedRamOffset - MQ_ORG_MAX_DSP_CODE_SIZE) - IoAdapter->DspCodeBaseAddr) >> 14 ; } DBG_LOG(("%d: DSP code base 0x%08lx, max size 0x%08lx (%08lx,%02x)", IoAdapter->ControllerNumber, IoAdapter->DspCodeBaseAddr, IoAdapter->MaxDspCodeSize, Addr, IoAdapter->InitialDspInfo)) if (FileLength > ((IoAdapter->DspCodeBaseAddr - MQ_CACHED_ADDR (ProtOffset)) & (IoAdapter->MemorySize - 1)) ) { xdiFreeFile (File) ; DBG_FTL(("Protocol code '%s' too long (%ld)", &IoAdapter->Protocol[0], FileLength)) return (0) ; } IoAdapter->downloadAddr = 0 ; p = DIVA_OS_MEM_ATTACH_RAM(IoAdapter); sharedRam = (dword *)&p[IoAdapter->downloadAddr & (IoAdapter->MemorySize - 1)]; memcpy (sharedRam, File, FileLength) ; DBG_TRC(("Download addr 0x%08x len %ld - virtual 0x%08x", IoAdapter->downloadAddr, FileLength, sharedRam)) if ( memcmp (sharedRam, File, FileLength) ) { DBG_FTL(("%s: Memory test failed!", IoAdapter->Properties.Name)) DBG_FTL(("File=0x%x, sharedRam=0x%x", File, sharedRam)) DBG_BLK(( (char *)File, 256)) DBG_BLK(( (char *)sharedRam, 256)) DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); xdiFreeFile (File) ; return (0) ; } DIVA_OS_MEM_DETACH_RAM(IoAdapter, p); xdiFreeFile (File) ; return (1) ;}/* -------------------------------------------------------------------------- DSP Code download -------------------------------------------------------------------------- */static long qBri_download_buffer (OsFileHandle *fp, long length, void **addr) { PISDN_ADAPTER BaseIoAdapter = (PISDN_ADAPTER)fp->sysLoadDesc ; PISDN_ADAPTER IoAdapter; word i ; dword *sharedRam ; byte *p; i = 0 ; do { IoAdapter = BaseIoAdapter->QuadroList->QuadroAdapter[i++] ; } while ( (i < BaseIoAdapter->tasks) && (((dword) length) > IoAdapter->DspCodeBaseAddr + IoAdapter->MaxDspCodeSize - IoAdapter->downloadAddr) ); *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(BaseIoAdapter); sharedRam = (dword*)&p[IoAdapter->downloadAddr & (IoAdapter->MemorySize - 1)]; if ( fp->sysFileRead (fp, sharedRam, length) != length ) { DIVA_OS_MEM_DETACH_RAM(BaseIoAdapter, p); return (-1) ; } DIVA_OS_MEM_DETACH_RAM(BaseIoAdapter, p); IoAdapter->downloadAddr += length ; IoAdapter->downloadAddr = (IoAdapter->downloadAddr + 3) & (~3) ; return (0) ;}/******************************************************************************/static dword qBri_telindus_load (PISDN_ADAPTER BaseIoAdapter) { PISDN_ADAPTER IoAdapter = 0; PISDN_ADAPTER HighIoAdapter = NULL ; char *error ; OsFileHandle *fp ; t_dsp_portable_desc download_table[DSP_MAX_DOWNLOAD_COUNT] ; word download_count, i ; dword *sharedRam ; dword FileLength ; byte *p; if ( !(fp = OsOpenFile (DSP_TELINDUS_FILE)) ) { DBG_FTL(("qBri_telindus_load: %s not found!", DSP_TELINDUS_FILE)) return (0) ; } for ( i = 0 ; i < BaseIoAdapter->tasks ; ++i ) { IoAdapter = BaseIoAdapter->QuadroList->QuadroAdapter[i] ; IoAdapter->downloadAddr = IoAdapter->DspCodeBaseAddr ; if ( IoAdapter->ControllerNumber == BaseIoAdapter->tasks - 1 ) { HighIoAdapter = IoAdapter ; HighIoAdapter->downloadAddr = (HighIoAdapter->downloadAddr + sizeof(dword) + sizeof(download_table) + 3) & (~3) ; } } FileLength = fp->sysFileSize ; fp->sysLoadDesc = (void *)BaseIoAdapter ; fp->sysCardLoad = qBri_download_buffer ; download_count = DSP_MAX_DOWNLOAD_COUNT ; memset (&download_table[0], '\0', sizeof(download_table)) ;/* * set start address for download */ 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 download files extracted from the archive and download table */ HighIoAdapter->downloadAddr = HighIoAdapter->DspCodeBaseAddr ; p = DIVA_OS_MEM_ATTACH_RAM(BaseIoAdapter); sharedRam = (dword *)&p[HighIoAdapter->downloadAddr & (IoAdapter->MemorySize - 1)]; WRITE_DWORD(&(sharedRam[0]), (dword)download_count); memcpy (&sharedRam[1], &download_table[0], sizeof(download_table)) ; /* memory check */ if ( memcmp (&sharedRam[1], &download_table, download_count) ) { DBG_FTL(("%s: Dsp Memory test failed!", IoAdapter->Properties.Name)) } DIVA_OS_MEM_DETACH_RAM(BaseIoAdapter, p); return (FileLength) ;}/* Load SDP tasks to the card Return start address of image on succesful load Return zero in case of problem INPUT: task -> name of the image containing this task link_addr -> pointer to start of previous task */static byte* qBri_sdp_load (PISDN_ADAPTER BaseIoAdapter, char* task, byte* link_addr) { OsFileHandle *fp; dword FileLength; byte tmp[sizeof(dword)]; dword gp_addr; dword entry_addr; dword start_addr = 0; dword phys_start_addr; dword end_addr; byte* sharedRam = 0; byte *p; if (task) { if (!(fp = OsOpenFile (task))) { DBG_ERR(("Can't open [%s] image", task)) return (0); } if ((FileLength = fp->sysFileSize) < DIVA_MIPS_TASK_IMAGE_ID_STRING_OFFS) { OsCloseFile (fp) ; DBG_ERR(("Image [%s] too short", task)) return (0); } fp->sysFileSeek (fp, DIVA_MIPS_TASK_IMAGE_GP_OFFS, OS_SEEK_SET); if (fp->sysFileRead (fp, tmp, sizeof(dword)) != sizeof(dword)) { OsCloseFile (fp) ; DBG_ERR(("Can't read image [%s]", task)) return (0); } gp_addr = ((dword)tmp[0]) | (((dword)tmp[1]) << 8) | (((dword)tmp[2]) << 16) | (((dword)tmp[3]) << 24); DBG_TRC(("Image [%s] GP = %08lx", task, gp_addr)) fp->sysFileSeek (fp, DIVA_MIPS_TASK_IMAGE_ENTRY_OFFS, OS_SEEK_SET); if (fp->sysFileRead (fp, tmp, sizeof(dword)) != sizeof(dword)) { OsCloseFile (fp) ; DBG_ERR(("Can't read image [%s]", task)) return (0); } entry_addr = ((dword)tmp[0]) | (((dword)tmp[1]) << 8) | (((dword)tmp[2]) << 16) | (((dword)tmp[3]) << 24); DBG_TRC(("Image [%s] entry = %08lx", task, entry_addr)) fp->sysFileSeek (fp, DIVA_MIPS_TASK_IMAGE_LOAD_ADDR_OFFS, OS_SEEK_SET); if (fp->sysFileRead (fp, tmp, sizeof(dword)) != sizeof(dword)) { OsCloseFile (fp) ; DBG_ERR(("Can't read image [%s]", task)) return (0); } start_addr = ((dword)tmp[0]) | (((dword)tmp[1]) << 8) | (((dword)tmp[2]) << 16) | (((dword)tmp[3]) << 24); DBG_TRC(("Image [%s] start = %08lx", task, start_addr)) fp->sysFileSeek (fp, DIVA_MIPS_TASK_IMAGE_END_ADDR_OFFS, OS_SEEK_SET); if (fp->sysFileRead (fp, tmp, sizeof(dword)) != sizeof(dword)) { OsCloseFile (fp) ; DBG_ERR(("Can't read image [%s]", task)) return (0); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?