1
0
Fork 0
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:
Steve Evans 2023-03-15 03:29:38 +00:00 committed by GitHub
parent c14ef06c29
commit 6ff80a471a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 330 additions and 65 deletions

View file

@ -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;

View file

@ -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)
{

View file

@ -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
* @{