blk_device.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-08-19 lizhirui first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdef.h>
  12. #include <dfs.h>
  13. #include <dfs_fs.h>
  14. #include <dfs_file.h>
  15. #include <ext4.h>
  16. #include <ext4_debug.h>
  17. #include <blk_device.h>
  18. #include <stdint.h>
  19. static struct blk_device *blkdev;
  20. static rt_uint32_t disk_sector_size;
  21. static int blockdev_open(struct ext4_blockdev *bdev)
  22. {
  23. int r;
  24. uint32_t size;
  25. rt_device_t device = (rt_device_t)blkdev;
  26. struct rt_device_blk_geometry geometry;
  27. RT_ASSERT(device);
  28. r = rt_device_open((rt_device_t)blkdev, RT_DEVICE_OFLAG_RDWR);
  29. if (r != RT_EOK)
  30. {
  31. return r;
  32. }
  33. r = rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
  34. if (RT_EOK == r)
  35. {
  36. bdev->part_offset = 0;
  37. bdev->part_size = geometry.sector_count * geometry.bytes_per_sector;
  38. disk_sector_size = geometry.bytes_per_sector;
  39. bdev->bdif->ph_bcnt = bdev->part_size / bdev->bdif->ph_bsize;
  40. }
  41. return r;
  42. }
  43. static int blockdev_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id,
  44. uint32_t blk_cnt)
  45. {
  46. int result;
  47. rt_device_t device = (rt_device_t)blkdev;
  48. struct blk_device *blk = (struct blk_device *)device;
  49. RT_ASSERT(device);
  50. result = rt_device_read(device, blk_id * (bdev->bdif->ph_bsize / disk_sector_size),
  51. buf, blk_cnt * (bdev->bdif->ph_bsize / disk_sector_size));
  52. if ((blk_cnt * (bdev->bdif->ph_bsize / disk_sector_size)) == result)
  53. {
  54. result = 0;
  55. }
  56. else
  57. {
  58. result = -EIO;
  59. }
  60. return result;
  61. }
  62. static int blockdev_bwrite(struct ext4_blockdev *bdev, const void *buf,
  63. uint64_t blk_id, uint32_t blk_cnt)
  64. {
  65. int result;
  66. rt_device_t device = (rt_device_t)blkdev;
  67. RT_ASSERT(device);
  68. result = rt_device_write(device, blk_id * (bdev->bdif->ph_bsize / disk_sector_size),
  69. buf, blk_cnt * (bdev->bdif->ph_bsize / disk_sector_size));
  70. if ((blk_cnt * (bdev->bdif->ph_bsize / disk_sector_size)) == result)
  71. {
  72. result = 0;
  73. }
  74. else
  75. {
  76. result = -EIO;
  77. }
  78. return result;
  79. }
  80. static int blockdev_close(struct ext4_blockdev *bdev)
  81. {
  82. return rt_device_close((rt_device_t)blkdev);
  83. }
  84. static int blockdev_lock(struct ext4_blockdev *bdev)
  85. {
  86. return 0;
  87. }
  88. static int blockdev_unlock(struct ext4_blockdev *bdev)
  89. {
  90. return 0;
  91. }
  92. EXT4_BLOCKDEV_STATIC_INSTANCE(bdev, 4096, 0, blockdev_open,
  93. blockdev_bread, blockdev_bwrite, blockdev_close,
  94. blockdev_lock, blockdev_unlock);
  95. void blk_device_init(struct blk_device *blk_devices)
  96. {
  97. blkdev = blk_devices;
  98. if (ext4_mbr_scan(&bdev, &(blkdev->ext4_partition)) != EOK)
  99. {
  100. rt_kprintf("MBR scan failed!\n");
  101. return;
  102. }
  103. }