mass_storage.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031
  1. /*
  2. * The Mass Storage protocol state machine in this file is based on mbed's
  3. * implementation. We augment it by adding Zephyr's USB transport and Storage
  4. * APIs.
  5. *
  6. * Copyright (c) 2010-2011 mbed.org, MIT License
  7. * Copyright (c) 2016 Intel Corporation.
  8. *
  9. * Permission is hereby granted, free of charge, to any person obtaining a copy
  10. * of this software and associated documentation files (the "Software"), to deal
  11. * in the Software without restriction, including without limitation the rights
  12. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. * copies of the Software, and to permit persons to whom the Software is
  14. * furnished to do so, subject to the following conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be included in
  17. * all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  25. * SOFTWARE.
  26. */
  27. /**
  28. * @file
  29. * @brief Mass Storage device class driver
  30. *
  31. * Driver for USB Mass Storage device class driver
  32. */
  33. #include <init.h>
  34. #include <errno.h>
  35. #include <string.h>
  36. #include <sys/byteorder.h>
  37. #include <usb/class/usb_msc.h>
  38. #include <usb/usb_device.h>
  39. #include <usb/usb_common.h>
  40. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  41. #include <soc.h>
  42. #endif
  43. #include "mass_storage_descriptor.h"
  44. #define LOG_LEVEL 2
  45. #include <logging/log.h>
  46. LOG_MODULE_REGISTER(mass_storage);
  47. #include "diskio.h"
  48. /* max USB packet size */
  49. #if CONFIG_MASS_STORAGE_BULK_EP_MPS > USB_MAX_FS_BULK_MPS
  50. #define MAX_PACKET USB_MAX_FS_BULK_MPS /* Bulk MaxPakcetSize in full-speed */
  51. #else
  52. #define MAX_PACKET CONFIG_MASS_STORAGE_BULK_EP_MPS
  53. #endif
  54. /*
  55. * 1: USB will read all left data even if fail to write disk,
  56. * 0: We will just stall bulk-out endpoint and quit.
  57. */
  58. #define DISK_WRITE_ERROR_CONTINUE 1
  59. /*
  60. * 1: USB will read all data even if there is no medium.
  61. * 0: We will stall bulk-out endpoint.
  62. */
  63. #define MSC_WRITE_NO_MEDIUM_CONTINUE 1
  64. #define BLOCK_SIZE 512
  65. #define DISK_THREAD_STACK_SZ CONFIG_MASS_STORAGE_STACK_SIZE
  66. #define DISK_THREAD_PRIO CONFIG_MASS_STORAGE_PRIORITY
  67. #define THREAD_OP_READ_QUEUED 1
  68. #define THREAD_OP_READ_DONE 2
  69. #define THREAD_OP_WRITE_QUEUED 3
  70. #define THREAD_OP_WRITE_DONE 4
  71. /* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */
  72. #define SS_NO_SENSE 0
  73. #define SS_COMMUNICATION_FAILURE 0x040800
  74. #define SS_INVALID_COMMAND 0x052000
  75. #define SS_INVALID_FIELD_IN_CDB 0x052400
  76. #define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x052100
  77. #define SS_LOGICAL_UNIT_NOT_SUPPORTED 0x052500
  78. #define SS_MEDIUM_NOT_PRESENT 0x023a00
  79. #define SS_MEDIUM_REMOVAL_PREVENTED 0x055302
  80. #define SS_NOT_READY_TO_READY_TRANSITION 0x062800
  81. #define SS_RESET_OCCURRED 0x062900
  82. #define SS_SAVING_PARAMETERS_NOT_SUPPORTED 0x053900
  83. #define SS_UNRECOVERED_READ_ERROR 0x031100
  84. #define SS_WRITE_ERROR 0x030c02
  85. #define SS_WRITE_PROTECTED 0x072700
  86. #define SS_DATA_CRC_ERROR 0x0b4701
  87. #define SK(x) ((u8_t) ((x) >> 16)) /* Sense Key byte, etc. */
  88. #define ASC(x) ((u8_t) ((x) >> 8)) /* AddSenseCode*/
  89. #define ASCQ(x) ((u8_t) (x)) /* AddSnsCodeQlfr */
  90. static u32_t msc_sense_data;
  91. #define MSC_UNKNOWN 0
  92. /* MSC_RUNNING and MSC_ABORTED are mutual exceptional */
  93. #define MSC_RUNNING BIT(0)
  94. #define MSC_ABORTED BIT(1)
  95. #define MSC_EJECTED BIT(2)
  96. #define MSC_PREVENT_MEDIA_REMOVAL BIT(3)
  97. static u8_t msc_state;
  98. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  99. static u8_t switch_to_adfu;
  100. static struct k_work switch_to_adfu_work;
  101. #endif
  102. static struct k_work disk_sync_work;
  103. static u8_t disk_sync_pdrv;
  104. #define SWITCH_TO_STUB_START 1
  105. #define SWITCH_TO_STUB_DONE 2
  106. static u8_t switch_to_stub;
  107. static inline bool msc_state_unknown(void)
  108. {
  109. return msc_state == MSC_UNKNOWN;
  110. }
  111. static inline bool msc_state_running(void)
  112. {
  113. return msc_state & MSC_RUNNING;
  114. }
  115. static inline bool msc_state_aborted(void)
  116. {
  117. return msc_state & MSC_ABORTED;
  118. }
  119. static inline bool msc_state_ejected(void)
  120. {
  121. return msc_state & MSC_EJECTED;
  122. }
  123. //static inline bool msc_state_prevent_media_removal(void)
  124. //{
  125. // return msc_state & MSC_PREVENT_MEDIA_REMOVAL;
  126. //}
  127. static inline void msc_state_set_unknown(void)
  128. {
  129. msc_state = MSC_UNKNOWN;
  130. }
  131. static inline void msc_state_set_running(void)
  132. {
  133. msc_state |= MSC_RUNNING;
  134. }
  135. static inline void msc_state_clear_running(void)
  136. {
  137. msc_state &= ~MSC_RUNNING;
  138. }
  139. static inline void msc_state_set_aborted(void)
  140. {
  141. msc_state |= MSC_ABORTED;
  142. }
  143. static inline void msc_state_set_ejected(void)
  144. {
  145. msc_state |= MSC_EJECTED;
  146. }
  147. __unused static inline void msc_state_set_prevent_media_removal(void)
  148. {
  149. msc_state |= MSC_PREVENT_MEDIA_REMOVAL;
  150. }
  151. __unused static inline void msc_state_clear_prevent_media_removal(void)
  152. {
  153. msc_state &= ~MSC_PREVENT_MEDIA_REMOVAL;
  154. }
  155. static usb_msc_eject_callback eject_cb;
  156. static volatile int thread_op;
  157. #ifndef CONFIG_USB_MASS_STORAGE_SHARE_THREAD
  158. static K_THREAD_STACK_DEFINE(mass_thread_stack, DISK_THREAD_STACK_SZ);
  159. static struct k_thread mass_thread_data;
  160. #endif
  161. static struct k_sem disk_wait_sem;
  162. static struct k_sem usb_wait_sem;
  163. static volatile u32_t defered_wr_sz;
  164. static volatile u32_t defered_rd_off;
  165. static u8_t *page;
  166. static u8_t *page2;
  167. static u32_t page_size;
  168. #define USB_RW_TIMEOUT K_MSEC(5000)
  169. static u8_t usb_rw_working;
  170. /* Initialized during mass_storage_init() */
  171. static u64_t memory_size;
  172. static u32_t block_count;
  173. static u8_t disk_pdrv = CONFIG_MASS_STORAGE_DISK_PDRV;
  174. #define MSD_OUT_EP_IDX 0
  175. #define MSD_IN_EP_IDX 1
  176. #ifdef CONFIG_SPINAND_ACTS
  177. #include <drivers/flash.h>
  178. #include <partition/partition.h>
  179. static const struct device *flash_dev;
  180. //#define UDISK_OFFSET 0x4a00000
  181. static uint32_t get_udisk_offset(void)
  182. {
  183. const struct partition_entry *parti;
  184. #ifdef CONFIG_BOARD_NANDBOOT
  185. parti = partition_get_stf_part(STORAGE_ID_BOOTNAND, PARTITION_FILE_ID_UDISK);
  186. #else
  187. parti = partition_get_stf_part(STORAGE_ID_NAND, PARTITION_FILE_ID_UDISK);
  188. #endif
  189. if (parti != NULL) {
  190. LOG_INF("udisk offset=0x%x secotr\n", parti->offset);
  191. return (parti->offset);
  192. }
  193. LOG_ERR("get udisk offset err!\n");
  194. return 0;
  195. }
  196. #endif
  197. static void mass_storage_process_suspend(void)
  198. {
  199. /* stop */
  200. msc_state_set_ejected();
  201. disk_sync_pdrv = disk_pdrv;
  202. /* flush memory data to medium*/
  203. k_work_submit(&disk_sync_work);
  204. disk_pdrv = MSC_DISK_NO_MEDIA;
  205. if (eject_cb) {
  206. eject_cb();
  207. }
  208. }
  209. static void mass_storage_bulk_out(u8_t ep,
  210. enum usb_dc_ep_cb_status_code ep_status);
  211. static void mass_storage_bulk_in(u8_t ep,
  212. enum usb_dc_ep_cb_status_code ep_status);
  213. /* Describe EndPoints configuration */
  214. static const struct usb_ep_cfg_data mass_ep_data[] = {
  215. {
  216. .ep_cb = mass_storage_bulk_out,
  217. .ep_addr = CONFIG_MASS_STORAGE_OUT_EP_ADDR
  218. },
  219. {
  220. .ep_cb = mass_storage_bulk_in,
  221. .ep_addr = CONFIG_MASS_STORAGE_IN_EP_ADDR
  222. }
  223. };
  224. /* CSW Status */
  225. enum Status {
  226. CSW_PASSED,
  227. CSW_FAILED,
  228. CSW_ERROR,
  229. };
  230. /* MSC Bulk-only Stage */
  231. enum Stage {
  232. READ_CBW, /* wait a CBW */
  233. ERROR, /* error */
  234. PROCESS_CBW, /* process a CBW request */
  235. SEND_CSW, /* send a CSW */
  236. WAIT_CSW /* wait that a CSW has been effectively sent */
  237. };
  238. /* state of the bulk-only state machine */
  239. static enum Stage stage;
  240. /*current CBW*/
  241. static struct CBW cbw __aligned(4);
  242. /*CSW which will be sent*/
  243. static struct CSW csw;
  244. /*addr where will be read or written data*/
  245. static u64_t addr;
  246. /* max USB packet size */
  247. static u32_t max_packet = MAX_PACKET;
  248. /*length of a reading or writing*/
  249. static u32_t length;
  250. static u8_t max_lun_count;
  251. /*memory OK (after a memoryVerify)*/
  252. static bool memOK;
  253. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  254. static u8_t *usb_mass_transfer_buf;
  255. static u32_t usb_mass_transfer_len;
  256. static struct k_delayed_work usb_mass_transfer_work;
  257. static inline int usb_mass_transfer(u8_t *data, u32_t len)
  258. {
  259. usb_mass_transfer_buf = data;
  260. usb_mass_transfer_len = len;
  261. k_delayed_work_submit(&usb_mass_transfer_work, K_NO_WAIT);
  262. return 0;
  263. }
  264. static void usb_mass_transfer_handler(struct k_work *work)
  265. {
  266. if (thread_op == THREAD_OP_READ_QUEUED) {
  267. usb_dc_ep_write_pending(CONFIG_MASS_STORAGE_IN_EP_ADDR,
  268. usb_mass_transfer_buf, usb_mass_transfer_len, NULL);
  269. } else if (thread_op == THREAD_OP_WRITE_QUEUED) {
  270. usb_dc_ep_read_pending(CONFIG_MASS_STORAGE_OUT_EP_ADDR,
  271. usb_mass_transfer_buf, usb_mass_transfer_len, NULL);
  272. }
  273. }
  274. #endif /* CONFIG_USB_AOTG_DC_MULTI_FIFO */
  275. static inline int usb_mass_write(u8_t *data, u32_t len)
  276. {
  277. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  278. return usb_dc_ep_write_pending(CONFIG_MASS_STORAGE_IN_EP_ADDR, data,
  279. len, NULL);
  280. #else
  281. return usb_write(CONFIG_MASS_STORAGE_IN_EP_ADDR, data, len, NULL);
  282. #endif
  283. }
  284. static inline int usb_mass_read(u8_t *data, u32_t len)
  285. {
  286. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  287. return usb_dc_ep_read_pending(CONFIG_MASS_STORAGE_OUT_EP_ADDR, data,
  288. len, NULL);
  289. #else
  290. return usb_read_async(CONFIG_MASS_STORAGE_OUT_EP_ADDR, data, len, NULL);
  291. #endif
  292. }
  293. static void msd_state_machine_reset(void)
  294. {
  295. stage = READ_CBW;
  296. }
  297. static void msd_init(void)
  298. {
  299. memset((void *)&cbw, 0, sizeof(struct CBW));
  300. memset((void *)&csw, 0, sizeof(struct CSW));
  301. addr = 0;
  302. length = 0;
  303. defered_wr_sz = 0;
  304. defered_rd_off = 0;
  305. }
  306. static bool sendCSW(void)
  307. {
  308. csw.Signature = CSW_Signature;
  309. stage = WAIT_CSW;
  310. if (usb_mass_write((u8_t *)&csw, sizeof(struct CSW)) != 0) {
  311. LOG_ERR("usb write failure");
  312. return false;
  313. }
  314. return true;
  315. }
  316. static bool write(u8_t *buf, u16_t size)
  317. {
  318. if (size >= cbw.DataLength) {
  319. size = cbw.DataLength;
  320. }
  321. /* updating the State Machine , so that we send CSW when this
  322. * transfer is complete, ie when we get a bulk in callback
  323. */
  324. stage = SEND_CSW;
  325. csw.DataResidue -= size;
  326. if (usb_mass_write(buf, size)) {
  327. LOG_ERR("USB write failed");
  328. return false;
  329. }
  330. return true;
  331. }
  332. /**
  333. * @brief Handler called for Class requests not handled by the USB stack.
  334. *
  335. * @param pSetup Information about the request to execute.
  336. * @param len Size of the buffer.
  337. * @param data Buffer containing the request result.
  338. *
  339. * @return 0 on success, negative errno code on fail.
  340. */
  341. static int mass_storage_class_handle_req(struct usb_setup_packet *pSetup,
  342. s32_t *len, u8_t **data)
  343. {
  344. switch (pSetup->bRequest) {
  345. case MSC_REQUEST_RESET:
  346. LOG_DBG("MSC_REQUEST_RESET");
  347. if (sys_le16_to_cpu(pSetup->wLength)) {
  348. LOG_WRN("Invalid length");
  349. return -EINVAL;
  350. }
  351. msd_state_machine_reset();
  352. usb_mass_read((u8_t *)&cbw, sizeof(cbw));
  353. break;
  354. case MSC_REQUEST_GET_MAX_LUN:
  355. LOG_DBG("MSC_REQUEST_GET_MAX_LUN");
  356. if (sys_le16_to_cpu(pSetup->wLength) != 1) {
  357. LOG_WRN("Invalid length");
  358. return -EINVAL;
  359. }
  360. max_lun_count = 0;
  361. *data = (u8_t *)(&max_lun_count);
  362. *len = 1;
  363. break;
  364. default:
  365. LOG_WRN("Unknown request 0x%x, value 0x%x",
  366. pSetup->bRequest, pSetup->wValue);
  367. return -EINVAL;
  368. }
  369. return 0;
  370. }
  371. static void testUnitReady(void)
  372. {
  373. if (cbw.DataLength != 0) {
  374. if ((cbw.Flags & 0x80) != 0) {
  375. LOG_WRN("Stall IN endpoint");
  376. usb_ep_set_stall(mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  377. } else {
  378. LOG_WRN("Stall OUT endpoint");
  379. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  380. }
  381. }
  382. if ((disk_pdrv == MSC_DISK_NO_LUN) ||
  383. (disk_pdrv == MSC_DISK_NO_MEDIA)) {
  384. csw.Status = CSW_FAILED;
  385. } else {
  386. csw.Status = CSW_PASSED;
  387. }
  388. sendCSW();
  389. }
  390. static bool requestSense(void)
  391. {
  392. u8_t request_sense[] = {
  393. 0x70,
  394. 0x00,
  395. 0x05, /* Sense Key: illegal request */
  396. 0x00,
  397. 0x00,
  398. 0x00,
  399. 0x00,
  400. 0x0A,
  401. 0x00,
  402. 0x00,
  403. 0x00,
  404. 0x00,
  405. 0x30,
  406. 0x01,
  407. 0x00,
  408. 0x00,
  409. 0x00,
  410. 0x00,
  411. };
  412. if (msc_sense_data == SS_NO_SENSE) {
  413. if (disk_pdrv == MSC_DISK_NO_LUN) {
  414. msc_sense_data = SS_LOGICAL_UNIT_NOT_SUPPORTED;
  415. } else if (disk_pdrv == MSC_DISK_NO_MEDIA) {
  416. msc_sense_data = SS_MEDIUM_NOT_PRESENT;
  417. }
  418. }
  419. if (msc_sense_data) {
  420. request_sense[2] = SK(msc_sense_data);
  421. request_sense[12] = ASC(msc_sense_data);
  422. request_sense[13] = ASCQ(msc_sense_data);
  423. }
  424. msc_sense_data = SS_NO_SENSE;
  425. csw.Status = CSW_PASSED;
  426. return write(request_sense, sizeof(request_sense));
  427. }
  428. static bool inquiryRequest(void)
  429. {
  430. /*
  431. * inquiry[2]: ANSI SCSI level 2
  432. * inquiry[3]: SCSI-2 INQUIRY data format
  433. */
  434. u8_t inquiry[] = { 0x00, 0x80, 0x02, 0x02,
  435. 36 - 4, 0x00, 0x00, 0x00,
  436. 'Z', 'E', 'P', 'H', 'Y', 'R', ' ', ' ',
  437. 'Z', 'E', 'P', 'H', 'Y', 'R', ' ', 'U', 'S', 'B', ' ',
  438. 'D', 'I', 'S', 'K', ' ',
  439. '0', '.', '0', '1',
  440. };
  441. csw.Status = CSW_PASSED;
  442. return write(inquiry, sizeof(inquiry));
  443. }
  444. static bool modeSense6(void)
  445. {
  446. u8_t sense6[] = { 0x03, 0x00, 0x00, 0x00 };
  447. #ifdef CONFIG_MASS_STORAGE_WP
  448. sense6[2] = 0x80;
  449. #endif
  450. csw.Status = CSW_PASSED;
  451. return write(sense6, sizeof(sense6));
  452. }
  453. static bool modeSense10(void)
  454. {
  455. u8_t sense10[] = { 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  456. #ifdef CONFIG_MASS_STORAGE_WP
  457. sense10[3] = 0x80;
  458. #endif
  459. csw.Status = CSW_PASSED;
  460. return write(sense10, sizeof(sense10));
  461. }
  462. static bool readFormatCapacity(void)
  463. {
  464. u8_t capacity[] = { 0x00, 0x00, 0x00, 0x08,
  465. (u8_t)((block_count >> 24) & 0xff),
  466. (u8_t)((block_count >> 16) & 0xff),
  467. (u8_t)((block_count >> 8) & 0xff),
  468. (u8_t)((block_count >> 0) & 0xff),
  469. 0x02,
  470. (u8_t)((BLOCK_SIZE >> 16) & 0xff),
  471. (u8_t)((BLOCK_SIZE >> 8) & 0xff),
  472. (u8_t)((BLOCK_SIZE >> 0) & 0xff),
  473. };
  474. csw.Status = CSW_PASSED;
  475. return write(capacity, sizeof(capacity));
  476. }
  477. static bool readCapacity(void)
  478. {
  479. u8_t capacity[] = {
  480. (u8_t)(((block_count - 1) >> 24) & 0xff),
  481. (u8_t)(((block_count - 1) >> 16) & 0xff),
  482. (u8_t)(((block_count - 1) >> 8) & 0xff),
  483. (u8_t)(((block_count - 1) >> 0) & 0xff),
  484. (u8_t)((BLOCK_SIZE >> 24) & 0xff),
  485. (u8_t)((BLOCK_SIZE >> 16) & 0xff),
  486. (u8_t)((BLOCK_SIZE >> 8) & 0xff),
  487. (u8_t)((BLOCK_SIZE >> 0) & 0xff),
  488. };
  489. csw.Status = CSW_PASSED;
  490. return write(capacity, sizeof(capacity));
  491. }
  492. static bool do_cmd_inquiry_adfu(void)
  493. {
  494. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  495. u8_t data[11];
  496. stage = SEND_CSW;
  497. csw.DataResidue = 0;
  498. csw.Status = CSW_PASSED;
  499. memcpy(data, "ACTIONSUSBD", sizeof(data));
  500. if (usb_mass_write(data, sizeof(data))) {
  501. LOG_ERR("USB write failed");
  502. return false;
  503. }
  504. return true;
  505. #else
  506. stage = SEND_CSW;
  507. csw.DataResidue = 0;
  508. csw.Status = CSW_FAILED;
  509. /* send 0-length packet */
  510. if (usb_mass_write(NULL, 0)) {
  511. LOG_ERR("USB write failed");
  512. return false;
  513. }
  514. return true;
  515. #endif
  516. }
  517. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  518. static bool do_cmd_switch_to_adfu(void)
  519. {
  520. u8_t data[2] = { 0xff, 0x55 };
  521. stage = SEND_CSW;
  522. switch_to_adfu = 1;
  523. csw.DataResidue = 0;
  524. csw.Status = CSW_PASSED;
  525. /* send 0-length packet */
  526. if (usb_mass_write(data, sizeof(data))) {
  527. LOG_ERR("USB write failed");
  528. return false;
  529. }
  530. return true;
  531. }
  532. #endif
  533. static bool do_cmd_adfu_misc(void)
  534. {
  535. LOG_DBG("0x%x", cbw.CB[1]);
  536. switch (cbw.CB[1]) {
  537. case ADFU_MISC_RESTART:
  538. break;
  539. case ADFU_MISC_SET_SERIAL_NUMBER:
  540. break;
  541. case ADFU_MISC_GET_SERIAL_NUMBER:
  542. break;
  543. case ADFU_MISC_SET_MISCINFO:
  544. break;
  545. case ADFU_MISC_GET_MISCINFO:
  546. break;
  547. case ADFU_MISC_GET_CHIPID:
  548. break;
  549. case ADFU_MISC_SWITCH_TO_STUB:
  550. if (cbw.CB[2] == 0x01) {
  551. switch_to_stub = SWITCH_TO_STUB_START;
  552. csw.Status = CSW_PASSED;
  553. return sendCSW();
  554. }
  555. break;
  556. default:
  557. break;
  558. }
  559. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  560. csw.Status = CSW_ERROR;
  561. sendCSW();
  562. return false;
  563. }
  564. #include <drivers/rtc.h>
  565. static void set_time_and_date(void)
  566. {
  567. u8_t *temp_buff = (u8_t *)&cbw;
  568. struct rtc_time time = {0};
  569. const struct device *rtc = NULL;
  570. #ifdef CONFIG_RTC_0_NAME
  571. rtc = device_get_binding(CONFIG_RTC_0_NAME);
  572. #endif
  573. time.tm_year = temp_buff[0] | (temp_buff[1]<<8);
  574. time.tm_mon = temp_buff[2];
  575. time.tm_mday = temp_buff[3];
  576. time.tm_hour = temp_buff[4];
  577. time.tm_min = temp_buff[5];
  578. time.tm_sec = temp_buff[6];
  579. time.tm_ms = 500;
  580. time.tm_year -= 1900; // years since 1900
  581. time.tm_mon --; // month 0~11
  582. if (rtc)
  583. rtc_set_time(rtc, &time);
  584. csw.Status = CSW_PASSED;
  585. sendCSW();
  586. return;
  587. }
  588. static __unused void thread_memory_read_done(void)
  589. {
  590. u32_t n;
  591. n = (length > max_packet) ? max_packet : length;
  592. if ((addr + n) > memory_size) {
  593. n = memory_size - addr;
  594. stage = ERROR;
  595. }
  596. addr += n;
  597. length -= n;
  598. defered_rd_off += n;
  599. csw.DataResidue -= n;
  600. if (!length || (stage != PROCESS_CBW)) {
  601. csw.Status = (stage == PROCESS_CBW) ? CSW_PASSED : CSW_FAILED;
  602. stage = (stage == PROCESS_CBW) ? SEND_CSW : stage;
  603. }
  604. thread_op = THREAD_OP_READ_DONE;
  605. if (usb_mass_write(page, n) != 0) {
  606. LOG_ERR("Failed to write EP 0x%x",
  607. mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  608. }
  609. }
  610. static __unused void memoryRead(void)
  611. {
  612. u32_t n, offset;
  613. n = (length > max_packet) ? max_packet : length;
  614. if ((addr + n) > memory_size) {
  615. n = memory_size - addr;
  616. stage = ERROR;
  617. }
  618. /* read data */
  619. if ((defered_rd_off == 0) || (defered_rd_off == page_size)) {
  620. thread_op = THREAD_OP_READ_QUEUED;
  621. LOG_DBG("Signal thread for %d", (u32_t)(addr/BLOCK_SIZE));
  622. k_sem_give(&disk_wait_sem);
  623. return;
  624. }
  625. addr += n;
  626. length -= n;
  627. csw.DataResidue -= n;
  628. offset = defered_rd_off;
  629. if (!length || (stage != PROCESS_CBW)) {
  630. csw.Status = (stage == PROCESS_CBW) ? CSW_PASSED : CSW_FAILED;
  631. stage = (stage == PROCESS_CBW) ? SEND_CSW : stage;
  632. }
  633. defered_rd_off += n;
  634. usb_mass_write(&page[offset], n);
  635. }
  636. static bool infoTransfer(void)
  637. {
  638. u64_t n = 0;
  639. /* Logical Block Address of First Block */
  640. n = (cbw.CB[2] << 24) | (cbw.CB[3] << 16) | (cbw.CB[4] << 8) |
  641. (cbw.CB[5] << 0);
  642. LOG_DBG("LBA (block) : 0x%x ", (u32_t)n);
  643. addr = n * BLOCK_SIZE;
  644. if (addr > memory_size) {
  645. LOG_WRN("lba: 0x%x", (u32_t)n);
  646. csw.Status = CSW_FAILED;
  647. sendCSW();
  648. return false;
  649. }
  650. /* Number of Blocks to transfer */
  651. switch (cbw.CB[0]) {
  652. case READ10:
  653. case WRITE10:
  654. case VERIFY10:
  655. n = (cbw.CB[7] << 8) | (cbw.CB[8] << 0);
  656. break;
  657. case READ12:
  658. case WRITE12:
  659. n = (cbw.CB[6] << 24) | (cbw.CB[7] << 16) |
  660. (cbw.CB[8] << 8) | (cbw.CB[9] << 0);
  661. break;
  662. }
  663. LOG_DBG("Size (block) : 0x%x ", (u32_t)n);
  664. length = n * BLOCK_SIZE;
  665. if ((addr + length) > memory_size) {
  666. LOG_WRN("lba: 0x%x, size: 0x%x", (u32_t)addr/BLOCK_SIZE,
  667. (u32_t)n);
  668. csw.Status = CSW_FAILED;
  669. sendCSW();
  670. return false;
  671. }
  672. if (!cbw.DataLength) { /* host requests no data*/
  673. LOG_WRN("Zero length in CBW");
  674. csw.Status = CSW_FAILED;
  675. sendCSW();
  676. return false;
  677. }
  678. if (cbw.DataLength != length) {
  679. if ((cbw.Flags & 0x80) != 0) {
  680. LOG_WRN("Stall IN endpoint");
  681. usb_ep_set_stall(mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  682. } else {
  683. LOG_WRN("Stall OUT endpoint");
  684. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  685. }
  686. csw.Status = CSW_FAILED;
  687. sendCSW();
  688. return false;
  689. }
  690. return true;
  691. }
  692. static void fail(void)
  693. {
  694. csw.Status = CSW_FAILED;
  695. sendCSW();
  696. }
  697. static void CBWDecode(u8_t *buf, u16_t size)
  698. {
  699. if (cbw.Signature != CBW_Signature) {
  700. LOG_ERR("CBW Signature Mismatch 0x%x", cbw.Signature);
  701. return;
  702. }
  703. csw.Tag = cbw.Tag;
  704. csw.DataResidue = cbw.DataLength;
  705. if ((cbw.CBLength < 1) || (cbw.CBLength > 16) || (cbw.LUN != 0)) {
  706. LOG_DBG("cbw.CBLength %d", cbw.CBLength);
  707. fail();
  708. } else {
  709. switch (cbw.CB[0]) {
  710. case TEST_UNIT_READY:
  711. case REQUEST_SENSE:
  712. case INQUIRY:
  713. case CMD_INQUIRY_ADFU:
  714. case CMD_SWITCH_TO_ADFU:
  715. case CMD_ADFU_MISC:
  716. case CMD_SET_TIME_AND_DATE:
  717. #if MSC_WRITE_NO_MEDIUM_CONTINUE
  718. case WRITE10:
  719. case WRITE12:
  720. #endif
  721. break;
  722. default:
  723. /* if no lun or no media */
  724. if ((disk_pdrv == MSC_DISK_NO_LUN) ||
  725. (disk_pdrv == MSC_DISK_NO_MEDIA)) {
  726. if ((cbw.Flags & 0x80) || (cbw.DataLength == 0)) {
  727. /* Halt bulk-in endpoint */
  728. usb_ep_set_stall(mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  729. } else {
  730. /* Halt bulk-out endpoint */
  731. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  732. usb_dc_ep_flush(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  733. }
  734. fail();
  735. return;
  736. }
  737. break;
  738. }
  739. switch (cbw.CB[0]) {
  740. case TEST_UNIT_READY:
  741. LOG_DBG(">> TUR");
  742. testUnitReady();
  743. break;
  744. case REQUEST_SENSE:
  745. LOG_DBG(">> REQ_SENSE");
  746. requestSense();
  747. break;
  748. case INQUIRY:
  749. LOG_DBG(">> INQ");
  750. inquiryRequest();
  751. break;
  752. case MODE_SENSE6:
  753. LOG_DBG(">> MODE_SENSE6");
  754. modeSense6();
  755. break;
  756. case MODE_SENSE10:
  757. LOG_DBG(">> MODE_SENSE10");
  758. modeSense10();
  759. break;
  760. case READ_FORMAT_CAPACITIES:
  761. LOG_DBG(">> READ_FORMAT_CAPACITY");
  762. readFormatCapacity();
  763. break;
  764. case READ_CAPACITY:
  765. LOG_DBG(">> READ_CAPACITY");
  766. readCapacity();
  767. break;
  768. case READ10:
  769. case READ12:
  770. LOG_DBG(">> READ");
  771. if (infoTransfer()) {
  772. if ((cbw.Flags & 0x80)) {
  773. stage = PROCESS_CBW;
  774. defered_rd_off = 0;
  775. thread_op = THREAD_OP_READ_QUEUED;
  776. k_sem_init(&usb_wait_sem, 0, 1);
  777. LOG_DBG("Signal thread for %d",
  778. (u32_t)(addr/BLOCK_SIZE));
  779. k_sem_give(&disk_wait_sem);
  780. } else {
  781. usb_ep_set_stall(
  782. mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  783. LOG_DBG("Stall OUT endpoint");
  784. csw.Status = CSW_ERROR;
  785. sendCSW();
  786. }
  787. }
  788. break;
  789. case WRITE10:
  790. case WRITE12:
  791. LOG_DBG(">> WRITE");
  792. if (infoTransfer()) {
  793. if (!(cbw.Flags & 0x80)) {
  794. stage = PROCESS_CBW;
  795. thread_op = THREAD_OP_WRITE_QUEUED; /* write_queued */
  796. k_sem_init(&usb_wait_sem, 0, 1);
  797. k_sem_give(&disk_wait_sem);
  798. } else {
  799. usb_ep_set_stall(
  800. mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  801. LOG_DBG("Stall IN endpoint");
  802. csw.Status = CSW_ERROR;
  803. sendCSW();
  804. }
  805. }
  806. break;
  807. #if 0
  808. case VERIFY10:
  809. LOG_DBG(">> VERIFY10");
  810. if (!(cbw.CB[1] & 0x02)) {
  811. csw.Status = CSW_PASSED;
  812. sendCSW();
  813. break;
  814. }
  815. if (infoTransfer()) {
  816. if (!(cbw.Flags & 0x80)) {
  817. stage = PROCESS_CBW;
  818. memOK = true;
  819. } else {
  820. usb_ep_set_stall(
  821. mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  822. LOG_WRN("Stall IN endpoint");
  823. csw.Status = CSW_ERROR;
  824. sendCSW();
  825. }
  826. }
  827. break;
  828. #endif
  829. case MEDIA_REMOVAL:
  830. LOG_DBG(">> MEDIA_REMOVAL");
  831. /*
  832. * FIXME: if prevent bit set, we are not allowed to
  833. * unload the media.
  834. */
  835. csw.Status = CSW_PASSED;
  836. sendCSW();
  837. break;
  838. case START_STOP_UNIT:
  839. LOG_DBG(">> START_STOP_UNIT");
  840. /* respond CSW first */
  841. csw.Status = CSW_PASSED;
  842. sendCSW();
  843. /* LOEJ: load eject bit */
  844. if (!(cbw.CB[4] & 0x02)) {
  845. break;
  846. }
  847. /* START: start bit */
  848. if (!(cbw.CB[4] & 0x01)) {
  849. if (eject_cb) {
  850. eject_cb();
  851. }
  852. msc_state_set_ejected();
  853. msc_sense_data = SS_MEDIUM_NOT_PRESENT;
  854. } else {
  855. if (!msc_state_running()) {
  856. msc_sense_data = SS_MEDIUM_NOT_PRESENT;
  857. }
  858. }
  859. break;
  860. case CMD_INQUIRY_ADFU:
  861. LOG_DBG(">> INQUIRY_ADFU");
  862. do_cmd_inquiry_adfu();
  863. break;
  864. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  865. case CMD_SWITCH_TO_ADFU:
  866. LOG_DBG(">> SWITCH_TO_ADFU");
  867. do_cmd_switch_to_adfu();
  868. break;
  869. #endif
  870. case CMD_ADFU_MISC:
  871. LOG_DBG(">> ADFU_MISC");
  872. do_cmd_adfu_misc();
  873. break;
  874. case CMD_SET_TIME_AND_DATE:
  875. LOG_DBG(">> SET_TIME_AND_DATE");
  876. usb_mass_read((u8_t *)&cbw, 7);
  877. stage = PROCESS_CBW;
  878. break;
  879. default:
  880. LOG_DBG(">> default CB[0] %x", cbw.CB[0]);
  881. fail();
  882. break;
  883. } /*switch(cbw.CB[0])*/
  884. } /* else */
  885. }
  886. static __unused void memoryVerify(u8_t *buf, u16_t size)
  887. {
  888. u32_t n;
  889. if ((addr + size) > memory_size) {
  890. size = memory_size - addr;
  891. stage = ERROR;
  892. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  893. LOG_WRN("Stall OUT endpoint");
  894. }
  895. /* beginning of a new block -> load a whole block in RAM */
  896. #ifdef CONFIG_SPINAND_ACTS
  897. u32_t offset = get_udisk_offset();
  898. if (!((addr+offset) % BLOCK_SIZE)) {
  899. LOG_DBG("Flash READ sector %d", (u32_t)((addr+offset)/BLOCK_SIZE));
  900. if (offset != 0) {
  901. if (flash_read(flash_dev, (addr+offset), page, 1<<9)) {
  902. LOG_ERR("---- Flash Read Error %d", (u32_t)((addr+offset)/BLOCK_SIZE));
  903. }
  904. }
  905. }
  906. #else
  907. if (!(addr % BLOCK_SIZE)) {
  908. LOG_DBG("Disk READ sector %d", (u32_t)(addr/BLOCK_SIZE));
  909. if (disk_read(disk_pdrv, page, addr/BLOCK_SIZE, 1)) {
  910. LOG_ERR("---- Disk Read Error %d", (u32_t)(addr/BLOCK_SIZE));
  911. }
  912. }
  913. #endif
  914. /* info are in RAM -> no need to re-read memory */
  915. for (n = 0; n < size; n++) {
  916. if (page[addr%BLOCK_SIZE + n] != buf[n]) {
  917. LOG_DBG("Mismatch sector %d offset %d",
  918. (u32_t)(addr/BLOCK_SIZE), (u32_t)n);
  919. memOK = false;
  920. break;
  921. }
  922. }
  923. addr += size;
  924. length -= size;
  925. csw.DataResidue -= size;
  926. if (!length || (stage != PROCESS_CBW)) {
  927. csw.Status = (memOK && (stage == PROCESS_CBW)) ?
  928. CSW_PASSED : CSW_FAILED;
  929. sendCSW();
  930. }
  931. }
  932. static __unused void memoryWrite(u8_t *buf, u16_t size)
  933. {
  934. if ((addr + size) > memory_size) {
  935. size = memory_size - addr;
  936. stage = ERROR;
  937. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  938. LOG_WRN("Stall OUT endpoint");
  939. }
  940. memcpy(page + defered_wr_sz, buf, size);
  941. length -= size;
  942. defered_wr_sz += size;
  943. csw.DataResidue -= size;
  944. /* if the array is filled, write it in memory */
  945. if ((defered_wr_sz == page_size) || (length == 0)) {
  946. if (!(disk_status(disk_pdrv) & STA_PROTECT)) {
  947. LOG_DBG("Disk WRITE Qd %d", (u32_t)(addr/BLOCK_SIZE));
  948. thread_op = THREAD_OP_WRITE_QUEUED; /* write_queued */
  949. k_sem_give(&disk_wait_sem);
  950. return;
  951. }
  952. }
  953. if ((!length) || (stage != PROCESS_CBW)) {
  954. csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
  955. sendCSW();
  956. }
  957. }
  958. static void mass_storage_bulk_out(u8_t ep,
  959. enum usb_dc_ep_cb_status_code ep_status)
  960. {
  961. ARG_UNUSED(ep_status);
  962. switch (stage) {
  963. /*the device has to decode the CBW received*/
  964. case READ_CBW:
  965. LOG_DBG("> BO - READ_CBW");
  966. CBWDecode((u8_t *)&cbw, sizeof(cbw));
  967. break;
  968. /*the device has to receive data from the host*/
  969. case PROCESS_CBW:
  970. switch (cbw.CB[0]) {
  971. case WRITE10:
  972. case WRITE12:
  973. LOG_DBG("> BO - PROC_CBW WR");
  974. usb_rw_working = 0;
  975. k_sem_give(&usb_wait_sem);
  976. break;
  977. case CMD_SET_TIME_AND_DATE:
  978. set_time_and_date();
  979. break;
  980. #if 0
  981. case VERIFY10:
  982. LOG_DBG("> BO - PROC_CBW VER");
  983. memoryVerify(bo_buf, bytes_read);
  984. break;
  985. #endif
  986. default:
  987. LOG_ERR("> BO - PROC_CBW default"
  988. "<<ERROR!!!>> 0x%x", cbw.CB[0]);
  989. break;
  990. }
  991. break;
  992. /*an error has occurred: stall endpoint and send CSW*/
  993. default:
  994. LOG_WRN("Stall OUT endpoint, stage: %d", stage);
  995. usb_ep_set_stall(ep);
  996. csw.Status = CSW_ERROR;
  997. sendCSW();
  998. break;
  999. }
  1000. }
  1001. static __unused void thread_memory_write_done(void)
  1002. {
  1003. addr += defered_wr_sz;
  1004. defered_wr_sz = 0;
  1005. thread_op = THREAD_OP_WRITE_DONE;
  1006. usb_ep_read_continue(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  1007. if ((!length) || (stage != PROCESS_CBW)) {
  1008. csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
  1009. sendCSW();
  1010. }
  1011. }
  1012. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  1013. static void switch_to_adfu_work_handler(struct k_work *work)
  1014. {
  1015. usb_mass_storage_exit();
  1016. sys_pm_reboot(REBOOT_TYPE_GOTO_ADFU);
  1017. LOG_INF("switch to adfu");
  1018. /* If no delay 1s, adfu will be a probability(about 1/10) of failure */
  1019. k_sleep(K_MSEC(1000));
  1020. }
  1021. #endif
  1022. /* flush memory data to storage medium */
  1023. static void disk_sync_work_handler(struct k_work *work)
  1024. {
  1025. if (disk_ioctl(disk_sync_pdrv, CTRL_SYNC, NULL)) {
  1026. LOG_WRN("MSC disk sync failed");
  1027. }
  1028. }
  1029. /**
  1030. * @brief EP Bulk IN handler, used to send data to the Host
  1031. *
  1032. * @param ep Endpoint address.
  1033. * @param ep_status Endpoint status code.
  1034. *
  1035. * @return N/A.
  1036. */
  1037. static void mass_storage_bulk_in(u8_t ep,
  1038. enum usb_dc_ep_cb_status_code ep_status)
  1039. {
  1040. ARG_UNUSED(ep_status);
  1041. ARG_UNUSED(ep);
  1042. switch (stage) {
  1043. /*the device has to send data to the host*/
  1044. case PROCESS_CBW:
  1045. switch (cbw.CB[0]) {
  1046. case READ10:
  1047. case READ12:
  1048. /* LOG_DBG("< BI - PROC_CBW READ"); */
  1049. usb_rw_working = 0;
  1050. k_sem_give(&usb_wait_sem);
  1051. break;
  1052. default:
  1053. LOG_ERR("< BI-PROC_CBW default <<ERROR!!>> 0x%x",
  1054. cbw.CB[0]);
  1055. break;
  1056. }
  1057. break;
  1058. /*the device has to send a CSW*/
  1059. case SEND_CSW:
  1060. LOG_DBG("< BI - SEND_CSW");
  1061. sendCSW();
  1062. break;
  1063. /*the host has received the CSW -> we wait a CBW*/
  1064. case WAIT_CSW:
  1065. LOG_DBG("< BI - WAIT_CSW");
  1066. stage = READ_CBW;
  1067. usb_mass_read((u8_t *)&cbw, sizeof(cbw));
  1068. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  1069. if (switch_to_adfu) {
  1070. k_work_submit(&switch_to_adfu_work);
  1071. }
  1072. #endif
  1073. if (switch_to_stub == SWITCH_TO_STUB_START) {
  1074. switch_to_stub = SWITCH_TO_STUB_DONE;
  1075. }
  1076. break;
  1077. /*an error has occurred*/
  1078. default:
  1079. LOG_WRN("Stall IN endpoint, stage: %d", stage);
  1080. usb_ep_set_stall(mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  1081. sendCSW();
  1082. break;
  1083. }
  1084. }
  1085. /**
  1086. * @brief Callback used to know the USB connection status
  1087. *
  1088. * @param status USB device status code.
  1089. *
  1090. * @return N/A.
  1091. */
  1092. static void mass_storage_status_cb(enum usb_dc_status_code status, u8_t *param)
  1093. {
  1094. ARG_UNUSED(param);
  1095. /* Check the USB status and do needed action if required */
  1096. switch (status) {
  1097. case USB_DC_ERROR:
  1098. LOG_DBG("USB device error");
  1099. break;
  1100. case USB_DC_RESET:
  1101. LOG_DBG("USB device reset detected");
  1102. msd_state_machine_reset();
  1103. msd_init();
  1104. break;
  1105. case USB_DC_CONNECTED:
  1106. LOG_DBG("USB device connected");
  1107. break;
  1108. case USB_DC_CONFIGURED:
  1109. LOG_DBG("USB device configured");
  1110. usb_mass_read((u8_t *)&cbw, sizeof(cbw));
  1111. break;
  1112. case USB_DC_DISCONNECTED:
  1113. LOG_DBG("USB device disconnected");
  1114. break;
  1115. case USB_DC_SUSPEND:
  1116. LOG_DBG("USB device supended");
  1117. mass_storage_process_suspend();
  1118. break;
  1119. case USB_DC_RESUME:
  1120. LOG_DBG("USB device resumed");
  1121. break;
  1122. case USB_DC_HIGHSPEED:
  1123. /* Update MaxPacketSize */
  1124. max_packet = USB_MAX_HS_BULK_MPS;
  1125. break;
  1126. case USB_DC_UNKNOWN:
  1127. default:
  1128. LOG_DBG("USB unknown state");
  1129. break;
  1130. }
  1131. }
  1132. /* Configuration of the Mass Storage Device send to the USB Driver */
  1133. static const struct usb_cfg_data mass_storage_config = {
  1134. .usb_device_description = NULL,
  1135. .cb_usb_status = mass_storage_status_cb,
  1136. .interface = {
  1137. .class_handler = mass_storage_class_handle_req,
  1138. .custom_handler = NULL,
  1139. },
  1140. .num_endpoints = ARRAY_SIZE(mass_ep_data),
  1141. .endpoint = mass_ep_data
  1142. };
  1143. /* retry to make sure CSW succeed */
  1144. static int handle_csw(void)
  1145. {
  1146. u8_t retry = 3;
  1147. do {
  1148. if (sendCSW()) {
  1149. goto done;
  1150. }
  1151. k_busy_wait(100);
  1152. LOG_WRN("retry");
  1153. } while (--retry);
  1154. /* fail */
  1155. usb_dc_ep_flush(mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  1156. csw.Status = CSW_FAILED;
  1157. LOG_ERR("failed");
  1158. sendCSW();
  1159. return -EIO;
  1160. done:
  1161. return 0;
  1162. }
  1163. void usb_mass_storage_thread(void *p1, void *p2, void *p3)
  1164. {
  1165. u32_t sectors, len, len_ping, len_pong, disk_left;
  1166. u8_t *page_disk, *page_usb;
  1167. u8_t skip_disk_write;
  1168. u8_t disk_state;
  1169. int ret;
  1170. ARG_UNUSED(p1);
  1171. ARG_UNUSED(p2);
  1172. ARG_UNUSED(p3);
  1173. while (msc_state_running()) {
  1174. restart:
  1175. k_sem_take(&disk_wait_sem, K_FOREVER);
  1176. if (!msc_state_running()) {
  1177. LOG_ERR("msc_state_NOT_running");
  1178. break;
  1179. }
  1180. LOG_DBG("thread_op %d\n", thread_op);
  1181. switch (thread_op) {
  1182. case THREAD_OP_READ_QUEUED:
  1183. usb_rw_working = 0;
  1184. page_disk = page;
  1185. while (length) {
  1186. if (length > page_size) {
  1187. len = page_size;
  1188. } else {
  1189. len = length;
  1190. }
  1191. if ((addr + len) > memory_size) {
  1192. len = memory_size - addr;
  1193. stage = ERROR;
  1194. }
  1195. sectors = len / BLOCK_SIZE;
  1196. LOG_DBG("read %d sectors", sectors);
  1197. #ifdef CONFIG_SPINAND_ACTS
  1198. u32_t offset = get_udisk_offset();
  1199. if (offset != 0) {
  1200. if (flash_read(flash_dev, (addr+offset), page_disk, sectors<<9)) {
  1201. if (disk_ioctl(disk_pdrv, DISK_HW_DETECT, &disk_state) ||
  1202. (disk_state != STA_DISK_OK)) {
  1203. disk_pdrv = MSC_DISK_NO_MEDIA;
  1204. }
  1205. msc_sense_data = SS_UNRECOVERED_READ_ERROR;
  1206. LOG_ERR("Flash Read Error 0x%x %d",
  1207. (u32_t)((addr+offset)/BLOCK_SIZE), sectors);
  1208. break;
  1209. }
  1210. }
  1211. #else
  1212. if (disk_read(disk_pdrv, page_disk, (addr/BLOCK_SIZE), sectors)) {
  1213. if (disk_ioctl(disk_pdrv, DISK_HW_DETECT, &disk_state) ||
  1214. (disk_state != STA_DISK_OK)) {
  1215. disk_pdrv = MSC_DISK_NO_MEDIA;
  1216. }
  1217. msc_sense_data = SS_UNRECOVERED_READ_ERROR;
  1218. LOG_ERR("Disk Read Error 0x%x %d",
  1219. (u32_t)(addr/BLOCK_SIZE), sectors);
  1220. break;
  1221. }
  1222. #endif
  1223. addr += len;
  1224. length -= len;
  1225. csw.DataResidue -= len;
  1226. while (usb_rw_working) {
  1227. ret = k_sem_take(&usb_wait_sem, USB_RW_TIMEOUT);
  1228. if (ret != 0) {
  1229. LOG_ERR("usb write %d", ret);
  1230. goto restart;
  1231. }
  1232. if (!msc_state_running()) {
  1233. goto exit;
  1234. }
  1235. }
  1236. usb_rw_working = 1;
  1237. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  1238. if (usb_mass_transfer(page_disk, len) != 0) {
  1239. LOG_ERR("Failed to write EP 0x%x",
  1240. mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  1241. }
  1242. #else
  1243. if (usb_write(mass_ep_data[MSD_IN_EP_IDX].ep_addr,
  1244. page_disk, len, NULL) != 0) {
  1245. LOG_ERR("Failed to write EP 0x%x",
  1246. mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  1247. }
  1248. #endif
  1249. if (page_disk == page) {
  1250. page_disk = page2;
  1251. } else {
  1252. page_disk = page;
  1253. }
  1254. if (stage == ERROR) {
  1255. break;
  1256. }
  1257. }
  1258. while (usb_rw_working) {
  1259. ret = k_sem_take(&usb_wait_sem, USB_RW_TIMEOUT);
  1260. if (ret != 0) {
  1261. LOG_ERR("usb write last %d", ret);
  1262. goto restart;
  1263. }
  1264. if (!msc_state_running()) {
  1265. goto exit;
  1266. }
  1267. }
  1268. /* stall unitl USB write done */
  1269. if (msc_sense_data) {
  1270. stage = ERROR;
  1271. usb_ep_set_stall(mass_ep_data[MSD_IN_EP_IDX].ep_addr);
  1272. }
  1273. thread_op = THREAD_OP_READ_DONE;
  1274. csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
  1275. handle_csw();
  1276. break;
  1277. case THREAD_OP_WRITE_QUEUED:
  1278. page_usb = page;
  1279. page_disk = page2;
  1280. disk_left = length;
  1281. skip_disk_write = 0;
  1282. LOG_DBG("length: %d, disk_left: %d",
  1283. length, disk_left);
  1284. if (length > page_size) {
  1285. len_ping = page_size;
  1286. } else {
  1287. len_ping = length;
  1288. }
  1289. length -= len_ping;
  1290. len_pong = 0; /* for compiler */
  1291. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  1292. usb_mass_transfer(page_usb, len_ping);
  1293. #else
  1294. usb_read_async(mass_ep_data[MSD_OUT_EP_IDX].ep_addr,
  1295. page_usb, len_ping, NULL);
  1296. #endif
  1297. ret = k_sem_take(&usb_wait_sem, USB_RW_TIMEOUT);
  1298. if (ret != 0) {
  1299. LOG_ERR("usb read first %d", ret);
  1300. goto restart;
  1301. }
  1302. if (!msc_state_running()) {
  1303. goto exit;
  1304. }
  1305. LOG_DBG("usb read ping");
  1306. while (1) {
  1307. while (usb_rw_working) {
  1308. ret = k_sem_take(&usb_wait_sem, USB_RW_TIMEOUT);
  1309. if (ret != 0) {
  1310. LOG_ERR("usb read %d", ret);
  1311. goto restart;
  1312. }
  1313. if (!msc_state_running()) {
  1314. goto exit;
  1315. }
  1316. }
  1317. if (length) {
  1318. usb_rw_working = 1;
  1319. if (length > page_size) {
  1320. len = page_size;
  1321. } else {
  1322. len = length;
  1323. }
  1324. length -= len;
  1325. if (page_usb == page) {
  1326. page_usb = page2;
  1327. len_pong = len;
  1328. LOG_DBG("usb read pong");
  1329. } else {
  1330. page_usb = page;
  1331. len_ping = len;
  1332. LOG_DBG("usb read ping");
  1333. }
  1334. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  1335. usb_mass_transfer(page_usb, len);
  1336. #else
  1337. usb_read_async(mass_ep_data[MSD_OUT_EP_IDX].ep_addr,
  1338. page_usb, len, NULL);
  1339. #endif
  1340. }
  1341. if (page_disk == page) {
  1342. page_disk = page2;
  1343. len = len_pong;
  1344. LOG_DBG("disk write pong");
  1345. } else {
  1346. page_disk = page;
  1347. len = len_ping;
  1348. LOG_DBG("disk write ping");
  1349. }
  1350. if ((addr + len) > memory_size) {
  1351. len = memory_size - addr;
  1352. stage = ERROR;
  1353. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  1354. LOG_WRN("Stall OUT endpoint");
  1355. }
  1356. sectors = len / BLOCK_SIZE;
  1357. LOG_DBG("write %d sectors\n", sectors);
  1358. #ifdef CONFIG_SPINAND_ACTS
  1359. u32_t offset = get_udisk_offset();
  1360. if (offset != 0) {
  1361. if ((skip_disk_write == 0) &&
  1362. flash_write(flash_dev, (addr+offset), page_disk, sectors<<9)) {
  1363. if (disk_ioctl(disk_pdrv, DISK_HW_DETECT, &disk_state) ||
  1364. (disk_state != STA_DISK_OK)) {
  1365. disk_pdrv = MSC_DISK_NO_MEDIA;
  1366. }
  1367. msc_sense_data = SS_WRITE_ERROR;
  1368. #if DISK_WRITE_ERROR_CONTINUE
  1369. skip_disk_write = 1;
  1370. #else
  1371. stage = ERROR;
  1372. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  1373. #endif
  1374. LOG_ERR("Flash Write Error 0x%x %d",
  1375. (u32_t)((addr+offset)/BLOCK_SIZE), sectors);
  1376. }
  1377. }
  1378. #else
  1379. if ((skip_disk_write == 0) &&
  1380. disk_write(disk_pdrv, page_disk, (addr/BLOCK_SIZE), sectors)) {
  1381. if (disk_ioctl(disk_pdrv, DISK_HW_DETECT, &disk_state) ||
  1382. (disk_state != STA_DISK_OK)) {
  1383. disk_pdrv = MSC_DISK_NO_MEDIA;
  1384. }
  1385. msc_sense_data = SS_WRITE_ERROR;
  1386. #if DISK_WRITE_ERROR_CONTINUE
  1387. skip_disk_write = 1;
  1388. #else
  1389. stage = ERROR;
  1390. usb_ep_set_stall(mass_ep_data[MSD_OUT_EP_IDX].ep_addr);
  1391. #endif
  1392. LOG_ERR("Disk Write Error 0x%x %d",
  1393. (u32_t)(addr/BLOCK_SIZE), sectors);
  1394. }
  1395. #endif
  1396. disk_left -= len;
  1397. addr += len;
  1398. csw.DataResidue -= len;
  1399. LOG_DBG("wrote %d, left %d", len, disk_left);
  1400. if ((!disk_left) || (stage != PROCESS_CBW)) {
  1401. #if DISK_WRITE_ERROR_CONTINUE
  1402. if (skip_disk_write) {
  1403. stage = ERROR;
  1404. }
  1405. #endif
  1406. thread_op = THREAD_OP_WRITE_DONE;
  1407. LOG_DBG("write done");
  1408. csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
  1409. sendCSW();
  1410. break;
  1411. }
  1412. }
  1413. break;
  1414. default:
  1415. LOG_ERR("thread_op %d", thread_op);
  1416. }
  1417. }
  1418. exit:
  1419. msc_state_set_aborted();
  1420. }
  1421. /**
  1422. * @brief Initialize USB mass storage setup
  1423. *
  1424. * This routine is called to reset the USB device controller chip to a
  1425. * quiescent state. Also it initializes the backing storage and initializes
  1426. * the mass storage protocol state.
  1427. *
  1428. * @param disk_no MSC_DISK_XXX.
  1429. *
  1430. * @return negative errno code on fatal failure, 0 otherwise
  1431. */
  1432. static int mass_storage_init(u8_t disk_no)
  1433. {
  1434. u32_t block_size = 0;
  1435. u64_t tmp;
  1436. int ret;
  1437. disk_pdrv = disk_no;
  1438. switch_to_stub = 0;
  1439. thread_op = 0;
  1440. msd_state_machine_reset();
  1441. msd_init();
  1442. #ifdef CONFIG_SPINAND_ACTS
  1443. flash_dev =
  1444. device_get_binding("spinand");
  1445. if (!flash_dev) {
  1446. LOG_ERR("spinand flash dev error\n");
  1447. goto error;
  1448. }
  1449. #endif
  1450. ret = disk_initialize(disk_no);
  1451. if (ret) {
  1452. LOG_ERR("no lun/media: %d", disk_no);
  1453. goto error;
  1454. }
  1455. ret = disk_ioctl(disk_no, GET_SECTOR_COUNT, &block_count);
  1456. if (ret) {
  1457. LOG_ERR("Unable to get sector count");
  1458. goto error;
  1459. }
  1460. ret = disk_ioctl(disk_no, GET_BLOCK_SIZE, &block_size);
  1461. if (ret) {
  1462. LOG_ERR("Unable to get block size");
  1463. goto error;
  1464. }
  1465. if (block_size != BLOCK_SIZE) {
  1466. LOG_ERR("block_size: %d", block_size);
  1467. goto error;
  1468. }
  1469. tmp = block_count;
  1470. LOG_WRN("Sect Count %d\n", block_count);
  1471. memory_size = tmp * BLOCK_SIZE;
  1472. LOG_WRN("Memory Size 0x%x%x\n", (u32_t)(memory_size >> 32),
  1473. (u32_t)(memory_size & 0xffffffff));
  1474. return 0;
  1475. error:
  1476. if (disk_no != MSC_DISK_NO_LUN) {
  1477. disk_pdrv = MSC_DISK_NO_MEDIA;
  1478. }
  1479. return -ENODEV;
  1480. }
  1481. /*
  1482. * API: whether USB mass storage is working (reading/writing)
  1483. */
  1484. bool usb_mass_storage_working(void)
  1485. {
  1486. if (!msc_state_running()) {
  1487. return false;
  1488. }
  1489. if ((thread_op == THREAD_OP_READ_QUEUED) ||
  1490. (thread_op == THREAD_OP_WRITE_QUEUED)) {
  1491. return true;
  1492. }
  1493. return false;
  1494. }
  1495. /*
  1496. * API: whether USB mass storage is reading
  1497. */
  1498. bool usb_mass_storage_reading(void)
  1499. {
  1500. if (!msc_state_running()) {
  1501. return false;
  1502. }
  1503. if (thread_op == THREAD_OP_READ_QUEUED) {
  1504. return true;
  1505. }
  1506. return false;
  1507. }
  1508. /*
  1509. * API: whether USB mass storage is writing
  1510. */
  1511. bool usb_mass_storage_writing(void)
  1512. {
  1513. if (!msc_state_running()) {
  1514. return false;
  1515. }
  1516. if (thread_op == THREAD_OP_WRITE_QUEUED) {
  1517. return true;
  1518. }
  1519. return false;
  1520. }
  1521. /*
  1522. * API: add lun/disk for USB mass storage
  1523. */
  1524. int usb_mass_storage_add_lun(u8_t disk_no)
  1525. {
  1526. /* make sure no lun exist */
  1527. if (disk_pdrv < MSC_DISK_NUM) {
  1528. LOG_ERR("%d exist", disk_pdrv);
  1529. return -EBUSY;
  1530. }
  1531. /* make sure new lun is valid */
  1532. if (disk_no >= MSC_DISK_NUM) {
  1533. LOG_ERR("%d invalid", disk_no);
  1534. return -EINVAL;
  1535. }
  1536. if (disk_pdrv == MSC_DISK_NO_MEDIA) {
  1537. msc_sense_data = SS_NOT_READY_TO_READY_TRANSITION;
  1538. } else if (disk_pdrv == MSC_DISK_NO_LUN) {
  1539. msc_sense_data = SS_NO_SENSE;
  1540. }
  1541. mass_storage_init(disk_no);
  1542. LOG_INF("%d, %d", disk_pdrv, disk_no);
  1543. return 0;
  1544. }
  1545. /*
  1546. * API: remove lun/disk for USB mass storage
  1547. */
  1548. int usb_mass_storage_remove_lun(void)
  1549. {
  1550. /* make sure current lun is valid */
  1551. if ((disk_pdrv == MSC_DISK_NO_LUN) ||
  1552. (disk_pdrv == MSC_DISK_NO_MEDIA)) {
  1553. LOG_WRN("already");
  1554. return -EALREADY;
  1555. }
  1556. disk_pdrv = MSC_DISK_NO_MEDIA;
  1557. LOG_INF("done");
  1558. return 0;
  1559. }
  1560. /*
  1561. * API: register disk eject callback for USB mass storage
  1562. */
  1563. void usb_mass_storage_register_eject_cb(usb_msc_eject_callback cb)
  1564. {
  1565. eject_cb = cb;
  1566. }
  1567. /*
  1568. * API: register disk for USB mass storage
  1569. */
  1570. void usb_mass_storage_register(u8_t disk_no)
  1571. {
  1572. /* make sure new lun is valid */
  1573. if (disk_no >= MSC_DISK_NUM) {
  1574. LOG_ERR("%d invalid", disk_no);
  1575. disk_pdrv = MSC_DISK_NO_LUN;
  1576. } else {
  1577. disk_pdrv = disk_no;
  1578. }
  1579. LOG_INF("%d", disk_pdrv);
  1580. }
  1581. /*
  1582. * API: initialize USB mass storage
  1583. */
  1584. int usb_mass_storage_init(struct device *dev, u8_t *buf, u32_t len)
  1585. {
  1586. int ret;
  1587. ARG_UNUSED(dev);
  1588. if (!buf || !len) {
  1589. LOG_ERR("param is null");
  1590. return ERROR;
  1591. }
  1592. if ((long)buf & 0x3) {
  1593. LOG_ERR("4-byte alignment required!");
  1594. return ERROR;
  1595. }
  1596. if (len % (BLOCK_SIZE * 2)) {
  1597. LOG_ERR("illegal buff len");
  1598. return ERROR;
  1599. }
  1600. page_size = len/2;
  1601. page = buf;
  1602. page2 = buf + page_size;
  1603. if (!msc_state_unknown()) {
  1604. LOG_ERR("state: %d", msc_state);
  1605. return 0;
  1606. }
  1607. msc_sense_data = SS_NO_SENSE;
  1608. /* for example: eject -> exit -> init */
  1609. if (disk_pdrv == MSC_DISK_NO_MEDIA) {
  1610. disk_pdrv = CONFIG_MASS_STORAGE_DISK_PDRV;
  1611. }
  1612. mass_storage_init(disk_pdrv);
  1613. /* Register string descriptor */
  1614. ret = usb_device_register_string_descriptor(MANUFACTURE_STR_DESC,
  1615. CONFIG_MASS_STORAGE_MANUFACTURER,
  1616. strlen(CONFIG_MASS_STORAGE_MANUFACTURER));
  1617. if (ret) {
  1618. return ret;
  1619. }
  1620. ret = usb_device_register_string_descriptor(PRODUCT_STR_DESC,
  1621. CONFIG_MASS_STORAGE_PRODUCT,
  1622. strlen(CONFIG_MASS_STORAGE_PRODUCT));
  1623. if (ret) {
  1624. return ret;
  1625. }
  1626. ret = usb_device_register_string_descriptor(DEV_SN_DESC,
  1627. CONFIG_MASS_STORAGE_SN,
  1628. strlen(CONFIG_MASS_STORAGE_SN));
  1629. if (ret) {
  1630. return ret;
  1631. }
  1632. /* Register device descriptor */
  1633. usb_device_register_descriptors(mass_storage_fs_descriptor,
  1634. mass_storage_hs_descriptor);
  1635. /* Initialize the USB driver with the right configuration */
  1636. ret = usb_set_config(&mass_storage_config);
  1637. if (ret < 0) {
  1638. LOG_ERR("Failed to config USB");
  1639. return ret;
  1640. }
  1641. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  1642. usb_dc_ep_set_multi_fifo(CONFIG_MASS_STORAGE_OUT_EP_ADDR);
  1643. usb_dc_ep_set_multi_fifo(CONFIG_MASS_STORAGE_IN_EP_ADDR);
  1644. #endif
  1645. /* Enable USB driver */
  1646. ret = usb_enable(&mass_storage_config);
  1647. if (ret < 0) {
  1648. LOG_ERR("Failed to enable USB");
  1649. return ret;
  1650. }
  1651. k_sem_init(&disk_wait_sem, 0, 1);
  1652. k_sem_init(&usb_wait_sem, 0, 1);
  1653. #ifdef CONFIG_MASS_STORAGE_SWITCH_TO_ADFU
  1654. k_work_init(&switch_to_adfu_work, switch_to_adfu_work_handler);
  1655. #endif
  1656. k_work_init(&disk_sync_work, disk_sync_work_handler);
  1657. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  1658. k_delayed_work_init(&usb_mass_transfer_work, usb_mass_transfer_handler);
  1659. #endif
  1660. msc_state_set_running();
  1661. #ifndef CONFIG_USB_MASS_STORAGE_SHARE_THREAD
  1662. /* Start a thread to offload disk ops */
  1663. k_thread_create(&mass_thread_data, mass_thread_stack,
  1664. DISK_THREAD_STACK_SZ,
  1665. usb_mass_storage_thread, NULL, NULL, NULL,
  1666. DISK_THREAD_PRIO, 0, K_NO_WAIT);
  1667. #endif
  1668. return 0;
  1669. }
  1670. /*
  1671. * API: deinitialize USB mass storage synchronously
  1672. */
  1673. int usb_mass_storage_exit(void)
  1674. {
  1675. int ret;
  1676. if (!msc_state_running()) {
  1677. LOG_ERR("state: %d", msc_state);
  1678. return 0;
  1679. }
  1680. LOG_INF("");
  1681. msc_state_clear_running();
  1682. k_sem_give(&disk_wait_sem);
  1683. k_sem_give(&usb_wait_sem);
  1684. #ifdef CONFIG_USB_AOTG_DC_MULTI_FIFO
  1685. usb_dc_ep_io_cancel();
  1686. k_delayed_work_cancel(&usb_mass_transfer_work);
  1687. #endif
  1688. /* wait for completion */
  1689. while (!msc_state_aborted()) {
  1690. k_sleep(K_MSEC(10));
  1691. }
  1692. disk_ioctl(disk_pdrv, CTRL_SYNC, NULL);
  1693. eject_cb = NULL; /* Disk may be changed */
  1694. msc_state_set_unknown();
  1695. page = NULL;
  1696. page2 = NULL;
  1697. ret = usb_disable();
  1698. if (ret) {
  1699. LOG_ERR("Failed to disable USB: %d", ret);
  1700. return ret;
  1701. }
  1702. usb_deconfig();
  1703. LOG_INF("done");
  1704. return 0;
  1705. }
  1706. /*
  1707. * API: whether USB mass storage is ejected
  1708. */
  1709. bool usb_mass_storage_ejected(void)
  1710. {
  1711. return msc_state_ejected();
  1712. }
  1713. /*
  1714. * API: whether USB mass storage is enabled
  1715. */
  1716. bool usb_mass_storage_enabled(void)
  1717. {
  1718. return msc_state_running();
  1719. }
  1720. /*
  1721. * API: whether USB mass storage is switched to stub
  1722. */
  1723. bool usb_mass_storage_stub_mode(void)
  1724. {
  1725. return msc_state_running() && (switch_to_stub == SWITCH_TO_STUB_DONE);
  1726. }
  1727. /*
  1728. * API: start USB mass storage after initializing
  1729. */
  1730. int __weak usb_mass_storage_start(void)
  1731. {
  1732. LOG_INF("weak");
  1733. return 0;
  1734. }