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

📄 usb_init.c

📁 USB 软件配置的具体工程
💻 C
字号:
#include	"HA_typedef.h"
#include	"hardware.h"
#include	"hardware_reg.h"
#include "Gfd_usb_irq.h"

#define	write_success	0x80000000
#define   read_success	0x40000000

/*USB 中断类型*/
#define	irq_none		0x00
#define	irq_setup		0x80
#define	irq_in			0x40
#define	irq_out			0x20
#define	irq_ping			0x10
#define	irq_error		0x08
#define	irq_ack			0x04
#define	irq_stat_ov		0x02
#define	irq_ctrl_err		0x01

extern struct USBDevice *pMSDevice; 
extern ER usb_RMW_reg(U32 reg, U32 val);

//****************************************************************************************************************
//函数定义
//****************************************************************************************************************

ER usb_write_reg(U32 reg, U32 val)
{
	U32 temp;
	U8  i = 0;
	*(RP)reg = val;
	temp = *(RP)reg;
	while((!((temp &= write_success) == write_success))&&((++i) < 100))
	{ temp = *(RP)reg; }
	return(0);	
}

ER  usb_read_reg(U32 reg)
{
	U32 temp,t;
	U8 i = 0;
	*(RP)USB_READFLAG = 0x1;
	temp = *(RP)reg;
	do
	{ temp = *(RP)reg;
	  t = temp; }
	while((!(temp &= read_success)) && ((++i)< 100));
	t &= 0x0fffffff;
	return t;
}

U32 usb_write_read_reg(U32 reg, U32 val)
{
	U32 data;
	usb_write_reg(reg, val);
	data = usb_read_reg(reg);
	
	return data;
}


U8 usb_chang_reg32_to_reg8(U32 reg)
{
	U8 reg8;
	reg8 = (U8)(usb_read_reg(reg));
	return reg8;
}


U16 usb_change_reg32_to_reg16(U32 reg)
{
	U16 reg16;
	reg16 = (U16)(usb_read_reg(reg));
	return reg16;
}


U8 usb_get_regbit15_to_8(U32 reg)
{
	U8 reg8;
	reg8 = (U8)(usb_read_reg(reg)>>8);
	return reg8;
}

ER usb_RMW_reg(U32 reg, U32 val)
{
	U32 tmp;
	
	*(RP)USB_APPLOCK = 0X01; 
	tmp = usb_read_reg(reg);			
	tmp |= val;					
	usb_write_reg(reg,tmp);			
	*(RP)USB_APPLOCK = 0X00;
	
	return 0;
}

ER usb_RMW_clrreg(U32 reg, U32 val)
{
	U32 tmp;
	
	*(RP)USB_APPLOCK = 0X01; 
	tmp = usb_read_reg(reg);			
	tmp &= val;					
	usb_write_reg(reg,tmp);			
	*(RP)USB_APPLOCK = 0X00;
	
	return 0;
}

ER usb_lock_readreg(U32 reg)
{
	U32 tmp;
	
	*(RP)USB_APPLOCK = 0X01; 
	tmp = usb_read_reg(reg);			
	*(RP)USB_APPLOCK = 0X00;
	
	return tmp;
}

int init_usb()
{
	usb_RMW_reg((U32)USB_EP0OUTSTAT, 0x02);
	usb_RMW_reg((U32)USB_EP1OUTSTAT, 0x02);
	usb_RMW_reg((U32)USB_EP1INSTAT, 0x02);
	usb_RMW_reg((U32)USB_EP2OUTSTAT, 0x02);
	usb_RMW_reg((U32)USB_EP2INSTAT, 0x02);
	usb_write_reg((U32)USB_INTR,0);
	usb_write_reg((U32)USB_INTRMASK, 0x172);

///	usb_write_reg((U32)USB_INTRMASK, int_mask);
	usb_write_reg((U32)USB_EP0OUTMAXPKTSIZE, 0x8);
	usb_write_reg((U32)USB_EP1OUTMAXPKTSIZE, 0x40);
	usb_write_reg((U32)USB_EP1INMAXPKTSIZRE, 0x40);
	usb_write_reg((U32)USB_EP2OUTMAXPKTSIZE, 0x40);
	usb_write_reg((U32)USB_EP2INMAXPKTSIZE, 0x40);
	
	usb_write_reg((U32)USB_EP1OUTBMATTR, 0x02);
	usb_write_reg((U32)USB_EP2INBMATTR, 0x02);
	usb_write_reg((U32)USB_BMATTRIBUTES, 0xe0);
//	usb_write_reg((U32)USB_BMATTRIBUTES, 0xf0);

	*(RP)USB_RECEIVETYPE = 0X1;

 	 /*初始化全局结构变量*/ 
//	pMSDevice->dUSBTrans.bulkindatebuf = (U32 *)( 0x400);/* malloc for buffer */  
	pMSDevice->dUSBTrans.bulkindatebuf =  (U32 *)malloc(8*1024);/* malloc for buffer */
	if (!pMSDevice->dUSBTrans.bulkindatebuf) 
		while(1);
	pMSDevice->dUSBStat.epstate = EPCL;
	pMSDevice->dUSBStat.setconstate = NSETCONFIG;
	pMSDevice->dUSBStat.usbdmapp = NAPP;
	pMSDevice->dUSBStat.usbstate = USBDEF;//USBDEF说明设备第一次连接到PC上,还未进行配置
	pMSDevice->dUSBTrans.desc_len = 1;
	pMSDevice->dUSBTrans.head_temp = (U32*)0;
	pMSDevice->dUSBTrans.longpk = SHORTPK;
	pMSDevice->dUSBTrans.longurb = 0;
	pMSDevice->dUSBTrans.usbmod = 0;

	pMSDevice->dCtrlTrans.statempty = NEMPTY;

	pMSDevice->dBulkStat.blkstate = BLKCMD;
	pMSDevice->dBulkStat.descactu_len = 0;
	pMSDevice->dBulkStat.unsinglepocket = UNSINGLE;

	pMSDevice->dCBW.requlen =0;
	pMSDevice->dCSW.sing = UNSI;
	pMSDevice->dCSW.tlengh = 13; 

	
	irq_enable(INT_DMA);
	unmask_irq(INT_DMA);
	irq_enable(INT_USB);
	unmask_irq(INT_USB);
	
	return 0;

}

⌨️ 快捷键说明

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