11/***************************************************************************
2- * Copyright (c) 2024 Microsoft Corporation
3- *
2+ * Copyright (c) 2024 Microsoft Corporation
3+ *
44 * This program and the accompanying materials are made available under the
55 * terms of the MIT License which is available at
66 * https://opensource.org/licenses/MIT.
7- *
7+ *
88 * SPDX-License-Identifier: MIT
99 **************************************************************************/
1010
6767#ifndef UX_DEVICE_CLASS_STORAGE_H
6868#define UX_DEVICE_CLASS_STORAGE_H
6969
70- /* Determine if a C++ compiler is being used. If so, ensure that standard
71- C is used to process the API information. */
70+ /* Determine if a C++ compiler is being used. If so, ensure that standard
71+ C is used to process the API information. */
7272
73- #ifdef __cplusplus
73+ #ifdef __cplusplus
7474
75- /* Yes, C++ compiler is present. Use standard C. */
76- extern "C" {
75+ /* Yes, C++ compiler is present. Use standard C. */
76+ extern "C" {
7777
78- #endif
78+ #endif
7979
8080
8181/* Internal option: enable the basic USBX error checking. This define is typically used
@@ -192,6 +192,13 @@ extern "C" {
192192#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_LENGTH 36
193193#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_LENGTH_CD_ROM 0x5b
194194
195+ /* Define Storage Class SCSI inquiry response length constants. */
196+
197+ #define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_VENDOR_ID_LENGTH 0x08U
198+ #define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_PRODUCT_ID_LENGTH 0x10U
199+ #define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_PRODUCT_REVISION_LENGTH 0x04U
200+ #define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_PRODUCT_SERIAL_LENGTH 0x14U
201+
195202
196203/* Define Storage Class SCSI start/stop command constants. */
197204
@@ -505,16 +512,26 @@ typedef struct UX_SLAVE_CLASS_STORAGE_LUN_STRUCT
505512 ULONG ux_slave_class_storage_disk_status ;
506513 ULONG ux_slave_class_storage_last_session_state ;
507514
508- UINT (* ux_slave_class_storage_media_read )(VOID * storage , ULONG lun , UCHAR * data_pointer , ULONG number_blocks , ULONG lba , ULONG * media_status );
509- UINT (* ux_slave_class_storage_media_write )(VOID * storage , ULONG lun , UCHAR * data_pointer , ULONG number_blocks , ULONG lba , ULONG * media_status );
510- UINT (* ux_slave_class_storage_media_flush )(VOID * storage , ULONG lun , ULONG number_blocks , ULONG lba , ULONG * media_status );
511- UINT (* ux_slave_class_storage_media_status )(VOID * storage , ULONG lun , ULONG media_id , ULONG * media_status );
512- UINT (* ux_slave_class_storage_media_notification )(VOID * storage , ULONG lun , ULONG media_id , ULONG notification_class , UCHAR * * media_notification , ULONG * media_notification_length );
515+ UINT (* ux_slave_class_storage_media_read )(VOID * storage , ULONG lun , UCHAR * data_pointer ,
516+ ULONG number_blocks , ULONG lba , ULONG * media_status );
517+ UINT (* ux_slave_class_storage_media_write )(VOID * storage , ULONG lun , UCHAR * data_pointer ,
518+ ULONG number_blocks , ULONG lba , ULONG * media_status );
519+ UINT (* ux_slave_class_storage_media_flush )(VOID * storage , ULONG lun , ULONG number_blocks ,
520+ ULONG lba , ULONG * media_status );
521+ UINT (* ux_slave_class_storage_media_status )(VOID * storage , ULONG lun , ULONG media_id ,
522+ ULONG * media_status );
523+ UINT (* ux_slave_class_storage_media_notification )(VOID * storage , ULONG lun , ULONG media_id ,
524+ ULONG notification_class ,
525+ UCHAR * * media_notification ,
526+ ULONG * media_notification_length );
513527} UX_SLAVE_CLASS_STORAGE_LUN ;
514528
515529/* Sense status value (key at bit0-7, code at bit8-15 and qualifier at bit16-23). */
516530
517- #define UX_DEVICE_CLASS_STORAGE_SENSE_STATUS (key ,code ,qualifier ) (((key) & 0xFF)|(((code) & 0xFF) << 8)|(((qualifier) & 0xFF) << 16))
531+ #define UX_DEVICE_CLASS_STORAGE_SENSE_STATUS (key , code , qualifier ) (((key) & 0xFF) | \
532+ (((code) & 0xFF) << 8) | \
533+ (((qualifier) & 0xFF) << 16))
534+
518535#define UX_DEVICE_CLASS_STORAGE_SENSE_KEY (status ) ((status) & 0xFF)
519536#define UX_DEVICE_CLASS_STORAGE_SENSE_CODE (status ) (((status) >> 8) & 0xFF)
520537#define UX_DEVICE_CLASS_STORAGE_SENSE_QUALIFIER (status ) (((status) >> 16) & 0xFF)
@@ -579,7 +596,8 @@ typedef struct UX_SLAVE_CLASS_STORAGE_STRUCT
579596 (UX_OVERFLOW_CHECK_MULC_ULONG(UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE, 2))
580597#define UX_DEVICE_CLASS_STORAGE_ENDPOINT_BUFFER_SIZE (UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE * 2)
581598#define UX_DEVICE_CLASS_STORAGE_BULKOUT_BUFFER (storage ) ((storage)->ux_device_class_storage_endpoint_buffer)
582- #define UX_DEVICE_CLASS_STORAGE_BULKIN_BUFFER (storage ) (UX_DEVICE_CLASS_STORAGE_BULKOUT_BUFFER(storage) + UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE)
599+ #define UX_DEVICE_CLASS_STORAGE_BULKIN_BUFFER (storage ) (UX_DEVICE_CLASS_STORAGE_BULKOUT_BUFFER(storage) + \
600+ UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE)
583601
584602#define UX_DEVICE_CLASS_STORAGE_CSW_STATUS (p ) (((UCHAR*)(p))[0])
585603#define UX_DEVICE_CLASS_STORAGE_CSW_SKIP (p ) (((UCHAR*)(p))[3])
@@ -605,50 +623,86 @@ UINT _ux_device_class_storage_initialize(UX_SLAVE_CLASS_COMMAND *command);
605623UINT _ux_device_class_storage_uninitialize (UX_SLAVE_CLASS_COMMAND * command );
606624UINT _ux_device_class_storage_activate (UX_SLAVE_CLASS_COMMAND * command );
607625UINT _ux_device_class_storage_control_request (UX_SLAVE_CLASS_COMMAND * command );
608- UINT _ux_device_class_storage_csw_send (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in , UCHAR csw_status );
626+ UINT _ux_device_class_storage_csw_send (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
627+ UX_SLAVE_ENDPOINT * endpoint_in , UCHAR csw_status );
609628UINT _ux_device_class_storage_deactivate (UX_SLAVE_CLASS_COMMAND * command );
610629UINT _ux_device_class_storage_entry (UX_SLAVE_CLASS_COMMAND * command );
611- UINT _ux_device_class_storage_format (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
612- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
613- UINT _ux_device_class_storage_inquiry (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
614- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
615- UINT _ux_device_class_storage_mode_select (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
616- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
617- UINT _ux_device_class_storage_mode_sense (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
618- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
630+ UINT _ux_device_class_storage_format (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
631+ UX_SLAVE_ENDPOINT * endpoint_in ,
632+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
633+
634+ UINT _ux_device_class_storage_inquiry (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
635+ UX_SLAVE_ENDPOINT * endpoint_in ,
636+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
637+
638+ UINT _ux_device_class_storage_mode_select (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
639+ UX_SLAVE_ENDPOINT * endpoint_in ,
640+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
641+
642+ UINT _ux_device_class_storage_mode_sense (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
643+ UX_SLAVE_ENDPOINT * endpoint_in ,
644+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
645+
619646UINT _ux_device_class_storage_prevent_allow_media_removal (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
620- UX_SLAVE_ENDPOINT * endpoint_in , UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
621- UINT _ux_device_class_storage_read (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
622- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb , UCHAR scsi_command );
623- UINT _ux_device_class_storage_read_capacity (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
624- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
625- UINT _ux_device_class_storage_read_format_capacity (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
626- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
627- UINT _ux_device_class_storage_read_toc (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
628- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
629- UINT _ux_device_class_storage_request_sense (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
630- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
631- UINT _ux_device_class_storage_start_stop (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
632- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
633- UINT _ux_device_class_storage_test_ready (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
634- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
635- VOID _ux_device_class_storage_thread (ULONG storage_instance );
636- UINT _ux_device_class_storage_verify (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
637- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
638- UINT _ux_device_class_storage_write (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
639- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb , UCHAR scsi_command );
640- UINT _ux_device_class_storage_synchronize_cache (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun , UX_SLAVE_ENDPOINT * endpoint_in ,
641- UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb , UCHAR scsi_command );
642- UINT _ux_device_class_storage_read_disk_information (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
647+ UX_SLAVE_ENDPOINT * endpoint_in ,
648+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
649+
650+ UINT _ux_device_class_storage_read (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
651+ UX_SLAVE_ENDPOINT * endpoint_in ,
652+ UX_SLAVE_ENDPOINT * endpoint_out ,
653+ UCHAR * cbwcb , UCHAR scsi_command );
654+
655+ UINT _ux_device_class_storage_read_capacity (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
656+ UX_SLAVE_ENDPOINT * endpoint_in ,
657+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
658+
659+ UINT _ux_device_class_storage_read_format_capacity (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
660+ UX_SLAVE_ENDPOINT * endpoint_in ,
661+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
662+
663+ UINT _ux_device_class_storage_read_toc (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
664+ UX_SLAVE_ENDPOINT * endpoint_in ,
665+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
666+
667+ UINT _ux_device_class_storage_request_sense (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
668+ UX_SLAVE_ENDPOINT * endpoint_in ,
669+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
670+
671+ UINT _ux_device_class_storage_start_stop (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
643672 UX_SLAVE_ENDPOINT * endpoint_in ,
644673 UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
645674
646- UINT _ux_device_class_storage_get_configuration (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
675+ UINT _ux_device_class_storage_test_ready (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
647676 UX_SLAVE_ENDPOINT * endpoint_in ,
648677 UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
678+
679+ VOID _ux_device_class_storage_thread (ULONG storage_instance );
680+
681+ UINT _ux_device_class_storage_verify (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
682+ UX_SLAVE_ENDPOINT * endpoint_in ,
683+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
684+
685+ UINT _ux_device_class_storage_write (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
686+ UX_SLAVE_ENDPOINT * endpoint_in ,
687+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb , UCHAR scsi_command );
688+
689+ UINT _ux_device_class_storage_synchronize_cache (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
690+ UX_SLAVE_ENDPOINT * endpoint_in ,
691+ UX_SLAVE_ENDPOINT * endpoint_out ,
692+ UCHAR * cbwcb , UCHAR scsi_command );
693+
694+ UINT _ux_device_class_storage_read_disk_information (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
695+ UX_SLAVE_ENDPOINT * endpoint_in ,
696+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
697+
698+ UINT _ux_device_class_storage_get_configuration (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
699+ UX_SLAVE_ENDPOINT * endpoint_in ,
700+ UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
701+
649702UINT _ux_device_class_storage_get_status_notification (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
650703 UX_SLAVE_ENDPOINT * endpoint_in ,
651704 UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
705+
652706UINT _ux_device_class_storage_report_key (UX_SLAVE_CLASS_STORAGE * storage ,
653707 ULONG lun ,
654708 UX_SLAVE_ENDPOINT * endpoint_in ,
@@ -660,6 +714,7 @@ UINT _ux_device_class_storage_get_performance(UX_SLAVE_CLASS_STORAGE *storage
660714 UX_SLAVE_ENDPOINT * endpoint_in ,
661715 UX_SLAVE_ENDPOINT * endpoint_out ,
662716 UCHAR * cbwcb );
717+
663718UINT _ux_device_class_storage_read_dvd_structure (UX_SLAVE_CLASS_STORAGE * storage , ULONG lun ,
664719 UX_SLAVE_ENDPOINT * endpoint_in ,
665720 UX_SLAVE_ENDPOINT * endpoint_out , UCHAR * cbwcb );
@@ -674,10 +729,10 @@ UINT _uxe_device_class_storage_initialize(UX_SLAVE_CLASS_COMMAND *command);
674729
675730#define ux_device_class_storage_entry _ux_device_class_storage_entry
676731
677- /* Determine if a C++ compiler is being used. If so, complete the standard
678- C conditional started above. */
732+ /* Determine if a C++ compiler is being used. If so, complete the standard
733+ C conditional started above. */
679734#ifdef __cplusplus
680- }
681- #endif
735+ }
736+ #endif
682737
683738#endif
0 commit comments