USB模式下枚举功能实现设置
0赞
发表于 8/13/2012 11:05:18 PM
阅读(3196)
struct device_request {
unsigned char bmRequestType;
unsigned char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
};
struct dev_descriptor device_descriptor = {
sizeof(struct dev_descriptor),
DEVICE_DESCRIPTOR,
0x0200,
0x00,
0x00,
0x00,
0x40,
0x0470,//vid
0x0666,//pid
0x0100,//v
0x00,
0x00,
0x00,
0x01,
};
struct dev_qualifier_descriptor device_qualifier_descriptor = {
sizeof(struct dev_qualifier_descriptor),
0x06,//Device Qualifier Type
0x0110,
0x00,
0x00,
0x00,
0x40,
0x01,
0x00,
};
struct configuration_descriptor config_descriptor = {
0x09,
CONFIGURATION_DESCRIPTOR,
0x09+0x9*NUM_INTERFACE+0x07*NUM_ENDPOINT*NUM_INTERFACE,
NUM_INTERFACE,
0x01,
0x00,
0xa0,
0xfa,
{
0x09,
INTERFACE_DESCRIPTOR,
0x00,
0x00,
NUM_ENDPOINT,
0x08,//MSD DEVICE
0x06,//SCSI CMD SET
0x50,//BULK-ONLY protocol
0x00,
// {
0x07,
ENDPOINT_DESCRIPTOR,
0x82,//out endpoint
0x02,
0x0040,
0x00,
// }
// {
0x07,
ENDPOINT_DESCRIPTOR,
0x01,//in endpoint
0x02,
0x0040,
0x00,
// }
},
};
static void dc_disconnect(struct isp1362 *isp1362)
{
int tmp = 0;
tmp = isp1362_read_reg16(isp1362, DC_RD_MODE);
tmp &= ~0x01;
isp1362_write_reg16(isp1362, DC_WR_MODE, tmp);
}
static void dc_set_clk_run(struct isp1362 *isp1362)
{
int tmp = 0;
tmp = isp1362_read_reg16(isp1362, DC_RD_HW_CFG);
tmp |= 0x1002;//config interrupt,falling edge
isp1362_write_reg16(isp1362, DC_WR_HW_CFG, tmp);
}
static void dc_set_endpoint(struct isp1362 *isp1362, int epcfg, int epindex)
{
isp1362_write_reg16(isp1362, epcfg, epindex);
}
static int dc_read_ep_status(struct isp1362 *isp1362, int epindex)
{
return isp1362_read_reg16(isp1362, DC_RD_EP_STAT|epindex);
}
static int dc_read_ep_status_img(struct isp1362 *isp1362, int epindex)
{
return isp1362_read_reg16(isp1362, DC_RD_EP_STAT_IMG|epindex);
}
static void dc_stall_ep(struct isp1362 *isp1362, int epindex)
{
if ( (epindex < 0x0) && (epindex > 0xf) )
return;
isp1362_write_addr(isp1362, DC_STALL_EP|epindex);
}
static void dc_unstall_ep(struct isp1362 *isp1362, int epindex)
{
if ( (epindex < 0x0) && (epindex > 0xf) )
return;
isp1362_write_addr(isp1362, DC_UNSTALL_EP|epindex);
}
static void dc_validate_ep_buf(struct isp1362 *isp1362, int epindex)
{
if ( (epindex < 0x1) && (epindex > 0xf) )
return;
isp1362_write_addr(isp1362, DC_VOLIDATE_EP|epindex);
}
static void dc_clear_ep_buf(struct isp1362 *isp1362, int epindex)
{
if ( (epindex < 0x0) && (epindex > 0xf) )
return;
if (epindex == 0x1)
return;
isp1362_write_addr(isp1362, DC_CLEAR_EP|epindex);
}
static void dc_ack_setup(struct isp1362 *isp1362)
{
isp1362_write_addr(isp1362, DC_ACK_SETUP);
}
static int dc_read_intt_status(struct isp1362 *isp1362)
{
return isp1362_read_reg16(isp1362, DC_RD_INTT_REG);
}
static void dc_device_reset(struct isp1362 *isp1362)
{
isp1362_write_addr(isp1362, DC_RESET_DEVICE);
}
static int dc_read_ep(struct isp1362 *isp1362, char *buf, int len, int epindex)
{
int i = 0;
int j = 0;
int ep = 0;
short *ptr = (short *)buf;
if (epindex != 0)
ep = epindex + 1;
isp1362_write_addr(isp1362, DC_RD_EP_BUF|ep);
j = isp1362_read_data16(isp1362);
if (j > len)
j = len;
len = (j+1)/2;
for (i=0; iset_address(dev->controler, addr);
}
void get_dev_descriptor(struct usb_dev *dev)
{
}
/*****************************************************************
HC
*****************************************************************/
#define HC_CHIP_ID 0x3630
//HC CMD define
static void hc_reset(struct isp1362 *isp1362)
{
isp1362_write_addr(isp1362, HC_WR_SW_RST_REG);
}
static void hc_set_istl_buff_size(struct isp1362 *isp1362, int size)
{
isp1362_write_reg16(isp1362, HC_WR_ISTL_BUF_SZ_REG, size);
}
static void hc_set_intl_buff_size(struct isp1362 *isp1362, int size)
{
isp1362_write_reg16(isp1362, HC_WR_INTL_BUF_SZ_REG, size);
}
static void hc_set_atl_buff_size(struct isp1362 *isp1362, int size)
{
isp1362_write_reg16(isp1362, HC_WR_ATL_BUF_SZ_REG, size);
}
static void hc_set_intl_blk_size(struct isp1362 *isp1362, int size)
{
isp1362_write_reg16(isp1362, HC_WR_INTL_BLK_SZ_REG, size);
}
static void hc_set_atl_blk_size(struct isp1362 *isp1362, int size)
{
isp1362_write_reg16(isp1362, HC_WR_ATL_BLK_SZ_REG, size);
}
