This commit is contained in:
zhugengyu
2022-09-21 11:30:07 +08:00
committed by sakumisu
parent e2a4fb11d8
commit 590ffc8847
5 changed files with 150 additions and 6 deletions

View File

@@ -333,13 +333,35 @@ static void usbh_print_hubport_info(struct usbh_hubport *hport)
} }
} }
#ifdef CONFIG_USBHOST_XHCI
static int usbh_get_default_mps(int speed)
{
switch (speed) {
case USB_SPEED_LOW:
return 8;
case USB_SPEED_FULL:
case USB_SPEED_HIGH:
return 64;
case USB_SPEED_SUPER:
default:
return 512;
}
}
#endif
int usbh_hport_activate_ep0(struct usbh_hubport *hport) int usbh_hport_activate_ep0(struct usbh_hubport *hport)
{ {
struct usbh_endpoint_cfg ep0_cfg = { 0 }; struct usbh_endpoint_cfg ep0_cfg = { 0 };
ep0_cfg.ep_addr = 0x00; ep0_cfg.ep_addr = 0x00;
ep0_cfg.ep_interval = 0x00; ep0_cfg.ep_interval = 0x00;
#ifdef CONFIG_USBHOST_XHCI
ep0_cfg.ep_mps = usbh_get_default_mps(hport->speed);
#else
ep0_cfg.ep_mps = 0x08; ep0_cfg.ep_mps = 0x08;
#endif
ep0_cfg.ep_type = USB_ENDPOINT_TYPE_CONTROL; ep0_cfg.ep_type = USB_ENDPOINT_TYPE_CONTROL;
ep0_cfg.hport = hport; ep0_cfg.hport = hport;

View File

@@ -43,11 +43,11 @@ static int USBCmdEntry(int argc, char *argv[])
} }
else if (!strcmp(argv[1], "disk")) else if (!strcmp(argv[1], "disk"))
{ {
ret = FFreeRTOSWriteReadUsbDisk();
} }
else if (!strcmp(argv[1], "hid")) else if (!strcmp(argv[1], "hid"))
{ {
ret = FFreeRTOSRecvHidInput();
} }
return ret; return ret;

View File

@@ -34,6 +34,8 @@
#include "ft_debug.h" #include "ft_debug.h"
#include "usbh_core.h" #include "usbh_core.h"
#include "usbh_hid.h"
#include "usbh_msc.h"
#include "fmemory_pool.h" #include "fmemory_pool.h"
/************************** Constant Definitions *****************************/ /************************** Constant Definitions *****************************/
@@ -129,6 +131,91 @@ static void UsbInitTask(void * args)
vTaskDelete(NULL); vTaskDelete(NULL);
} }
static void UsbMscTask(void * args)
{
int ret;
struct usbh_msc *msc_class;
static uint8_t partition_table[512] = {0};
while (TRUE)
{
msc_class = (struct usbh_msc *)usbh_find_class_instance("/dev/sda");
if (msc_class == NULL)
{
USB_LOG_RAW("do not find /dev/sda\r\n");
goto err_exit;
}
/* get the partition table */
ret = usbh_msc_scsi_read10(msc_class, 0, partition_table, 1);
if (ret < 0)
{
USB_LOG_RAW("scsi_read10 error,ret:%d\r\n", ret);
goto err_exit;
}
for (uint32_t i = 0; i < 512; i++)
{
if (i % 16 == 0)
{
USB_LOG_RAW("\r\n");
}
USB_LOG_RAW("%02x ", partition_table[i]);
}
USB_LOG_RAW("\r\n");
/* write partition table */
for (uint32_t i = 0; i < 512; i++)
{
partition_table[i] ^= 0xfffff;
}
ret = usbh_msc_scsi_write10(msc_class, 0, partition_table, 1);
if (ret < 0)
{
USB_LOG_RAW("scsi_write10 error,ret:%d\r\n", ret);
goto err_exit;
}
vTaskDelay(10);
}
err_exit:
vTaskDelete(NULL);
}
static void UsbHidTask(void * args)
{
int ret;
struct usbh_hid *hid_class;
static uint8_t hid_buffer[128] = {0};
while (TRUE)
{
hid_class = (struct usbh_hid *)usbh_find_class_instance("/dev/input0");
if (hid_class == NULL)
{
USB_LOG_RAW("do not find /dev/input0\r\n");
goto err_exit;
}
ret = usbh_int_transfer(hid_class->intin, hid_buffer, 8, 1000);
if (ret < 0)
{
USB_LOG_RAW("intr in error,ret:%d\r\n", ret);
goto err_exit;
}
USB_LOG_RAW("recv len:%d, key:[0x%x, 0x%x, 0x%x, 0x%x]\r\n",
ret,
hid_buffer[0], hid_buffer[1], hid_buffer[2], hid_buffer[3]);
vTaskDelay(10);
}
err_exit:
vTaskDelete(NULL);
}
BaseType_t FFreeRTOSInitUsb(void) BaseType_t FFreeRTOSInitUsb(void)
{ {
BaseType_t ret = pdPASS; BaseType_t ret = pdPASS;
@@ -146,4 +233,42 @@ BaseType_t FFreeRTOSInitUsb(void)
taskEXIT_CRITICAL(); /* allow schedule since task created */ taskEXIT_CRITICAL(); /* allow schedule since task created */
return ret; return ret;
}
BaseType_t FFreeRTOSWriteReadUsbDisk(void)
{
BaseType_t ret = pdPASS;
taskENTER_CRITICAL(); /* no schedule when create task */
ret = xTaskCreate((TaskFunction_t )UsbMscTask,
(const char* )"UsbMscTask",
(uint16_t )2048,
NULL,
(UBaseType_t )configMAX_PRIORITIES - 1,
NULL);
FASSERT_MSG(pdPASS == ret, "create task failed");
taskEXIT_CRITICAL(); /* allow schedule since task created */
return ret;
}
BaseType_t FFreeRTOSRecvHidInput(void)
{
BaseType_t ret = pdPASS;
taskENTER_CRITICAL(); /* no schedule when create task */
ret = xTaskCreate((TaskFunction_t )UsbHidTask,
(const char* )"UsbHidTask",
(uint16_t )2048,
NULL,
(UBaseType_t )configMAX_PRIORITIES - 1,
NULL);
FASSERT_MSG(pdPASS == ret, "create task failed");
taskEXIT_CRITICAL(); /* allow schedule since task created */
return ret;
} }

View File

@@ -69,7 +69,7 @@
#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
#endif #endif
#define CONFIG_USBHOST_GET_STRING_DESC // #define CONFIG_USBHOST_GET_STRING_DESC
// #define CONFIG_USBDEV_MSC_THREAD // #define CONFIG_USBDEV_MSC_THREAD

View File

@@ -463,9 +463,6 @@ enum TRBCCode {
#define XHCI_RING(_trb) \ #define XHCI_RING(_trb) \
((struct xhci_ring*)((unsigned long)(_trb) & ~(XHCI_RING_SIZE-1))) ((struct xhci_ring*)((unsigned long)(_trb) & ~(XHCI_RING_SIZE-1)))
#define XHCI_GET_FIELD(data, field) \
(((data) >> field##_SHIFT) & field##_MASK)
#define BARRIER() __asm__ __volatile__("": : :"memory") #define BARRIER() __asm__ __volatile__("": : :"memory")
#ifdef XHCI_AARCH64 #ifdef XHCI_AARCH64