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

📄 hc_comm.c

📁 Dsp控制1362芯片做主机
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Hc_comm.h"
#include  "int.h"
#include   "hc_struct.h"
#include <stdio.h>

#define			REVISION_ID_ES1					0x21
#define			REVISION_ID_ES2					0x22
#define			REVISION_ID_ES3					0x23
#define			REVISION_ID_ES4					0x30
#define			NO_VERSION_DISPLAY				5

#define         False                            0
#define         True                             1

#define SOFITLInt 0x0001

#define MIE 0x80000000
#define POWER_ON_TO_POWER_GOOD_TIME 50

unsigned short HcRhPortStatusComm[2]	=	{ 
												Com32_HcRhPortStatus1,
												Com32_HcRhPortStatus2
											};
unsigned int activePortNumber=2;//做host只有一个端口插外设
unsigned char cnt;
unsigned short abuf[8];
PTD_header_param PTD_first;

/* ********** ********** ********** ********** ********** ********** **********
	IO port access functions.
   ********** ********** ********** ********** ********** ********** ********** */

unsigned long read_register32( unsigned short register_address )
{
	unsigned long		tmp;
	unsigned short tmp_l,tmp_h;
	usb_01=register_address ;
	tmp_l		 = usb_00;
	asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
	tmp_h		 = usb_00;
    tmp=tmp_h;
    tmp=tmp<<16;
    tmp=tmp+tmp_l;
	return ( tmp );
}


void write_register32( unsigned short register_address, unsigned long value )
{
    unsigned short tmp_l,tmp_h;
    tmp_l=value&0x0000ffff;
    tmp_h=(value&0xffff0000)>>16;
	register_address	|= 0x80;
	usb_01= register_address ;	
	usb_00= tmp_l;
	asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
	usb_00= tmp_h;
}


unsigned short read_register16( unsigned short register_address )
{
	unsigned short	tmp;
	usb_01=register_address ;
	tmp	= usb_00;
	return ( tmp );
}


void write_register16( unsigned short register_address, unsigned short value )
{
	register_address	|= 0x80;
	usb_01=register_address ;
	usb_00= value            ;
}


void erase_all( void )
{
	unsigned short	i,reg;

	write_register32( Com32_HcDirectAddressLength, 4096L << 16 | 0 );
	
	reg=( Com16_HcDirectAddressData | 0x80) ;
	usb_01=reg;
	
	for ( i = 0; i < 4096; i++ )
		usb_00=0 ;
}


void memory_test( void )
{
	unsigned char	a[ 256 ];
	unsigned short	i;

	write_register32( Com32_HcDirectAddressLength, 4096L << 16 | 0 );
	
	usb_01=(Com16_HcDirectAddressData | 0x80 );
	
	for ( i = 0; i < 4096; i++ )
		usb_00=i ;
	
	write_register16( Com16_HcTransferCounter, 256 );
	read_register_burst_char( Com16_HcISTL0BufferPort, a, 256 );
}

/* ********** ********** ********** ********** ********** ********** **********
	 wake/suspend
   ********** ********** ********** ********** ********** ********** ********** */
void Hd_wake()
{
    usb_wake=0x0000;
    usb_wake=0x0000;
}

void Hd_suspend()
{
    
    usb_wake=0x0003;
    usb_wake=0x0003;
}

/*void Dev_wake()
{
    unsigned short uValue;
    uValue=usb_wake;
    uValue=uValue&0xfffe;
    usb_wake=uValue;
    usb_wake=uValue;
}

void Dev_suspend()
{
    unsigned short uValue;
    uValue=usb_wake;
    uValue=uValue|0x0001;
    usb_wake=uValue;
    usb_wake=uValue;
}*/
/* ********** ********** ********** ********** ********** ********** **********
	 interrupt control
   ********** ********** ********** ********** ********** ********** ********** */
void dspInt_enable()
{
   unsigned int *intMaskPtr=0;
   *intMaskPtr=(*intMaskPtr)|0x0007;
}

void dspInt_disable()
{
   unsigned int *intMaskPtr=0;
   *intMaskPtr=(*intMaskPtr)|0xfff8;
}

unsigned short hc_disable()
{
   unsigned short tmp,i;
   tmp=read_register16( Com16_HcHardwareConfiguration);
   i=read_register16(Com16_HcuPInterrupt);  
   write_register16(Com16_HcuPInterrupt, 0xFFFF);
   write_register16( Com16_HcHardwareConfiguration,tmp&0xfffe);  
   return(i);
}

void hc_enable(unsigned short mregValue)
{
   unsigned short tmp;
   tmp=read_register16( Com16_HcHardwareConfiguration);
   write_register16(Com16_HcuPInterrupt, mregValue);
   write_register16( Com16_HcHardwareConfiguration,tmp|0x0001);  
}


void read_register_burst_char( unsigned short register_address, unsigned char *data, unsigned short length  )
{
	unsigned short	tmp;
	unsigned short	i;
	unsigned short	odd;
	unsigned short  regValue=0;
	odd		= length & 0x0001;
	if ( odd )
		length	&= ~0x1;
	regValue=hc_disable();		
	usb_01= register_address ;
	
	for ( i = 0; i < length; i += 2 )
	{
		tmp		= usb_00;
		
		*(data + i + 1)		= tmp >> 8;
		*(data + i + 0)		= tmp & 0x00FF;
	}
	
	
	if ( odd )
	{
		tmp		= usb_00;
		
		*(data + i + 0)		= tmp & 0x00FF;
	}
	hc_enable(regValue);
}


void write_register_burst_char( unsigned short register_address, unsigned char *data, unsigned short length  )
{
	unsigned short	tmp;
	unsigned short	i;
    unsigned short  regValue=0;
    
	register_address	|= 0x80;
	usb_01=register_address ;
    regValue=hc_disable();
	for ( i = 0; i < length; i += 2 )
	{
		tmp		= (*(data + i + 1) << 8) | *(data + i);		/*  swap bytes  */
		usb_00= tmp ;		
	}
	hc_enable(regValue);
}


void read_register_burst_int( unsigned short register_address, unsigned char *data, unsigned short length  )
{
	unsigned short		i;
	unsigned short     regValue=0;
	
	usb_01=register_address ;
    regValue=hc_disable();
	for ( i = 0; i < length; i++ )
		*data++		= usb_00;
	hc_enable(regValue);
}


void write_register_burst_int( unsigned short register_address, unsigned short *data, unsigned short length  )
{
	unsigned short		i=0;
    unsigned short      regValue=0;
    
	register_address	|= 0x80;
	usb_01=register_address ;
    regValue=hc_disable();
	for ( i = 0; i < length; i++ )
		usb_00=*data++ ;
	hc_enable(regValue);
}

void read_direct_access( unsigned short address, unsigned char *data, unsigned short length )	//	RAM access, read
{
	write_register32( Com32_HcDirectAddressLength, (unsigned long)length << 16 | address & 0x7FFF );
	read_register_burst_char( Com16_HcDirectAddressData, data, length );
}


void write_direct_access( unsigned short address, unsigned char *data, unsigned short length )	//	RAM access, write
{
	write_register32( Com32_HcDirectAddressLength, (unsigned long)length << 16 | address & 0x7FFF );
	write_register_burst_char( Com16_HcDirectAddressData, data, length );
}

/* ********** ********** ********** ********** ********** ********** **********
	ATL access functions.
   ********** ********** ********** ********** ********** ********** ********** */
void read_atl(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
     cnt=0;
    usb_01=Com16_HcATLBufferPort;
    regValue=hc_disable();
    do
   {
    *(a_ptr+cnt)=usb_00;
    cnt++;
    }
    while(cnt<(data_size));
    hc_enable(regValue);
}

void write_atl(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
    cnt=0;
    usb_01=(Com16_HcATLBufferPort|0x80);
    regValue=hc_disable();
    do
   {
     usb_00=*(a_ptr+cnt);
     cnt++;
   }
    while(cnt<(data_size));
    hc_enable(regValue);
}

/* ********** ********** ********** ********** ********** ********** **********
	ISTL access functions.
   ********** ********** ********** ********** ********** ********** ********** */
void read_istl0(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
     cnt=0;
    usb_01=Com16_HcISTL0BufferPort;
    regValue=hc_disable();
    do
   {
    *(a_ptr+cnt)=usb_00;
    cnt++;
    }
    while(cnt<(data_size));
    hc_enable(regValue);
}

void write_istl0(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
    cnt=0;
    usb_01=(Com16_HcISTL0BufferPort|0x80);
    regValue=hc_disable();
    do
   {
     usb_00=*(a_ptr+cnt);
     cnt++;
   }
    while(cnt<(data_size));
    hc_enable(regValue);
}

void read_istl1(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
     cnt=0;
    usb_01=Com16_HcISTL1BufferPort;
    regValue=hc_disable();
    do
   {
    *(a_ptr+cnt)=usb_00;
    cnt++;
    }
    while(cnt<(data_size));
    hc_enable(regValue);
}

void write_istl1(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
    cnt=0;
    usb_01=(Com16_HcISTL1BufferPort|0x80);
    regValue=hc_disable();
    do
   {
     usb_00=*(a_ptr+cnt);
     cnt++;
   }
    while(cnt<(data_size));
    hc_enable(regValue);
}

/* ********** ********** ********** ********** ********** ********** **********
	INTL access functions.
   ********** ********** ********** ********** ********** ********** ********** */
void read_intl(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
     cnt=0;
    usb_01=Com16_HcINTLBufferPort;
    regValue=hc_disable();
    do
   {
    *(a_ptr+cnt)=usb_00;
    cnt++;
    }
    while(cnt<(data_size));
    hc_enable(regValue);
}

void write_intl(unsigned short *a_ptr, unsigned char data_size)
{
    unsigned short regValue=0;
    write_register16(Com16_HcTransferCounter,data_size*2);
    cnt=0;
    usb_01=(Com16_HcINTLBufferPort|0x80);
    regValue=hc_disable();
    do
   {
     usb_00=*(a_ptr+cnt);
     cnt++;
   }
    while(cnt<(data_size));
    hc_enable(regValue);
}

//----------------------------------------------------------------------
//---------- Usb Initialize Function ----------------
unsigned char detect_1362_connected( unsigned short *chip_id_ptr )	//	Check 1362 register access
{
	unsigned short		tmp;
	unsigned char       g_chip_version_index ;
	//
	//		check ChipID. ChipID value should be 0x36XX
	//
	
	*chip_id_ptr		= read_register16( Com16_HcChipID );
	
	if ( (*chip_id_ptr & 0xFF00) == 0x3600 )
	{
		if ( (*chip_id_ptr & 0x00FF)		== REVISION_ID_ES1 )
			g_chip_version_index	= 1;
			
		else if ( (*chip_id_ptr & 0x00FF)	== REVISION_ID_ES2 )
			g_chip_version_index	= 2;
			
		else if ( (*chip_id_ptr & 0x00FF)	== REVISION_ID_ES3 )
			g_chip_version_index	= 3;
			
		else if ( (*chip_id_ptr & 0x00FF)	== REVISION_ID_ES4 )
			g_chip_version_index	= 4;
			
		else
			g_chip_version_index	= 0;
	}
	else
	{
		return ( False );
	}
	
	//return(True);
	//
	//		write-read test using scratch register
	//

	tmp		= 0x55AA;				//	pattern of "0101 1010"	
	write_register16( Com16_HcScratch, tmp );
	if ( tmp != read_register16( Com16_HcScratch ) )
	   return(False);	
	tmp		= ~tmp;					//	check again with inverted pattern
	write_register16( Com16_HcScratch, tmp );
	if ( tmp != read_register16( Com16_HcScratch ) )
		return ( False );
	//
	//		chip exists!
	//
	return ( True );
}

/*

unsigned char detect_1362_connected( unsigned short *chip_id_ptr )	//	Check 1362 register access
{
	unsigned short		tmp;
	unsigned char       g_chip_version_index ;
	//
	//		check ChipID. ChipID value should be 0x36XX
	//
	
	*chip_id_ptr		= read_register16( Com16_HcChipID );
	
	if ( (*chip_id_ptr & 0xFF00) == 0x3600 )
	{
		if ( (*chip_id_ptr & 0x00FF)		== REVISION_ID_ES1 )
			g_chip_version_index	= 1;
			
		else if ( (*chip_id_ptr & 0x00FF)	== REVISION_ID_ES2 )
			g_chip_version_index	= 2;
			
		else if ( (*chip_id_ptr & 0x00FF)	== REVISION_ID_ES3 )
			g_chip_version_index	= 3;
			
		else if ( (*chip_id_ptr & 0x00FF)	== REVISION_ID_ES4 )
			g_chip_version_index	= 4;
			
		else

⌨️ 快捷键说明

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