usbd_fs.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (c) 2025, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <nuttx/fs/fs.h>
  7. #include "usbd_core.h"
  8. #include "usbd_msc.h"
  9. #ifndef CONFIG_USBDEV_MSC_THREAD
  10. #error "CONFIG_USBDEV_MSC_THREAD must be enabled"
  11. #endif
  12. static FAR struct inode *inode;
  13. static struct geometry geo;
  14. static char devpath[32];
  15. void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size)
  16. {
  17. int ret;
  18. /* Open the block driver */
  19. ret = open_blockdriver(devpath, 0, &inode);
  20. if (ret < 0) {
  21. *block_num = 0;
  22. *block_size = 0;
  23. return;
  24. }
  25. /* Get the drive geometry */
  26. if (!inode || !inode->u.i_bops || !inode->u.i_bops->geometry ||
  27. inode->u.i_bops->geometry(inode, &geo) != OK || !geo.geo_available) {
  28. *block_num = 0;
  29. *block_size = 0;
  30. return;
  31. }
  32. *block_num = geo.geo_nsectors;
  33. *block_size = geo.geo_sectorsize;
  34. USB_LOG_INFO("block_num: %ld, block_size: %ld\n", *block_num, *block_size);
  35. }
  36. int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length)
  37. {
  38. if (inode->u.i_bops->read) {
  39. inode->u.i_bops->read(inode, buffer, sector, length / geo.geo_sectorsize);
  40. }
  41. return 0;
  42. }
  43. int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length)
  44. {
  45. if (inode->u.i_bops->write) {
  46. inode->u.i_bops->write(inode, buffer, sector, length / geo.geo_sectorsize);
  47. }
  48. return 0;
  49. }
  50. static struct usbd_interface intf0;
  51. void usbd_msc_init(uint8_t busid, char *path, uint8_t outep, uint8_t inep)
  52. {
  53. memset(devpath, 0, sizeof(devpath));
  54. strncpy(devpath, path, sizeof(devpath) - 1);
  55. usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, outep, inep));
  56. }