| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /*
- * Copyright : (C) 2022 Phytium Information Technology, Inc.
- * All Rights Reserved.
- *
- * This program is OPEN SOURCE software: you can redistribute it and/or modify it
- * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
- * either version 1.0 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the Phytium Public License for more details.
- *
- *
- * FilePath: fusb_msc.h
- * Date: 2022-02-11 13:33:09
- * LastEditTime: 2022-02-17 17:50:46
- * Description: This files is for definition of USB mass storage function
- *
- * Modify History:
- * Ver Who Date Changes
- * ----- ------ -------- --------------------------------------
- * 1.0 Zhugengyu 2022/2/7 init commit
- */
- #ifndef DRIVERS_USB_MSC_H
- #define DRIVERS_USB_MSC_H
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /***************************** Include Files *********************************/
- #include "fusb.h"
- /************************** Constant Definitions *****************************/
- /* Possible values for quirks field. */
- enum
- {
- /* Don't check for LUNs (force assumption that there's only one LUN). */
- FUSB_MSC_QUIRK_NO_LUNS = 1 << 0,
- /* Never do a BULK_ONLY reset, just continue. This means that the device
- cannot recover from phase errors and won't detach automatically for
- unrecoverable errors. Do not use unless you have to. */
- FUSB_MSC_QUIRK_NO_RESET = 1 << 1,
- };
- /* Possible values for ready field. */
- enum
- {
- FUSB_MSC_DETACHED = -1, /* Disk detached or out to lunch. */
- FUSB_MSC_NOT_READY = 0, /* Disk not ready yet -- empty card reader */
- FUSB_MSC_READY = 1, /* Disk ready to communicate. */
- };
- enum
- {
- FUSB_MSC_SUBCLASS_ATAPI_8020 = 0x2,
- FUSB_MSC_SUBCLASS_ATAPI_8070 = 0x5,
- FUSB_MSC_SUBCLASS_SCSI = 0x6
- };
- /* Protocols of MSC */
- enum
- {
- FUSB_MSC_PROTOCOL_BULK_ONLY = 0x50 /* Usb bulk-only transfer protocol */
- };
- typedef enum
- {
- FUSB_DIR_DATA_IN = 0x80, /* data from the device to the host */
- FUSB_DIR_DATA_OUT = 0 /* data from the host to the device */
- } FUsbMassStorageDirection;
- /**************************** Type Definitions *******************************/
- typedef struct
- {
- unsigned int blocksize;
- unsigned int numblocks;
- FUsbEndpoint *bulk_in;
- FUsbEndpoint *bulk_out;
- u8 quirks : 7;
- u8 usbdisk_created : 1;
- s8 ready;
- u8 lun;
- u8 num_luns;
- void *data; /* For use by consumers of libpayload. */
- } FUsbMassStorage;
- /************************** Variable Definitions *****************************/
- /***************** Macros (Inline Functions) Definitions *********************/
- #define MSC_INST(dev) ((FUsbMassStorage*)(dev)->data)
- /**
- * @name: FUsbMscGetCapcityMB
- * @msg: 获取USB大容量存储设备的容量,单位MB
- * @return {fsize_t} 容量,MB
- * @param {FUsbDev} *dev, USB大容量存储设备实例
- */
- static inline u32 FUsbMscGetCapcityMB(FUsbDev *dev)
- {
- FASSERT(dev);
- return (u32)(MSC_INST(dev)->numblocks > 1000000
- ? (MSC_INST(dev)->numblocks / 1024) * MSC_INST(dev)->blocksize / 1024
- : MSC_INST(dev)->numblocks * MSC_INST(dev)->blocksize / 1024 / 1024);
- }
- /**
- * @name: FUsbMscGetBlkSize
- * @msg: 获取USB大容量存储设备的块大小
- * @return {*} 块大小,字节数
- * @param {FUsbDev} *dev, USB大容量存储设备实例
- */
- static inline u32 FUsbMscGetBlkSize(FUsbDev *dev)
- {
- FASSERT(dev);
- return (u32)MSC_INST(dev)->blocksize;
- }
- /**
- * @name: FUsbMscGetBlkNum
- * @msg: 获取USB大容量存储设备块数目
- * @return {*} 块数目
- * @param {FUsbDev} *dev, USB大容量存储设备实例
- */
- static inline u32 FUsbMscGetBlkNum(FUsbDev *dev)
- {
- FASSERT(dev);
- return (u32)MSC_INST(dev)->numblocks;
- }
- /************************** Function Prototypes ******************************/
- /* 读写USB大容量存储设备,以512字节为一块 */
- int FUsbMscRwBlk512(FUsbDev *dev, int start, int n, FUsbMassStorageDirection dir, u8 *buf);
- /* USB大容量存储设备的初始化函数,由应用程序注册到FUSB框架中 */
- void FUsbMassStorageInit(FUsbDev *dev);
- /**
- * To be implemented by application. It's called by the USB stack
- * when a new USB storage device is found, so the client has the chance
- * to know about it.
- *
- * @param dev descriptor for the USB storage device
- */
- void __attribute__((weak)) FUsbDiskCreate(FUsbDev *dev);
- /**
- * To be implemented by application. It's called by the USB stack
- * when it finds out that a USB storage device is removed.
- *
- * @param dev descriptor for the USB storage device
- */
- void __attribute__((weak)) FUsbDiskRemove(FUsbDev *dev);
- #ifdef __cplusplus
- }
- #endif
- #endif
|