CubeMX stm32 FreeRTOS + USB-хост MSC для флэш-памяти USB - PullRequest
0 голосов
/ 06 сентября 2018

Используя CubeMX, TrueStudio, STM32F767ZI и HAL, я занимаюсь разработкой программного обеспечения для доступа к флэш-накопителю USB через FatFS через хост-порт USB. На плате есть разъем USB хоста и устройства, подключенный к MCU. В CubeMX я настроил FreeRTOS, USB Host MSC и FatFS. Это работает, я вижу эти различные состояния при подключении и отключении флэш-накопителя:

--- Plugging in USB flash drive ---
HOST_USER_CONNECTION
HOST_USER_CONNECTION
HOST_DEV_ATTACHED
phost->device.speed: 1
HOST_ENUMERATION
HOST_SET_CONFIGURATION
HOST_SET_WAKEUP_FEATURE
HOST_CHECK_CLASS
USBH_MSC_InterfaceInit
HOST_CLASS_REQUEST
USBH_MSC_ClassRequest
HOST_CLASS
USBH_MSC_Process
processId: 3, Appli_state 1
USBH_MSC_GetLUNInfo
info.capacity.block_nbr : 623395
info.capacity.block_size: 512
capacity                : 3116 MB
HOST_USER_CLASS_ACTIVE
FATFS_LinkDriver Failed
USBDISKPath:
processId: 2, Appli_state 2
USBH_MSC_GetLUNInfo
info.capacity.block_nbr : 62333951
info.capacity.block_size: 512
capacity                : 31166 MB
--- Unplugging USB flash drive ---
HOST_USER_DISCONNECTION
HOST_DEV_DISCONNECTED
USBH_MSC_InterfaceDeInit
processId: 5, Appli_state 3
USBH_MSC_GetLUNInfo
info.capacity.block_nbr : 62333951
info.capacity.block_size: 512
capacity                : 31166 MB

Итак, после MX_USB_HOST_Init (); было вызвано в freertos.c все вышеперечисленное произошло. FATFS_LinkDriver () вызывается из MX_FATFS_Init (). Но функции в usbh_diskio.c не вызываются, поэтому что-то там пошло не так.

Куски кода, на которые я смотрю, таковы:

freertos.c, где вызывается MX_USB_HOST_Init (), после этого регистрируется MSC.

/* StartDefaultTask function */
void StartDefaultTask(void const * argument)
{
  /* init code for FATFS */
  MX_FATFS_Init();

  /* init code for LWIP */
  MX_LWIP_Init();

  /* init code for USB_HOST */
  MX_USB_HOST_Init();

  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* init code for LIBJPEG */
  MX_LIBJPEG_Init();

  /* USER CODE BEGIN StartDefaultTask */

  MSC_LUNTypeDef info;
  uint8_t lun = 0;
  uint16_t val = 0;

  /* Infinite loop */
  for(;;)
  {
      /* USB Host Background task */
//      USBH_Process(&hUsbHostFS);

    val++;
    if (val >= 1000)
    {
        if (processIdOld != processId)
        {
            printf("processId: %d, Appli_state %d\n", processId, Appli_state);
            processIdOld = processId;
              USBH_MSC_GetLUNInfo(&hUSB_Host, lun, &info);
              uint32_t cap = info.capacity.block_nbr / 2000;
              printf("info.capacity.block_nbr : %ld\n", info.capacity.block_nbr);
              printf("info.capacity.block_size: %d\n", info.capacity.block_size);
              printf("capacity                : %d MB\n", cap);
        }
//      printf("1");
//      fflush(stdout);
//      HAL_GPIO_TogglePin(PIO10_LED_RS_ERR_GPIO_Port, PIO10_LED_RS_ERR_Pin);
        val = 0;
    }
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

usb_host.c, где инициализируется USB, и я вижу, что USBH_UserProcess вызывается, когда я подключаю / отключаю USB-накопитель.

void MX_USB_HOST_Init(void)
{
  /* USER CODE BEGIN USB_HOST_Init_PreTreatment */

  /* USER CODE END USB_HOST_Init_PreTreatment */

  /* Init host Library, add supported class and start the library. */
  USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS);

  USBH_RegisterClass(&hUsbHostFS, USBH_AUDIO_CLASS);

  USBH_RegisterClass(&hUsbHostFS, USBH_CDC_CLASS);

  USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS);

  USBH_RegisterClass(&hUsbHostFS, USBH_HID_CLASS);

  USBH_RegisterClass(&hUsbHostFS, USBH_MTP_CLASS);

  USBH_Start(&hUsbHostFS);

  /* USER CODE BEGIN USB_HOST_Init_PostTreatment */

  /* USER CODE END USB_HOST_Init_PostTreatment */
}

/*
 * user callback definition
 */
static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)
{
  /* USER CODE BEGIN CALL_BACK_1 */
  switch(id)
  {
  case HOST_USER_SELECT_CONFIGURATION:
      printf("HOST_USER_SELECT_CONFIGURATION\n");
      break;

  case HOST_USER_DISCONNECTION:
      printf("HOST_USER_DISCONNECTION\n");
      Appli_state = APPLICATION_DISCONNECT;
      break;

  case HOST_USER_CLASS_ACTIVE:
      printf("HOST_USER_CLASS_ACTIVE\n");
      Appli_state = APPLICATION_READY;
      break;

  case HOST_USER_CONNECTION:
      printf("HOST_USER_CONNECTION\n");
      Appli_state = APPLICATION_START;
      break;

  default:
      break;
  }
  /* USER CODE END CALL_BACK_1 */
}

Приведенная выше часть работает нормально, софар. Кроме связывания драйвера usbh. Кто-нибудь использовал это или знает хорошие рабочие примеры?

...