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 + -
显示快捷键?