📄 init.c
字号:
/****************************************************************************/
/* includes */
/****************************************************************************/
#include "HostStack.h"
/****************************************************************************/
/* function prototypes */
/****************************************************************************/
void software_reset( void );
int check1161_connected( void );
void set_register_values( void );
/****************************************************************************/
/* function definitions */
/****************************************************************************/
//**************************************************************************
// 函数名称:USB_Host_Stack_Initialize
// 输入参数:无
// 输出参数:无
// 功能描述:HC主机驱动初始化
//***************************************************************************
void USB_Host_Stack_Initialize( void )
{
#ifdef CLASS_DRIVE
class_driver_registration();
#endif
device_list_linitialize();
ini_endpoint_info();
ini_device_instance();
atl_initialize();
OS_rhsc_event = OSSemCreate(1); // 创建中断使用的信号量
// Hardware related initializations
software_reset();
/* 1、检测主控器 */
while(check1161_connected()==0); // 如果没有检测到ISP1160就终止程序运行
set_register_values(); // 初始化的2-10步在该函数处理
}
//**************************************************************************
// 函数名称:software_reset
// 输入参数:无
// 输出参数:无
// 功能描述:ISP1160/ISP1161软件复位
//***************************************************************************
void software_reset( void )
{
write_register16( Com16_HcSoftwareReset, 0x00F6 );
}
//******************************************************************************************
// 函数名称:check1161_connected
// 输入函数:无
// 输出函数:chip_id,芯片ID号;返回0,设备不存在。
// 功能描述:ISP1160主控器检测
//******************************************************************************************
int check1161_connected( void )
{
unsigned short chip_id;
unsigned short tmp;
chip_id = read_register16( Com16_HcChipID );
if ( (chip_id & 0xFF00) != 0x6100 )// check ChipID. ChipID value should be 0x6110
return ( 0 );
tmp = 0x55AA;
write_register16( Com16_HcScratch, tmp );
if ( tmp != read_register16( Com16_HcScratch ) )
return ( 0 );
tmp = ~tmp;
write_register16( Com16_HcScratch, tmp );
if ( tmp != read_register16( Com16_HcScratch ) )
return ( 0 );
return ( chip_id );
}
//**************************************************************************
// 函数名称:set_register_values
// 输入参数:无
// 输出参数:无
// 功能描述:初始化ISP1160/ISP1161寄存器值
//***************************************************************************
void set_register_values( void )
{
unsigned int uValue;
/* 2、软件复位主控器 */
// Read the contents of the HcCommandStatus register.
uValue = read_register32(Com32_HcCommandStatus);
uValue |= 0x00000001; // Set the HCR bit
write_register32(Com32_HcCommandStatus, uValue);
while (read_register32(Com32_HcCommandStatus) & 0x00000001);// Wait until reset is done. When reset is done, the HCR bit is set to logic 0.
write_register32( Com32_HcControl, 0 );// put host controller into USB_RESET state
// 设置远程唤醒使能及连接
/* 3、配置Com16_HcHardwareConfiguration寄存器 */
write_register16( Com16_HcHardwareConfiguration, InitVal_HcHardwareConfiguration);//set hardware configurations
/* 4、配置中断 */
write_register32( Com32_HcInterruptDisable, InitVal_HcInterruptDisable );//disable and clear host controller interrupts
write_register32( Com32_HcInterruptStatus, InitVal_HcHcInterruptStatus );
write_register32( Com32_HcInterruptEnable, InitVal_HcInterruptEnable ); // 使能主机中断
write_register16( Com16_HcuPInterruptEnable, InitVal_HcuPInterruptEnable ); // 使能主机微控器中断
/* 5、配置HcControl寄存器, */
uValue = read_register32(Com32_HcControl);
write_register32( Com32_HcControl, uValue|0x600 );//设置远程唤醒使能及连接。
/* 6、配置HcFmInterval寄存器 */
write_register32( Com32_HcFmInterval, InitVal_HcFmInterval);
/* 7、配置根集线器 */
//set root hub registers
write_register32( Com32_HcRhDescriptorA, InitVal_HcRhDescriptorA );
write_register32( Com32_HcRhDescriptorB, InitVal_HcRhDescriptorB );
write_register32( Com32_HcRhStatus, InitVal_HcRhStatus );
// write_register32( Com32_HcRhPortStatus1, InitVal_HcRhPortStatus1 );
// write_register32( Com32_HcRhPortStatus2, InitVal_HcRhPortStatus2 );
/*8、设置ITL及ATL缓冲长度*/
write_register16( Com16_HcITLBufferLength, InitVal_HcITLBufferLength );
write_register16( Com16_HcATLBufferLength, InitVal_HcATLBufferLength );
/* 9、使能全局INT1中断 */
g_isr_flag = 0x0000; // 全局中断标志位
uValue = read_register16( Com16_HcHardwareConfiguration );
write_register16( Com16_HcHardwareConfiguration, ( uValue | 0x0001 ) );
/* 10、设置主控器为操作状态 */
uValue = read_register32(Com32_HcControl);
write_register32( Com32_HcControl, uValue|0x80 );//enter to USB_OPERATIONAL state
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -