USB模式下枚举功能实现设置
0赞
发表于 2012/8/13 23:05:18
阅读(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); }