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

📄 init.c

📁 usb host在ARM7上的实现
💻 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();
	/* ZLG Mass Storage Class 初始化函数 */
	ini_mass_device_LUN_mem();
	ini_mass_device_mem();
	
	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 + -