Ejemplo n.º 1
0
void usb_set_device(struct usb_device* dev, int force) {
    device = dev;
    if(force) {
        UDADDR = dev->addr & 0x7f;
        UDADDR |= 1 << ADDEN;
    } else {
        usb_set_addr(dev->addr);
    }
}
Ejemplo n.º 2
0
Archivo: usb.c Proyecto: Zuph/mchck
static void
usb_handle_control_done(void *data, ssize_t len, void *cbdata)
{
	if (usb.state == USBD_STATE_SETTING_ADDRESS) {
		usb.state = USBD_STATE_ADDRESS;
		usb_set_addr(usb.address);
	}
	usb_setup_control();
}
Ejemplo n.º 3
0
void usb_rx_setup(const uint8_t *buf, const unsigned len)
{
  const uint8_t  req_type  = buf[0];
  const uint8_t  req       = buf[1];
  const uint16_t req_val   = buf[2] | (buf[3] << 8);
  const uint16_t req_index = buf[4] | (buf[5] << 8);
  const uint16_t req_count = buf[6] | (buf[7] << 8);

  //printf("ep0 setup type %02x req %02x val %04x index %04x count %04x\r\n",
  //    req_type, req, req_val, req_index, req_count);
  if (req_type == 0x80 && req == 0x06) // get descriptor
  {
    const void *p_desc = NULL;
    uint16_t desc_len = 0;
    if (req_val == 0x0100) // get device descriptor
    {
      p_desc = &g_usb_device_desc;
      desc_len = sizeof(g_usb_device_desc);
    }
    else if (req_val == 0x0200) // get configuration descriptor
    {
      p_desc = &g_usb_config_desc;
      desc_len = sizeof(g_usb_config_desc);
    }
    else if (req_val == 0x0300) // get string language list
    {
      p_desc = &g_usb_lang_list_desc;
      desc_len = sizeof(g_usb_lang_list_desc);
    }
    else if (req_val == 0x0302) // get product string
    {
      p_desc = g_metal_usb_setup_pkt_buf;
      desc_len = usb_stuff_desc_string(g_metal_usb_product_str);
    }
    else if (req_val == 0x0301) // get vendor string
    {
      p_desc = g_metal_usb_setup_pkt_buf;
      desc_len = usb_stuff_desc_string(g_metal_usb_vendor_str);
    }
    ////////////////////
    if (p_desc)
    {
      int tx_len = desc_len < req_count ? desc_len : req_count;
      usb_tx(0, p_desc, tx_len);
    }
    else
    {
      printf("TRAP!!! unknown descriptor request: 0x%04x\r\n", req_val);
      while(1) { } // IT'S A TRAP
    }
  }
  else if (req_type == 0x00 && req == 0x05) // set address
    usb_set_addr((uint8_t)req_val);
  else if (req_type == 0x00 && req == 0x09) // set configuration
  {
    // todo: call into mac-specific function to set up endpoints, etc.
    usb_tx(0, NULL, 0);
  }
  else
  {
    printf("unknown setup rx: req_type = 0x%02x, req = 0x%02x\r\n",
        req_type, req);
    printf("trapping...\r\n");
    while(1) { } // IT'S A TRAP
  }
}