📄 hc_comm.c
字号:
#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 + -