This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

how to get data from pc by usb ep0

SDK ver:15.2.0

demo:usbd

i want to use the 52840 usb function ,the pc is the host ,the 52840 is device。

i cant use respond_setup_data to send data to pc。

but how to get data from pc?

source:

static void usbd_event_handler(nrf_drv_usbd_evt_t const * const p_event)
{
    switch (p_event->type)
    {
   ......
    case NRF_DRV_USBD_EVT_SETUP:
    {
        nrf_drv_usbd_setup_t setup;
        nrf_drv_usbd_setup_get(&setup);
        switch (setup.bmRequest)
        {
       ......

        case 0xFE: // send data to pc
            send_data_to_pc(&setup);    // useful
            break;

        case 0xFF: // get data from pc
            get_data_from_pc(&setup);    //unusefu
            break;

        default:
            NRF_LOG_ERROR("Unknown request: 0x%2x", setup.bmRequest);
            nrf_drv_usbd_setup_stall();
            return;
        }
        break;
    }
    default:
        break;
    }
}

static void  send_data_to_pc(nrf_drv_usbd_setup_t const * const p_setup)
{
    respond_setup_data(
        p_setup,
        get_descriptor_report_interface_0,
        p_setup->wLength);
}

static void  get_data_from_pc(nrf_drv_usbd_setup_t const * const p_setup)
{
      respond_get_data(
        p_setup,
        get_data,
        p_setup->wLength);
}

static void respond_setup_data(
    nrf_drv_usbd_setup_t const * const p_setup,
    void const * p_data, size_t size)
{
    /* Check the size against required response size */
    if (size > p_setup->wLength)
    {
        size = p_setup->wLength;
    }
    ret_code_t ret;
    nrf_drv_usbd_transfer_t transfer =
    {
        .p_data = {.tx = p_data},
        .size = size
    };
    ret = nrf_drv_usbd_ep_transfer(NRF_DRV_USBD_EPIN0, &transfer);
    if (ret != NRF_SUCCESS)
    {
        NRF_LOG_ERROR("Transfer starting failed: %d", (uint32_t)ret);
    }
    ASSERT(ret == NRF_SUCCESS);
    UNUSED_VARIABLE(ret);
}

static void respond_get_data(
    nrf_drv_usbd_setup_t const * const p_setup,
    void  * data, size_t size)
{
    /* Check the size against required response size */
    if (size > p_setup->wLength)
    {
        size = p_setup->wLength;
    }
    ret_code_t ret;
    nrf_drv_usbd_transfer_t transfer =
    {
        .p_data = {.rx = data},
        .size = size,
    };
    ret = nrf_drv_usbd_ep_transfer(NRF_DRV_USBD_EPOUT0, &transfer);
    if (ret != NRF_SUCCESS)
    {
        NRF_LOG_ERROR("Transfer starting failed: %d", (uint32_t)ret);
    }
    ASSERT(ret == NRF_SUCCESS);
    UNUSED_VARIABLE(ret);
}

pc usb drive is good ,i can use it to communicate with other evaluation boards.

in 52840DK ,send data to pc is ok, failed to get data from pc .

how to get data from pc by usb ep0?

thanks.

Parents Reply Children
No Data
Related