123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- #ifndef APP_USBD_MSC_INTERNAL_H__
- #define APP_USBD_MSC_INTERNAL_H__
- #include "app_util.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define APP_USBD_MSC_MINIMAL_SERIAL_STRING_SIZE (12 + 1)
- #define APP_USBD_MSC_BUFFER_CNT 2
- #define APP_USBD_MSC_BUFFER_NAME(instance_name) CONCAT_2(instance_name, _block)
- #define APP_USBD_MSC_BLKDEVS_NAME(instance_name) CONCAT_2(instance_name, _blkdevs)
- APP_USBD_CLASS_FORWARD(app_usbd_msc);
- enum app_usbd_msc_user_event_e;
- typedef void (*app_usbd_msc_user_ev_handler_t)(app_usbd_class_inst_t const * p_inst,
- enum app_usbd_msc_user_event_e event);
- typedef struct {
- void * p_block_buff;
- size_t block_buff_size;
- size_t block_buff_count;
- nrf_block_dev_t const ** pp_block_devs;
- size_t block_devs_count;
- app_usbd_msc_user_ev_handler_t user_ev_handler;
- app_usbd_msc_subclass_t subclass;
- app_usbd_msc_protocol_t protocol;
- } app_usbd_msc_inst_t;
- typedef enum {
- APP_USBD_MSC_STATE_DISABLED,
- APP_USBD_MSC_STATE_IDLE,
- APP_USBD_MSC_STATE_CBW,
- APP_USBD_MSC_STATE_CMD_IN,
- APP_USBD_MSC_STATE_DATA_IN,
- APP_USBD_MSC_STATE_DATA_OUT,
- APP_USBD_MSC_STATE_CSW,
- APP_USBD_MSC_STATE_UNSUPPORTED,
- APP_USBD_MSC_STATE_CBW_INVALID,
- APP_USBD_MSC_STATE_DEVICE_ERROR,
- } app_usbd_msc_state_t;
- typedef struct {
- app_usbd_msc_state_t state;
- app_usbd_msc_cbw_t cbw;
- app_usbd_msc_csw_t csw;
-
- struct
- {
-
- struct
- {
- uint8_t rd_idx;
- uint8_t d_count;
- uint8_t a_count;
- } buff;
-
- struct
- {
- size_t size_left;
- size_t datalen_left;
- bool pending;
- bool abort;
-
- } transfer;
-
- struct
- {
- uint8_t lun;
- size_t blk_size;
- size_t size_left;
- size_t datalen_left;
- uint32_t blk_idx;
- bool pending;
- bool abort;
-
- } process;
- } current;
-
- union {
- app_usbd_scsi_cmd_inquiry_resp_t inquiry;
- app_usbd_scsi_cmd_requestsense_resp_t requestsense;
- app_usbd_scsi_cmd_readcapacity10_resp_t readcapacity10;
- app_usbd_scsi_cmd_modesense6_resp_t modesense6;
- app_usbd_scsi_cmd_modesense10_resp_t modesense10;
- } scsi_resp;
- uint16_t blk_dev_init_mask;
- } app_usbd_msc_ctx_t;
- #define APP_USBD_MSC_CONFIG(iface, endpoints) ((iface, BRACKET_EXTRACT(endpoints)))
- #define APP_USBD_MSC_INSTANCE_SPECIFIC_DEC app_usbd_msc_inst_t inst;
- #define APP_USBD_MSC_INST_CONFIG(p_devs, \
- devs_cnt, \
- p_buff, \
- block_size, \
- block_cnt, \
- user_event_handler) \
- .inst = { \
- .pp_block_devs = (p_devs), \
- .block_devs_count = (devs_cnt), \
- .p_block_buff = (p_buff), \
- .block_buff_size = (block_size), \
- .block_buff_count = (block_cnt), \
- .user_ev_handler = (user_event_handler), \
- .subclass = APP_USBD_MSC_SUBCLASS_TRANSPARENT, \
- .protocol = APP_USBD_MSC_PROTOCOL_BULK, \
- }
- #define APP_USBD_MSC_DATA_SPECIFIC_DEC app_usbd_msc_ctx_t ctx;
- #define APP_USBD_MSC_DSC_CONFIG(interface_number, ...) { \
- APP_USBD_MSC_INTERFACE_DSC(interface_number, \
- APP_USBD_MSC_SUBCLASS_TRANSPARENT, \
- APP_USBD_MSC_PROTOCOL_BULK) \
- APP_USBD_MSC_EP_DSC(GET_VA_ARG_1(__VA_ARGS__), \
- GET_VA_ARG_1(GET_ARGS_AFTER_1(__VA_ARGS__)), \
- 64) \
- }
- extern const app_usbd_class_methods_t app_usbd_msc_class_methods;
- #define APP_USBD_MSC_GLOBAL_DEF_INTERNAL(instance_name, \
- interface_number, \
- user_ev_handler, \
- endpoint_list, \
- blockdev_list, \
- workbuffer_size) \
- static const nrf_block_dev_t * APP_USBD_MSC_BLKDEVS_NAME(instance_name)[] = \
- { BRACKET_EXTRACT(blockdev_list) }; \
- static uint32_t APP_USBD_MSC_BUFFER_NAME(instance_name) \
- [APP_USBD_MSC_BUFFER_CNT * CEIL_DIV(workbuffer_size, sizeof(uint32_t))]; \
- APP_USBD_CLASS_INST_GLOBAL_DEF( \
- instance_name, \
- app_usbd_msc, \
- &app_usbd_msc_class_methods, \
- APP_USBD_MSC_CONFIG(interface_number, endpoint_list), \
- (APP_USBD_MSC_INST_CONFIG(APP_USBD_MSC_BLKDEVS_NAME(instance_name), \
- ARRAY_SIZE(APP_USBD_MSC_BLKDEVS_NAME(instance_name)), \
- APP_USBD_MSC_BUFFER_NAME (instance_name), \
- sizeof(APP_USBD_MSC_BUFFER_NAME(instance_name)) \
- / APP_USBD_MSC_BUFFER_CNT, \
- APP_USBD_MSC_BUFFER_CNT, \
- user_ev_handler)) \
- )
- #ifdef __cplusplus
- }
- #endif
- #endif
|