sd.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #include <rtthread.h>
  10. #include <dfs_fs.h>
  11. #include <lpc214x.h>
  12. #include "sd.h"
  13. static struct rt_device sd;
  14. static struct dfs_partition part;
  15. static rt_err_t rt_sdcard_init(rt_device_t dev)
  16. {
  17. return RT_EOK;
  18. }
  19. static rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag)
  20. {
  21. return RT_EOK;
  22. }
  23. static rt_err_t rt_sdcard_close(rt_device_t dev)
  24. {
  25. return RT_EOK;
  26. }
  27. static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  28. {
  29. /* append partition offset */
  30. pos += part.offset * 512;
  31. return 0;
  32. }
  33. static rt_size_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  34. {
  35. /* append partition offset */
  36. pos += part.offset * 512;
  37. return 0;
  38. }
  39. static rt_err_t rt_sdcard_control(rt_device_t dev, int cmd, void *args)
  40. {
  41. return RT_EOK;
  42. }
  43. void rt_hw_sdcard_init()
  44. {
  45. rt_size_t length;
  46. rt_uint8_t* sector;
  47. /* sdcard hardware init */
  48. sd.type = RT_Device_Class_Block;
  49. sd.init = rt_sdcard_init;
  50. sd.open = rt_sdcard_open;
  51. sd.close = rt_sdcard_close;
  52. sd.read = rt_sdcard_read;
  53. sd.write = rt_sdcard_write;
  54. sd.control = rt_sdcard_control;
  55. sd.user_data = RT_NULL;
  56. /* get the first sector to read partition table */
  57. sector = (rt_uint8_t*) rt_malloc (512);
  58. if (sector == RT_NULL)
  59. {
  60. rt_kprintf("allocate partition sector buffer failed\n");
  61. return;
  62. }
  63. length = rt_sdcard_read((rt_device_t)&sd, 0, sector, 512);
  64. if (length == 512)
  65. {
  66. rt_err_t status;
  67. /* get the first partition */
  68. status = dfs_filesystem_get_partition(&part, sector, 0);
  69. if (status != RT_EOK)
  70. {
  71. /* there is no partition table */
  72. part.offset = 0;
  73. part.size = 0;
  74. }
  75. }
  76. else
  77. {
  78. /* there is no partition table */
  79. part.offset = 0;
  80. part.size = 0;
  81. }
  82. rt_device_register(&sd,
  83. "sd", RT_DEVICE_FLAG_RDWR);
  84. }