mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-12 19:10:32 +03:00
Add USB MSC support to AT32 (#12481)
This commit is contained in:
parent
c14ef06c29
commit
6ff80a471a
21 changed files with 330 additions and 65 deletions
|
@ -144,6 +144,7 @@ void bot_scsi_reset(void *udev)
|
|||
*/
|
||||
void bot_scsi_datain_handler(void *udev, uint8_t ept_num)
|
||||
{
|
||||
UNUSED(ept_num);
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
switch(pmsc->msc_state)
|
||||
|
@ -173,6 +174,7 @@ void bot_scsi_datain_handler(void *udev, uint8_t ept_num)
|
|||
*/
|
||||
void bot_scsi_dataout_handler(void *udev, uint8_t ept_num)
|
||||
{
|
||||
UNUSED(ept_num);
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
switch(pmsc->msc_state)
|
||||
|
@ -289,6 +291,7 @@ void bot_scsi_send_csw(void *udev, uint8_t status)
|
|||
*/
|
||||
void bot_scsi_sense_code(void *udev, uint8_t sense_key, uint8_t asc)
|
||||
{
|
||||
UNUSED(udev);
|
||||
sense_data.sense_key = sense_key;
|
||||
sense_data.asc = asc;
|
||||
}
|
||||
|
@ -347,6 +350,8 @@ void bot_scsi_stall(void *udev)
|
|||
*/
|
||||
usb_sts_type bot_scsi_test_unit(void *udev, uint8_t lun)
|
||||
{
|
||||
UNUSED(udev);
|
||||
UNUSED(lun);
|
||||
usb_sts_type status = USB_OK;
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
|
@ -410,6 +415,7 @@ usb_sts_type bot_scsi_inquiry(void *udev, uint8_t lun)
|
|||
*/
|
||||
usb_sts_type bot_scsi_start_stop(void *udev, uint8_t lun)
|
||||
{
|
||||
UNUSED(lun);
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
pmsc->data_len = 0;
|
||||
|
@ -424,6 +430,7 @@ usb_sts_type bot_scsi_start_stop(void *udev, uint8_t lun)
|
|||
*/
|
||||
usb_sts_type bot_scsi_allow_medium_removal(void *udev, uint8_t lun)
|
||||
{
|
||||
UNUSED(lun);
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
pmsc->data_len = 0;
|
||||
|
@ -438,6 +445,7 @@ usb_sts_type bot_scsi_allow_medium_removal(void *udev, uint8_t lun)
|
|||
*/
|
||||
usb_sts_type bot_scsi_mode_sense6(void *udev, uint8_t lun)
|
||||
{
|
||||
UNUSED(lun);
|
||||
uint8_t data_len = 8;
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
|
@ -447,6 +455,12 @@ usb_sts_type bot_scsi_mode_sense6(void *udev, uint8_t lun)
|
|||
data_len --;
|
||||
pmsc->data[data_len] = mode_sense6_data[data_len];
|
||||
};
|
||||
|
||||
// set bit 7 of the device configuration byte to indicate write protection
|
||||
if (msc_get_readonly(lun)) {
|
||||
pmsc->data[2] |= 1 << 7;
|
||||
}
|
||||
|
||||
return USB_OK;
|
||||
}
|
||||
|
||||
|
@ -458,6 +472,7 @@ usb_sts_type bot_scsi_mode_sense6(void *udev, uint8_t lun)
|
|||
*/
|
||||
usb_sts_type bot_scsi_mode_sense10(void *udev, uint8_t lun)
|
||||
{
|
||||
UNUSED(lun);
|
||||
uint8_t data_len = 8;
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
|
@ -540,6 +555,7 @@ usb_sts_type bot_scsi_format_capacity(void *udev, uint8_t lun)
|
|||
*/
|
||||
usb_sts_type bot_scsi_request_sense(void *udev, uint8_t lun)
|
||||
{
|
||||
UNUSED(lun);
|
||||
uint32_t trans_len = 0x12;
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
msc_type *pmsc = (msc_type *)pudev->class_handler->pdata;
|
||||
|
@ -633,7 +649,7 @@ usb_sts_type bot_scsi_read10(void *udev, uint8_t lun)
|
|||
pmsc->data_len = MSC_MAX_DATA_BUF_LEN;
|
||||
|
||||
len = MIN(pmsc->blk_len, MSC_MAX_DATA_BUF_LEN);
|
||||
if( msc_disk_read(lun, pmsc->blk_addr, pmsc->data, len) != USB_OK)
|
||||
if( msc_disk_read(lun, pmsc->blk_addr / pmsc->blk_size[lun], pmsc->data, len / pmsc->blk_size[lun]) != USB_OK)
|
||||
{
|
||||
bot_scsi_sense_code(udev, SENSE_KEY_HARDWARE_ERROR, MEDIUM_NOT_PRESENT);
|
||||
return USB_FAIL;
|
||||
|
@ -698,7 +714,7 @@ usb_sts_type bot_scsi_write10(void *udev, uint8_t lun)
|
|||
else
|
||||
{
|
||||
len = MIN(pmsc->blk_len, MSC_MAX_DATA_BUF_LEN);
|
||||
if(msc_disk_write(lun, pmsc->blk_addr, pmsc->data, len) != USB_OK)
|
||||
if(msc_disk_write(lun, pmsc->blk_addr / pmsc->blk_size[lun], pmsc->data, len / pmsc->blk_size[lun]) != USB_OK)
|
||||
{
|
||||
bot_scsi_sense_code(udev, SENSE_KEY_HARDWARE_ERROR, MEDIUM_NOT_PRESENT);
|
||||
return USB_FAIL;
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
*/
|
||||
#include "usbd_core.h"
|
||||
#include "msc_class.h"
|
||||
#include "msc_desc.h"
|
||||
#include <msc_desc.h>
|
||||
#include "msc_bot_scsi.h"
|
||||
|
||||
/** @addtogroup AT32F435_437_middlewares_usbd_class
|
||||
|
@ -183,6 +183,7 @@ static usb_sts_type class_setup_handler(void *udev, usb_setup_type *setup)
|
|||
*/
|
||||
static usb_sts_type class_ept0_tx_handler(void *udev)
|
||||
{
|
||||
UNUSED(udev);
|
||||
usb_sts_type status = USB_OK;
|
||||
|
||||
/* ...user code... */
|
||||
|
@ -199,7 +200,7 @@ static usb_sts_type class_ept0_rx_handler(void *udev)
|
|||
{
|
||||
usb_sts_type status = USB_OK;
|
||||
usbd_core_type *pudev = (usbd_core_type *)udev;
|
||||
uint32_t recv_len = usbd_get_recv_len(pudev, 0);
|
||||
usbd_get_recv_len(pudev, 0);
|
||||
/* ...user code... */
|
||||
return status;
|
||||
}
|
||||
|
@ -240,6 +241,7 @@ static usb_sts_type class_out_handler(void *udev, uint8_t ept_num)
|
|||
*/
|
||||
static usb_sts_type class_sof_handler(void *udev)
|
||||
{
|
||||
UNUSED(udev);
|
||||
usb_sts_type status = USB_OK;
|
||||
|
||||
/* ...user code... */
|
||||
|
@ -255,6 +257,7 @@ static usb_sts_type class_sof_handler(void *udev)
|
|||
*/
|
||||
static usb_sts_type class_event_handler(void *udev, usbd_event_type event)
|
||||
{
|
||||
UNUSED(udev);
|
||||
usb_sts_type status = USB_OK;
|
||||
switch(event)
|
||||
{
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include "usb_std.h"
|
||||
#include "usbd_sdr.h"
|
||||
#include "usbd_core.h"
|
||||
#include "msc_desc.h"
|
||||
#include <msc_desc.h>
|
||||
|
||||
/** @addtogroup AT32F435_437_middlewares_usbd_class
|
||||
* @{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue