小磷光一

USB模式下枚举功能实现设置

0
阅读(2020)

 

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);
}