aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/hal.mk3
-rw-r--r--os/hal/include/hal_community.h5
-rw-r--r--os/hal/include/hal_crc.h6
-rw-r--r--os/hal/include/hal_ee24xx.h6
-rw-r--r--os/hal/include/hal_ee25xx.h6
-rw-r--r--os/hal/include/hal_eeprom.h6
-rw-r--r--os/hal/include/hal_eicu.h6
-rw-r--r--os/hal/include/hal_nand.h6
-rw-r--r--os/hal/include/hal_onewire.h9
-rw-r--r--os/hal/include/hal_rng.h6
-rw-r--r--os/hal/include/hal_timcap.h8
-rw-r--r--os/hal/include/hal_usb_msd.h192
-rw-r--r--os/hal/include/hal_usbh.h6
-rw-r--r--os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c2
-rw-r--r--os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.h8
-rw-r--r--os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.c2
-rw-r--r--os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.h8
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.c2
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.h8
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.c2
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.h8
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.c2
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.h8
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c2
-rw-r--r--os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.h8
-rw-r--r--os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.c2
-rw-r--r--os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.h8
-rw-r--r--os/hal/ports/STM32/LLD/TIMv1/hal_eicu_lld.h6
-rw-r--r--os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.c2
-rw-r--r--os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.h4
-rw-r--r--os/hal/ports/STM32/LLD/USBHv1/hal_stm32_otg.h6
-rw-r--r--os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.h6
-rw-r--r--os/hal/src/hal_onewire.c2
-rw-r--r--os/hal/src/hal_timcap.c2
-rw-r--r--os/hal/src/hal_usb_msd.c386
35 files changed, 666 insertions, 83 deletions
diff --git a/os/hal/hal.mk b/os/hal/hal.mk
index ce74620..f05ddbc 100644
--- a/os/hal/hal.mk
+++ b/os/hal/hal.mk
@@ -18,6 +18,7 @@ HALSRC += ${CHIBIOS_CONTRIB}/os/hal/src/hal_community.c \
${CHIBIOS_CONTRIB}/os/hal/src/hal_eeprom.c \
${CHIBIOS_CONTRIB}/os/hal/src/hal_timcap.c \
${CHIBIOS_CONTRIB}/os/hal/src/hal_qei.c \
- ${CHIBIOS_CONTRIB}/os/hal/src/hal_usb_hid.c
+ ${CHIBIOS_CONTRIB}/os/hal/src/hal_usb_hid.c \
+ ${CHIBIOS_CONTRIB}/os/hal/src/hal_usb_msd.c
HALINC += ${CHIBIOS_CONTRIB}/os/hal/include
diff --git a/os/hal/include/hal_community.h b/os/hal/include/hal_community.h
index 1518c7e..430df7c 100644
--- a/os/hal/include/hal_community.h
+++ b/os/hal/include/hal_community.h
@@ -67,6 +67,10 @@
#define HAL_USE_USB_HID FALSE
#endif
+#if !defined(HAL_USE_USB_MSD)
+#define HAL_USE_USB_MSD FALSE
+#endif
+
/* Abstract interfaces.*/
/* Shared headers.*/
@@ -84,6 +88,7 @@
#include "hal_crc.h"
#include "hal_eeprom.h"
#include "hal_usb_hid.h"
+#include "hal_usb_msd.h"
/*===========================================================================*/
/* Driver constants. */
diff --git a/os/hal/include/hal_crc.h b/os/hal/include/hal_crc.h
index 8c4c895..d7ef10f 100644
--- a/os/hal/include/hal_crc.h
+++ b/os/hal/include/hal_crc.h
@@ -14,8 +14,8 @@
limitations under the License.
*/
-#ifndef _CRC_H_
-#define _CRC_H_
+#ifndef HAL_CRC_H_
+#define HAL_CRC_H_
#if (HAL_USE_CRC == TRUE) || defined(__DOXYGEN__)
@@ -153,6 +153,6 @@ extern "C" {
#endif /* HAL_USE_CRC */
-#endif /* _CRC_H_ */
+#endif /* HAL_CRC_H_ */
/** @} */
diff --git a/os/hal/include/hal_ee24xx.h b/os/hal/include/hal_ee24xx.h
index ab12fd1..00cdc95 100644
--- a/os/hal/include/hal_ee24xx.h
+++ b/os/hal/include/hal_ee24xx.h
@@ -4,8 +4,8 @@
The work is provided "as is" without warranty of any kind, neither express nor implied.
*/
-#ifndef EE24XX_H
-#define EE24XX_H
+#ifndef HAL_EE24XX_H
+#define HAL_EE24XX_H
#include "hal.h"
@@ -61,4 +61,4 @@ typedef struct {
#endif /* #if defined(EEPROM_USE_EE24XX) && EEPROM_USE_EE24XX */
-#endif // EE24XX_H
+#endif // HAL_EE24XX_H
diff --git a/os/hal/include/hal_ee25xx.h b/os/hal/include/hal_ee25xx.h
index fc2ad6f..e520bd6 100644
--- a/os/hal/include/hal_ee25xx.h
+++ b/os/hal/include/hal_ee25xx.h
@@ -4,8 +4,8 @@
The work is provided "as is" without warranty of any kind, neither express nor implied.
*/
-#ifndef EE25XX_H
-#define EE25XX_H
+#ifndef HAL_EE25XX_H
+#define HAL_EE25XX_H
#include "hal.h"
@@ -60,4 +60,4 @@ EepromFileStream *SPIEepromFileOpen(SPIEepromFileStream *efs,
#endif /* #if defined(EEPROM_USE_EE25XX) && EEPROM_USE_EE25XX */
-#endif // EE25XX_H
+#endif // HAL_EE25XX_H
diff --git a/os/hal/include/hal_eeprom.h b/os/hal/include/hal_eeprom.h
index cd05e14..6f53fb9 100644
--- a/os/hal/include/hal_eeprom.h
+++ b/os/hal/include/hal_eeprom.h
@@ -26,8 +26,8 @@
The work is provided "as is" without warranty of any kind, neither express nor implied.
*/
-#ifndef __EEPROM_H__
-#define __EEPROM_H__
+#ifndef HAL_EEPROM_H_
+#define HAL_EEPROM_H_
#include "ch.h"
#include "hal.h"
@@ -140,4 +140,4 @@ msg_t eepfs_get(void *ip);
#include "hal_ee25xx.h"
#endif /* #if defined(HAL_USE_EEPROM) && HAL_USE_EEPROM */
-#endif /* __EEPROM_H__ */
+#endif /* HAL_EEPROM_H_ */
diff --git a/os/hal/include/hal_eicu.h b/os/hal/include/hal_eicu.h
index d4b0ed2..8b4b07d 100644
--- a/os/hal/include/hal_eicu.h
+++ b/os/hal/include/hal_eicu.h
@@ -22,8 +22,8 @@
32-bit timers and timers with single capture/compare channels.
*/
-#ifndef _EICU_H_
-#define _EICU_H_
+#ifndef HAL_EICU_H_
+#define HAL_EICU_H_
#if (HAL_USE_EICU == TRUE) || defined(__DOXYGEN__)
@@ -186,6 +186,6 @@ extern "C" {
#endif /* HAL_USE_EICU */
-#endif /* _EICU_H_ */
+#endif /* HAL_EICU_H_ */
/** @} */
diff --git a/os/hal/include/hal_nand.h b/os/hal/include/hal_nand.h
index d5a1c04..ace3e5d 100644
--- a/os/hal/include/hal_nand.h
+++ b/os/hal/include/hal_nand.h
@@ -15,15 +15,15 @@
*/
/**
- * @file nand.h
+ * @file hal_nand.h
* @brief NAND Driver macros and structures.
*
* @addtogroup NAND
* @{
*/
-#ifndef _NAND_H_
-#define _NAND_H_
+#ifndef HAL_NAND_H_
+#define HAL_NAND_H_
#if (HAL_USE_NAND == TRUE) || defined(__DOXYGEN__)
diff --git a/os/hal/include/hal_onewire.h b/os/hal/include/hal_onewire.h
index 9fb5be2..12e7b75 100644
--- a/os/hal/include/hal_onewire.h
+++ b/os/hal/include/hal_onewire.h
@@ -15,15 +15,15 @@
*/
/**
- * @file onewire.h
+ * @file hal_onewire.h
* @brief 1-wire Driver macros and structures.
*
* @addtogroup onewire
* @{
*/
-#ifndef _ONEWIRE_H_
-#define _ONEWIRE_H_
+#ifndef HAL_ONEWIRE_H_
+#define HAL_ONEWIRE_H_
#if (HAL_USE_ONEWIRE == TRUE) || defined(__DOXYGEN__)
@@ -328,7 +328,6 @@ extern onewireDriver OWD1;
#ifdef __cplusplus
extern "C" {
#endif
- void onewireInit(void);
void onewireObjectInit(onewireDriver *owp);
void onewireStart(onewireDriver *owp, const onewireConfig *config);
void onewireStop(onewireDriver *owp);
@@ -352,7 +351,7 @@ extern "C" {
#endif /* HAL_USE_ONEWIRE */
-#endif /* _ONEWIRE_H_ */
+#endif /* HAL_ONEWIRE_H_ */
/** @} */
diff --git a/os/hal/include/hal_rng.h b/os/hal/include/hal_rng.h
index 0e3c484..dc146c7 100644
--- a/os/hal/include/hal_rng.h
+++ b/os/hal/include/hal_rng.h
@@ -14,8 +14,8 @@
limitations under the License.
*/
-#ifndef _RNG_H_
-#define _RNG_H_
+#ifndef HAL_RNG_H_
+#define HAL_RNG_H_
#if (HAL_USE_RNG == TRUE) || defined(__DOXYGEN__)
@@ -131,6 +131,6 @@ extern "C" {
#endif /* HAL_USE_RNG */
-#endif /* _RNG_H_ */
+#endif /* HAL_RNG_H_ */
/** @} */
diff --git a/os/hal/include/hal_timcap.h b/os/hal/include/hal_timcap.h
index bd43dd1..61c7fc5 100644
--- a/os/hal/include/hal_timcap.h
+++ b/os/hal/include/hal_timcap.h
@@ -19,15 +19,15 @@
*/
/**
- * @file timcap.h
+ * @file hal_timcap.h
* @brief TIMCAP Driver macros and structures.
*
* @addtogroup TIMCAP
* @{
*/
-#ifndef _TIMCAP_H_
-#define _TIMCAP_H_
+#ifndef HAL_TIMCAP_H_
+#define HAL_TIMCAP_H_
#include "ch.h"
#include "hal.h"
@@ -201,6 +201,6 @@ extern "C" {
#endif /* HAL_USE_TIMCAP */
-#endif /* _TIMCAP_H_ */
+#endif /* HAL_TIMCAP_H_ */
/** @} */
diff --git a/os/hal/include/hal_usb_msd.h b/os/hal/include/hal_usb_msd.h
new file mode 100644
index 0000000..08241df
--- /dev/null
+++ b/os/hal/include/hal_usb_msd.h
@@ -0,0 +1,192 @@
+/*
+ ChibiOS/HAL - Copyright (C) 2016 Uladzimir Pylinsky aka barthess
+
+ 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.
+*/
+
+/**
+ * @file hal_usb_msd.h
+ * @brief USM mass storage device driver macros and structures.
+ *
+ * @addtogroup usb_msd
+ * @{
+ */
+
+#ifndef HAL_USB_MSD_H
+#define HAL_USB_MSD_H
+
+#if (HAL_USE_USB_MSD == TRUE) || defined(__DOXYGEN__)
+
+#include "lib_scsi.h"
+
+/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
+
+#define USB_MSD_DATA_EP 0x01
+#define USB_MSD_EP_SIZE 0x40
+
+/*===========================================================================*/
+/* Driver pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+#if !HAL_USE_USB
+#error "Mass storage Driver requires HAL_USE_USB"
+#endif
+
+/*===========================================================================*/
+/* Driver data structures and types. */
+/*===========================================================================*/
+
+/**
+ * @brief Type of a structure representing an USB mass storage driver.
+ */
+typedef struct USBMassStorageDriver USBMassStorageDriver;
+
+/**
+ * @brief Type of a driver state machine possible states.
+ */
+typedef enum {
+ USB_MSD_UNINIT = 0,
+ USB_MSD_STOP,
+ USB_MSD_READY,
+} usbmsdstate_t;
+
+/**
+ * @brief Represents command block wrapper structure.
+ * @details See USB Mass Storage Class Specification.
+ */
+typedef struct PACKED_VAR {
+ uint32_t signature;
+ uint32_t tag;
+ uint32_t data_len;
+ uint8_t flags;
+ uint8_t lun;
+ uint8_t cmd_len;
+ uint8_t cmd_data[16];
+} msd_cbw_t;
+
+/**
+ * @brief Represents command status wrapper structure.
+ * @details See USB Mass Storage Class Specification.
+ */
+typedef struct PACKED_VAR {
+ uint32_t signature;
+ uint32_t tag;
+ uint32_t data_residue;
+ uint8_t status;
+} msd_csw_t;
+
+/**
+ * @brief Transport handler passed to SCSI layer.
+ */
+typedef struct {
+ /**
+ * @brief Pointer to the @p USBDriver object.
+ */
+ USBDriver *usbp;
+ /**
+ * @brief USB endpoint number.
+ */
+ usbep_t ep;
+} usb_scsi_transport_handler_t;
+
+
+/**
+ * @brief Structure representing an USB mass storage driver.
+ */
+struct USBMassStorageDriver {
+ /**
+ * @brief Pointer to the @p USBDriver object.
+ */
+ USBDriver *usbp;
+ /**
+ * @brief Driver state.
+ */
+ usbmsdstate_t state;
+ /**
+ * @brief CBW structure.
+ */
+ msd_cbw_t cbw;
+ /**
+ * @brief CSW structure.
+ */
+ msd_csw_t csw;
+ /**
+ * @brief Thread working area.
+ */
+ THD_WORKING_AREA( waMSDWorker, 512);
+ /**
+ * @brief Worker thread handler.
+ */
+ thread_reference_t worker;
+ /**
+ * @brief SCSI target driver structure.
+ */
+ SCSITarget scsi_target;
+ /**
+ * @brief SCSI target configuration structure.
+ */
+ SCSITargetConfig scsi_config;
+ /**
+ * @brief SCSI transport structure.
+ */
+ SCSITransport scsi_transport;
+ /**
+ * @brief SCSI over USB transport handler structure.
+ */
+ usb_scsi_transport_handler_t usb_scsi_transport_handler;
+};
+
+
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+extern USBMassStorageDriver USBMSD1;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void msdObjectInit(USBMassStorageDriver *msdp);
+ void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp,
+ BaseBlockDevice *blkdev, uint8_t *blkbuf,
+ const scsi_inquiry_response_t *scsi_inquiry_response);
+ void msdStop(USBMassStorageDriver *msdp);
+ bool msd_request_hook(USBDriver *usbp);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HAL_USE_USB_MSD */
+
+#endif /* HAL_USB_MSD_H */
+
+/** @} */
+
+
+
+
+
+
+
+
+
diff --git a/os/hal/include/hal_usbh.h b/os/hal/include/hal_usbh.h
index 5fd0047..63be93e 100644
--- a/os/hal/include/hal_usbh.h
+++ b/os/hal/include/hal_usbh.h
@@ -15,8 +15,8 @@
limitations under the License.
*/
-#ifndef USBH_H_
-#define USBH_H_
+#ifndef HAL_USBH_H_
+#define HAL_USBH_H_
#include "hal.h"
@@ -433,4 +433,4 @@ struct usbh_baseclassdriver {
#endif
-#endif /* USBH_H_ */
+#endif /* HAL_USBH_H_ */
diff --git a/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c b/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c
index 601deca..f8178f1 100644
--- a/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c
+++ b/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.c
@@ -15,7 +15,7 @@
*/
/**
- * @file STM32/CRCv1/crc_lld.c
+ * @file STM32/CRCv1/hal_crc_lld.c
* @brief STM32 CRC subsystem low level driver source.
*
* @addtogroup CRC
diff --git a/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.h b/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.h
index ecdaf81..213d346 100644
--- a/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.h
+++ b/os/hal/ports/STM32/LLD/CRCv1/hal_crc_lld.h
@@ -15,15 +15,15 @@
*/
/**
- * @file STM32/CRCv1/crc_lld.h
+ * @file STM32/CRCv1/hal_crc_lld.h
* @brief STM32 CRC subsystem low level driver header.
*
* @addtogroup CRC
* @{
*/
-#ifndef _CRC_LLD_H_
-#define _CRC_LLD_H_
+#ifndef HAL_CRC_LLD_H_
+#define HAL_CRC_LLD_H_
#if (HAL_USE_CRC == TRUE) || defined(__DOXYGEN__)
@@ -244,6 +244,6 @@ extern "C" {
#endif /* HAL_USE_CRC */
-#endif /* _CRC_LLD_H_ */
+#endif /* HAL_CRC_LLD_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.c b/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.c
index aba029f..6751202 100644
--- a/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.c
+++ b/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.c
@@ -15,7 +15,7 @@
*/
/**
- * @file stm32_dma2d.c
+ * @file hal_stm32_dma2d.c
* @brief DMA2D/Chrom-ART driver.
*/
diff --git a/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.h b/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.h
index 01f0941..c06ab62 100644
--- a/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.h
+++ b/os/hal/ports/STM32/LLD/DMA2Dv1/hal_stm32_dma2d.h
@@ -15,15 +15,15 @@
*/
/**
- * @file stm32_dma2d.h
+ * @file hal_stm32_dma2d.h
* @brief DMA2D/Chrom-ART driver.
*
* @addtogroup dma2d
* @{
*/
-#ifndef _STM32_DMA2D_H_
-#define _STM32_DMA2D_H_
+#ifndef HAL_STM32_DMA2D_H_
+#define HAL_STM32_DMA2D_H_
/**
* @brief Using the DMA2D driver.
@@ -659,6 +659,6 @@ extern "C" {
#endif /* STM32_DMA2D_USE_DMA2D */
-#endif /* _STM32_DMA2D_H_ */
+#endif /* HAL_STM32_DMA2D_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.c b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.c
index 557fa7b..b4c2938 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.c
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.c
@@ -15,7 +15,7 @@
*/
/**
- * @file fsmc.c
+ * @file hal_fsmc.c
* @brief FSMC Driver subsystem low level driver source template.
*
* @addtogroup FSMC
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.h b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.h
index ba3dafe..f0d4c65 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.h
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc.h
@@ -15,15 +15,15 @@
*/
/**
- * @file fsmc.h
+ * @file hal_fsmc.h
* @brief FSMC Driver subsystem low level driver header.
*
* @addtogroup FSMC
* @{
*/
-#ifndef _FSMC_H_
-#define _FSMC_H_
+#ifndef HAL_FSMC_H_
+#define HAL_FSMC_H_
#if (HAL_USE_FSMC == TRUE) || defined(__DOXYGEN__)
@@ -335,6 +335,6 @@ extern "C" {
#endif /* HAL_USE_FSMC */
-#endif /* _FSMC_H_ */
+#endif /* HAL_FSMC_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.c b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.c
index 95f47d5..ac83477 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.c
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.c
@@ -18,7 +18,7 @@
*/
/**
- * @file fsmc_sdram.c
+ * @file hal_fsmc_sdram.c
* @brief SDRAM Driver subsystem low level driver source.
*
* @addtogroup SDRAM
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.h b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.h
index cef6772..b419168 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.h
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sdram.h
@@ -18,15 +18,15 @@
*/
/**
- * @file fsmc_sdram.h
+ * @file hal_fsmc_sdram.h
* @brief SDRAM Driver subsystem low level driver header.
*
* @addtogroup SDRAM
* @{
*/
-#ifndef _FMC_SDRAM_H_
-#define _FMC_SDRAM_H_
+#ifndef HAL_FMC_SDRAM_H_
+#define HAL_FMC_SDRAM_H_
#if (defined(STM32F427xx) || defined(STM32F437xx) || \
defined(STM32F429xx) || defined(STM32F439xx))
@@ -166,6 +166,6 @@ extern "C" {
#endif /* STM32F427xx / STM32F429xx / STM32F437xx / STM32F439xx */
-#endif /* _FMC_SDRAM_H_ */
+#endif /* HAL_FMC_SDRAM_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.c b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.c
index 6f710d4..333362f 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.c
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.c
@@ -15,7 +15,7 @@
*/
/**
- * @file fsmc_sram.c
+ * @file hal_fsmc_sram.c
* @brief SRAM Driver subsystem low level driver source.
*
* @addtogroup SRAM
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.h b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.h
index 529bdc7..5e749a8 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.h
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_fsmc_sram.h
@@ -15,15 +15,15 @@
*/
/**
- * @file fsmc_sram.h
+ * @file hal_fsmc_sram.h
* @brief SRAM Driver subsystem low level driver header.
*
* @addtogroup SRAM
* @{
*/
-#ifndef _FSMC_SRAM_H_
-#define _FSMC_SRAM_H_
+#ifndef HAL_FSMC_SRAM_H_
+#define HAL_FSMC_SRAM_H_
#include "hal_fsmc.h"
@@ -167,6 +167,6 @@ extern "C" {
#endif /* STM32_USE_FSMC_SRAM */
-#endif /* _FSMC_SRAM_H_ */
+#endif /* HAL_FSMC_SRAM_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c b/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c
index 771723e..f39ff35 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.c
@@ -15,7 +15,7 @@
*/
/**
- * @file nand_lld.c
+ * @file hal_nand_lld.c
* @brief NAND Driver subsystem low level driver source.
*
* @addtogroup NAND
diff --git a/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.h b/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.h
index b0fa72f..de7a0c4 100644
--- a/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.h
+++ b/os/hal/ports/STM32/LLD/FSMCv1/hal_nand_lld.h
@@ -15,15 +15,15 @@
*/
/**
- * @file nand_lld.h
+ * @file hal_nand_lld.h
* @brief NAND Driver subsystem low level driver header.
*
* @addtogroup NAND
* @{
*/
-#ifndef _NAND_LLD_H_
-#define _NAND_LLD_H_
+#ifndef HAL_NAND_LLD_H_
+#define HAL_NAND_LLD_H_
#include "hal_fsmc.h"
#include "bitmap.h"
@@ -289,6 +289,6 @@ extern "C" {
#endif /* HAL_USE_NAND */
-#endif /* _NAND_LLD_H_ */
+#endif /* HAL_NAND_LLD_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.c b/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.c
index e5f9a09..f0fd289 100644
--- a/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.c
+++ b/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.c
@@ -15,7 +15,7 @@
*/
/**
- * @file stm32_ltdc.c
+ * @file hal_stm32_ltdc.c
* @brief LCD-TFT Controller Driver.
*/
diff --git a/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.h b/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.h
index 16b38ca..5db89e2 100644
--- a/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.h
+++ b/os/hal/ports/STM32/LLD/LTDCv1/hal_stm32_ltdc.h
@@ -15,15 +15,15 @@
*/
/**
- * @file stm32_ltdc.h
+ * @file hal_stm32_ltdc.h
* @brief LCD-TFT Controller Driver.
*
* @addtogroup ltdc
* @{
*/
-#ifndef _STM32_LTDC_H_
-#define _STM32_LTDC_H_
+#ifndef HAL_STM32_LTDC_H_
+#define HAL_STM32_LTDC_H_
/**
* @brief Using the LTDC driver.
@@ -731,6 +731,6 @@ extern "C" {
#endif /* STM32_LTDC_USE_LTDC */
-#endif /* _STM32_LTDC_H_ */
+#endif /* HAL_STM32_LTDC_H_ */
/** @} */
diff --git a/os/hal/ports/STM32/LLD/TIMv1/hal_eicu_lld.h b/os/hal/ports/STM32/LLD/TIMv1/hal_eicu_lld.h
index 927eb6f..e72098e 100644
--- a/os/hal/ports/STM32/LLD/TIMv1/hal_eicu_lld.h
+++ b/os/hal/ports/STM32/LLD/TIMv1/hal_eicu_lld.h
@@ -22,8 +22,8 @@
32-bit timers and timers with single capture/compare channels.
*/
-#ifndef __EICU_LLD_H
-#define __EICU_LLD_H
+#ifndef HAL_EICU_LLD_H
+#define HAL_EICU_LLD_H
#include "stm32_tim.h"
@@ -551,4 +551,4 @@ extern "C" {
#endif /* HAL_USE_EICU */
-#endif /* __EICU_LLD_H */
+#endif /* HAL_EICU_LLD_H */
diff --git a/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.c b/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.c
index 8ab6176..c55fae2 100644
--- a/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.c
+++ b/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.c
@@ -24,7 +24,7 @@
/**
- * @file STM32/timcap_lld.c
+ * @file STM32/hal_timcap_lld.c
* @brief STM32 TIMCAP subsystem low level driver header.
*
* @addtogroup TIMCAP
diff --git a/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.h b/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.h
index d39c438..643798a 100644
--- a/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.h
+++ b/os/hal/ports/STM32/LLD/TIMv1/hal_timcap_lld.h
@@ -22,8 +22,8 @@
* @{
*/
-#ifndef _TIMCAP_LLD_H_
-#define _TIMCAP_LLD_H_
+#ifndef HAL_TIMCAP_LLD_H_
+#define HAL_TIMCAP_LLD_H_
#include "ch.h"
#include "hal.h"
diff --git a/os/hal/ports/STM32/LLD/USBHv1/hal_stm32_otg.h b/os/hal/ports/STM32/LLD/USBHv1/hal_stm32_otg.h
index ca2dc49..b88e620 100644
--- a/os/hal/ports/STM32/LLD/USBHv1/hal_stm32_otg.h
+++ b/os/hal/ports/STM32/LLD/USBHv1/hal_stm32_otg.h
@@ -15,7 +15,7 @@
*/
/**
- * @file stm32_otg.h
+ * @file hal_stm32_otg.h
* @brief STM32 OTG registers layout header.
*
* @addtogroup USB
@@ -23,8 +23,8 @@
*/
-#ifndef _STM32_OTG_H_
-#define _STM32_OTG_H_
+#ifndef HAL_STM32_OTG_H_
+#define HAL_STM32_OTG_H_
/**
* @brief Number of the implemented endpoints in OTG_FS.
diff --git a/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.h b/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.h
index e8df749..5c0ac40 100644
--- a/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.h
+++ b/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.h
@@ -15,8 +15,8 @@
limitations under the License.
*/
-#ifndef USBH_LLD_H_
-#define USBH_LLD_H_
+#ifndef HAL_USBH_LLD_H_
+#define HAL_USBH_LLD_H_
#include "hal.h"
@@ -150,4 +150,4 @@ uint8_t usbh_lld_roothub_get_statuschange_bitmap(USBHDriver *usbh);
#endif
-#endif /* USBH_LLD_H_ */
+#endif /* HAL_USBH_LLD_H_ */
diff --git a/os/hal/src/hal_onewire.c b/os/hal/src/hal_onewire.c
index 91249a2..85630d9 100644
--- a/os/hal/src/hal_onewire.c
+++ b/os/hal/src/hal_onewire.c
@@ -46,7 +46,7 @@ on every timer overflow event.
*/
/**
- * @file onewire.c
+ * @file hal_onewire.c
* @brief 1-wire Driver code.
*
* @addtogroup onewire
diff --git a/os/hal/src/hal_timcap.c b/os/hal/src/hal_timcap.c
index a352490..309c147 100644
--- a/os/hal/src/hal_timcap.c
+++ b/os/hal/src/hal_timcap.c
@@ -19,7 +19,7 @@
*/
/**
- * @file timcap.c
+ * @file hal_timcap.c
* @brief TIMCAP Driver code.
*
* @addtogroup TIMCAP
diff --git a/os/hal/src/hal_usb_msd.c b/os/hal/src/hal_usb_msd.c
new file mode 100644
index 0000000..14f1165
--- /dev/null
+++ b/os/hal/src/hal_usb_msd.c
@@ -0,0 +1,386 @@
+/*
+ ChibiOS/HAL - Copyright (C) 2016 Uladzimir Pylinsky aka barthess
+
+ 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.
+*/
+
+/**
+ * @file hal_usb_msd.c
+ * @brief USM mass storage device code.
+ *
+ * @addtogroup usb_msd
+ * @{
+ */
+
+#include "hal.h"
+
+#if (HAL_USE_USB_MSD == TRUE) || defined(__DOXYGEN__)
+
+#include <string.h>
+
+/*===========================================================================*/
+/* Driver local definitions. */
+/*===========================================================================*/
+
+#define MSD_REQ_RESET 0xFF
+#define MSD_GET_MAX_LUN 0xFE
+
+#define MSD_CBW_SIGNATURE 0x43425355
+#define MSD_CSW_SIGNATURE 0x53425355
+
+#define MSD_THD_PRIO NORMALPRIO
+
+#define CBW_FLAGS_RESERVED_MASK 0b01111111
+#define CBW_LUN_RESERVED_MASK 0b11110000
+#define CBW_CMD_LEN_RESERVED_MASK 0b11000000
+
+#define CSW_STATUS_PASSED 0x00
+#define CSW_STATUS_FAILED 0x01
+#define CSW_STATUS_PHASE_ERROR 0x02
+
+#define MSD_SETUP_WORD(setup, index) (uint16_t)(((uint16_t)setup[index+1] << 8)\
+ | (setup[index] & 0x00FF))
+
+#define MSD_SETUP_VALUE(setup) MSD_SETUP_WORD(setup, 2)
+#define MSD_SETUP_INDEX(setup) MSD_SETUP_WORD(setup, 4)
+#define MSD_SETUP_LENGTH(setup) MSD_SETUP_WORD(setup, 6)
+
+/*===========================================================================*/
+/* Driver exported variables. */
+/*===========================================================================*/
+/**
+ * @brief USB mass storage driver identifier.
+ */
+USBMassStorageDriver USBMSD1;
+
+/*===========================================================================*/
+/* Driver local variables and types. */
+/*===========================================================================*/
+
+/**
+ * @brief Hardcoded default SCSI inquiry response structure.
+ */
+static const scsi_inquiry_response_t default_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,
+ "Chibios",
+ "Mass Storage",
+ {'v',CH_KERNEL_MAJOR+'0','.',CH_KERNEL_MINOR+'0'}
+};
+
+/*===========================================================================*/
+/* Driver local functions. */
+/*===========================================================================*/
+
+/**
+
+ */
+/**
+ * @brief Checks validity of CBW content.
+ * @details The device shall consider the CBW valid when:
+ * • The CBW was received after the device had sent a CSW or after a reset,
+ * • the CBW is 31 (1Fh) bytes in length,
+ * • and the dCBWSignature is equal to 43425355h.
+ *
+ * @param[in] cbw pointer to the @p msd_cbw_t object
+ * @param[in] recvd number of received bytes
+ *
+ * @return Operation status.
+ * @retval true CBW is meaningful.
+ * @retval false CBW is bad.
+ *
+ * @notapi
+ */
+static bool cbw_valid(const msd_cbw_t *cbw, msg_t recvd) {
+ if ((sizeof(msd_cbw_t) != recvd) || (cbw->signature != MSD_CBW_SIGNATURE)) {
+ return false;
+ }
+ else {
+ return true;
+ }
+}
+
+/**
+ * @brief Checks meaningfulness of CBW content.
+ * @details The device shall consider the contents of a valid CBW meaningful when:
+ * • no reserved bits are set,
+ * • the bCBWLUN contains a valid LUN supported by the device,
+ * • and both bCBWCBLength and the content of the CBWCB are in
+ * accordance with bInterfaceSubClass.
+ *
+ * @param[in] cbw pointer to the @p msd_cbw_t object
+ *
+ * @return Operation status.
+ * @retval true CBW is meaningful.
+ * @retval false CBW is bad.
+ *
+ * @notapi
+ */
+static bool cbw_meaningful(const msd_cbw_t *cbw) {
+ if (((cbw->cmd_len & CBW_CMD_LEN_RESERVED_MASK) != 0)
+ || ((cbw->flags & CBW_FLAGS_RESERVED_MASK) != 0)
+ || (cbw->lun != 0)) {
+ return false;
+ }
+ else {
+ return true;
+ }
+}
+
+/**
+ * @brief SCSI transport transmit function.
+ *
+ * @param[in] transport pointer to the @p SCSITransport object
+ * @param[in] data payload
+ * @param[in] len number of bytes to be transmitted
+ *
+ * @return Number of successfully transmitted bytes.
+
+ * @notapi
+ */
+static uint32_t scsi_transport_transmit(const SCSITransport *transport,
+ const uint8_t *data, size_t len) {
+
+ usb_scsi_transport_handler_t *trp = transport->handler;
+ msg_t status = usbTransmit(trp->usbp, trp->ep, data, len);
+ if (MSG_OK == status)
+ return len;
+ else
+ return 0;
+}
+
+/**
+ * @brief SCSI transport receive function.
+ *
+ * @param[in] transport pointer to the @p SCSITransport object
+ * @param[in] data payload
+ * @param[in] len number bytes to be received
+ *
+ * @return Number of successfully received bytes.
+
+ * @notapi
+ */
+static uint32_t scsi_transport_receive(const SCSITransport *transport,
+ uint8_t *data, size_t len) {
+
+ usb_scsi_transport_handler_t *trp = transport->handler;
+ msg_t status = usbReceive(trp->usbp, trp->ep, data, len);
+ if (MSG_RESET != status)
+ return status;
+ else
+ return 0;
+}
+
+/**
+ * @brief Fills and sends CSW message.
+ *
+ * @param[in] msdp pointer to the @p USBMassStorageDriver object
+ * @param[in] status status returned by SCSI layer
+ * @param[in] residue number of residue bytes in case of failed transaction
+ *
+ * @notapi
+ */
+static void send_csw(USBMassStorageDriver *msdp, uint8_t status,
+ uint32_t residue) {
+
+ msdp->csw.signature = MSD_CSW_SIGNATURE;
+ msdp->csw.data_residue = residue;
+ msdp->csw.tag = msdp->cbw.tag;
+ msdp->csw.status = status;
+
+ usbTransmit(msdp->usbp, USB_MSD_DATA_EP, (uint8_t *)&msdp->csw,
+ sizeof(msd_csw_t));
+}
+
+/**
+ * @brief Mass storage worker thread.
+ *
+ * @param[in] arg pointer to the @p USBMassStorageDriver object
+ *
+ * @notapi
+ */
+static THD_FUNCTION(usb_msd_worker, arg) {
+ USBMassStorageDriver *msdp = arg;
+
+ while(! chThdShouldTerminateX()) {
+ const msg_t status = usbReceive(msdp->usbp, USB_MSD_DATA_EP,
+ (uint8_t *)&msdp->cbw, sizeof(msd_cbw_t));
+ if (MSG_RESET == status) {
+ osalThreadSleepMilliseconds(50);
+ }
+ else if (cbw_valid(&msdp->cbw, status) && cbw_meaningful(&msdp->cbw)) {
+ if (SCSI_SUCCESS == scsiExecCmd(&msdp->scsi_target, msdp->cbw.cmd_data)) {
+ send_csw(msdp, CSW_STATUS_PASSED, 0);
+ }
+ else {
+ send_csw(msdp, CSW_STATUS_FAILED, scsiResidue(&msdp->scsi_target));
+ }
+ }
+ else {
+ ; /* do NOT send CSW here. Incorrect CBW must be silently ignored */
+ }
+ }
+
+ chThdExit(MSG_OK);
+}
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+/**
+ * @brief Mass storage specific request hook for USB.
+ *
+ * @param[in] usbp pointer to the @p USBDriver object
+ *
+ * @notapi
+ */
+bool msd_request_hook(USBDriver *usbp) {
+
+ if (((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) &&
+ ((usbp->setup[0] & USB_RTYPE_RECIPIENT_MASK) == USB_RTYPE_RECIPIENT_INTERFACE)) {
+ /* check that the request is for interface 0.*/
+ if (MSD_SETUP_INDEX(usbp->setup) != 0)
+ return false;
+
+ /* act depending on bRequest = setup[1] */
+ switch(usbp->setup[1]) {
+ case MSD_REQ_RESET:
+ /* check that it is a HOST2DEV request */
+ if (((usbp->setup[0] & USB_RTYPE_DIR_MASK) != USB_RTYPE_DIR_HOST2DEV) ||
+ (MSD_SETUP_LENGTH(usbp->setup) != 0) ||
+ (MSD_SETUP_VALUE(usbp->setup) != 0))
+ return false;
+
+ /* reset all endpoints */
+ /* TODO!*/
+ /* The device shall NAK the status stage of the device request until
+ * the Bulk-Only Mass Storage Reset is complete.
+ */
+ return true;
+
+ case MSD_GET_MAX_LUN:
+ /* check that it is a DEV2HOST request */
+ if (((usbp->setup[0] & USB_RTYPE_DIR_MASK) != USB_RTYPE_DIR_DEV2HOST) ||
+ (MSD_SETUP_LENGTH(usbp->setup) != 1) ||
+ (MSD_SETUP_VALUE(usbp->setup) != 0))
+ return false;
+
+ /* stall to indicate that we don't support LUN */
+ osalSysLockFromISR();
+ usbStallTransmitI(usbp, 0);
+ osalSysUnlockFromISR();
+ return true;
+
+ default:
+ return false;
+ break;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Initializes the standard part of a @p USBMassStorageDriver structure.
+ *
+ * @param[out] msdp pointer to the @p USBMassStorageDriver object
+ *
+ * @init
+ */
+void msdObjectInit(USBMassStorageDriver *msdp) {
+
+ memset(msdp, 0x55, sizeof(USBMassStorageDriver));
+ msdp->state = USB_MSD_STOP;
+ msdp->usbp = NULL;
+ msdp->worker = NULL;
+
+ scsiObjectInit(&msdp->scsi_target);
+}
+
+/**
+ * @brief Stops the USB mass storage driver.
+ *
+ * @param[in] msdp pointer to the @p USBMassStorageDriver object
+ *
+ * @api
+ */
+void msdStop(USBMassStorageDriver *msdp) {
+
+ osalDbgCheck(msdp != NULL);
+ osalDbgAssert((msdp->state == USB_MSD_READY), "invalid state");
+
+ chThdTerminate(msdp->worker);
+ chThdWait(msdp->worker);
+
+ scsiStop(&msdp->scsi_target);
+
+ msdp->worker = NULL;
+ msdp->state = USB_MSD_STOP;
+ msdp->usbp = NULL;
+}
+
+/**
+ * @brief Configures and activates the USB mass storage driver.
+ *
+ * @param[in] msdp pointer to the @p USBMassStorageDriver object
+ * @param[in] usbp pointer to the @p USBDriver object
+ * @param[in] blkdev pointer to the @p BaseBlockDevice object
+ * @param[in] blkbuf pointer to the working area buffer, must be allocated
+ * by user, must be big enough to store 1 data block
+ * @param[in] inquiry pointer to the SCSI inquiry response structure,
+ * set it to @p NULL to use default hardcoded value.
+ *
+ * @api
+ */
+void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp,
+ BaseBlockDevice *blkdev, uint8_t *blkbuf,
+ const scsi_inquiry_response_t *inquiry) {
+
+ osalDbgCheck((msdp != NULL) && (usbp != NULL)
+ && (blkdev != NULL) && (blkbuf != NULL));
+ osalDbgAssert((msdp->state == USB_MSD_STOP), "invalid state");
+
+ msdp->usbp = usbp;
+
+ msdp->usb_scsi_transport_handler.usbp = msdp->usbp;
+ msdp->usb_scsi_transport_handler.ep = USB_MSD_DATA_EP;
+ msdp->scsi_transport.handler = &msdp->usb_scsi_transport_handler;
+ msdp->scsi_transport.transmit = scsi_transport_transmit;
+ msdp->scsi_transport.receive = scsi_transport_receive;
+
+ if (NULL == inquiry) {
+ msdp->scsi_config.inquiry_response = &default_scsi_inquiry_response;
+ }
+ else {
+ msdp->scsi_config.inquiry_response = inquiry;
+ }
+ msdp->scsi_config.blkbuf = blkbuf;
+ msdp->scsi_config.blkdev = blkdev;
+ msdp->scsi_config.transport = &msdp->scsi_transport;
+
+ scsiStart(&msdp->scsi_target, &msdp->scsi_config);
+
+ msdp->state = USB_MSD_READY;
+ msdp->worker = chThdCreateStatic(msdp->waMSDWorker, sizeof(msdp->waMSDWorker),
+ MSD_THD_PRIO, usb_msd_worker, msdp);
+}
+
+#endif /* HAL_USE_USB_MSD */
+
+/** @} */