diff --git a/firmware/hw_layer/mass_storage/usb_msd_cfg.c b/firmware/hw_layer/mass_storage/usb_msd_cfg.c deleted file mode 100644 index f6bd88cf11..0000000000 --- a/firmware/hw_layer/mass_storage/usb_msd_cfg.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "hal.h" - -#if HAL_USE_USB_MSD - -#include "hal_usb_msd.h" -#include "usb_msd_cfg.h" - -/* - * must be 64 for full speed and 512 for high speed - */ -#define USB_MSD_EP_SIZE 64U - -/* - * USB Device Descriptor. - */ -static const uint8_t msd_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0200, /* bcdUSB (2.0). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5742, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor msd_device_descriptor = { - sizeof msd_device_descriptor_data, - msd_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t msd_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(0x0020, /* wTotalLength. */ - 0x01, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 0x32), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x08, /* bInterfaceClass (Mass Storage) */ - 0x06, /* bInterfaceSubClass (SCSI - Transparent storage class) */ - 0x50, /* bInterfaceProtocol (Bulk Only) */ - 0), /* iInterface. (none) */ - /* Mass Storage Data In Endpoint Descriptor.*/ - USB_DESC_ENDPOINT (USB_MSD_DATA_EP | 0x80, - 0x02, /* bmAttributes (Bulk). */ - USB_MSD_EP_SIZE, /* wMaxPacketSize. */ - 0x00), /* bInterval. 1ms */ - /* Mass Storage Data Out Endpoint Descriptor.*/ - USB_DESC_ENDPOINT (USB_MSD_DATA_EP, - 0x02, /* bmAttributes (Bulk). */ - USB_MSD_EP_SIZE, /* wMaxPacketSize. */ - 0x00) /* bInterval. 1ms */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor msd_configuration_descriptor = { - sizeof msd_configuration_descriptor_data, - msd_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t msd_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t msd_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t msd_string2[] = { - USB_DESC_BYTE(62), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0, ' ', 0, - 'S', 0, 't', 0, 'o', 0, 'r', 0, 'a', 0, 'g', 0, 'e', 0, ' ', 0, - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0 -}; - -static const uint8_t msd_string3[] = { - USB_DESC_BYTE(26), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'A', 0, 'E', 0, 'C', 0, 'C', 0, 'E', 0, 'C', 0, 'C', 0, 'C', 0, 'C', 0, - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor msd_strings[] = { - {sizeof msd_string0, msd_string0}, - {sizeof msd_string1, msd_string1}, - {sizeof msd_string2, msd_string2}, - {sizeof msd_string3, msd_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &msd_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &msd_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &msd_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - NULL, - NULL, - USB_MSD_EP_SIZE, - USB_MSD_EP_SIZE, - &ep1instate, - &ep1outstate, - 4, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromISR(); - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); - chSysUnlockFromISR(); - return; - case USB_EVENT_UNCONFIGURED: - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -const USBConfig msdusbcfg = { - usb_event, - get_descriptor, - msd_request_hook, - NULL -}; - -#endif /* HAL_USE_USB_MSD */ diff --git a/firmware/hw_layer/mass_storage/usb_msd_cfg.h b/firmware/hw_layer/mass_storage/usb_msd_cfg.h deleted file mode 100644 index 2904c0e2c0..0000000000 --- a/firmware/hw_layer/mass_storage/usb_msd_cfg.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef USB_MSD_CFG_H_ -#define USB_MSD_CFG_H_ - - -#define USBD1_DATA_REQUEST_EP 1 -#define USBD1_DATA_AVAILABLE_EP 1 -#define USBD1_INTERRUPT_REQUEST_EP 2 - - -#endif /* USB_MSD_CFG_H_ */ diff --git a/firmware/hw_layer/mmc_card.cpp b/firmware/hw_layer/mmc_card.cpp index b6fe6aebdb..923af208cf 100644 --- a/firmware/hw_layer/mmc_card.cpp +++ b/firmware/hw_layer/mmc_card.cpp @@ -24,8 +24,8 @@ #include "hardware.h" #include "engine_configuration.h" #include "status_loop.h" -#include "usb_msd_cfg.h" #include "buffered_writer.h" +#include "null_device.h" #include "rtc_helper.h" @@ -337,8 +337,21 @@ static void mmcUnMount(void) { } #if HAL_USE_USB_MSD -#define RAMDISK_BLOCK_SIZE 512U -static uint8_t blkbuf[RAMDISK_BLOCK_SIZE]; +static uint8_t blkbuf[MMCSD_BLOCK_SIZE]; + +static const scsi_inquiry_response_t scsi_inquiry_response = { + 0x00, /* direct access block device */ + 0x80, /* removable */ + 0x04, /* SPC-2 */ + 0x02, /* response data format */ + 0x20, /* response has 0x20 + 4 bytes */ + 0x00, + 0x00, + 0x00, + "rusEFI", + "SD Card", + {'v',CH_KERNEL_MAJOR+'0','.',CH_KERNEL_MINOR+'0'} +}; #endif /* HAL_USE_USB_MSD */ /* @@ -358,38 +371,30 @@ static void MMCmount(void) { mmcStart(&MMCD1, &mmccfg); // Configures and activates the MMC peripheral. } + #if HAL_USE_USB_MSD + msdObjectInit(&USBMSD1); + #endif + // Performs the initialization procedure on the inserted card. - LOCK_SD_SPI; + LOCK_SD_SPI; sdStatus = SD_STATE_CONNECTING; if (mmcConnect(&MMCD1) != HAL_SUCCESS) { + + #if HAL_USE_USB_MSD + // mount a null device to USB + msdMountNullDevice(&USBMSD1, &USBD2, blkbuf, &scsi_inquiry_response); + #endif + sdStatus = SD_STATE_NOT_CONNECTED; warning(CUSTOM_OBD_MMC_ERROR, "Can't connect or mount MMC/SD"); UNLOCK_SD_SPI; return; } -#if HAL_USE_USB_MSD - msdObjectInit(&USBMSD1); - - BaseBlockDevice *bbdp = (BaseBlockDevice*)&MMCD1; - msdStart(&USBMSD1, usb_driver, bbdp, blkbuf, NULL); - - //const usb_msd_driver_state_t msd_driver_state = msdInit(ms_usb_driver, bbdp, &UMSD1, USB_MS_DATA_EP, USB_MSD_INTERFACE_NUMBER); - //UMSD1.chp = NULL; - - /*Disconnect the USB Bus*/ - usbDisconnectBus(usb_driver); - chThdSleepMilliseconds(200); - - ///*Start the useful functions*/ - //msdStart(&UMSD1); - usbStart(usb_driver, &msdusbcfg); - - /*Connect the USB Bus*/ - usbConnectBus(usb_driver); -#endif - - + #if HAL_USE_USB_MSD + BaseBlockDevice *bbdp = (BaseBlockDevice*)&MMCD1; + msdStart(&USBMSD1, usb_driver, bbdp, blkbuf, &scsi_inquiry_response, NULL); + #endif UNLOCK_SD_SPI; #if HAL_USE_USB_MSD