sd.c 1.8 KB

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