📄 usb_init.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 + -