diskio.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "integer.h"
  2. #include "diskio.h"
  3. #include "config.h"
  4. #include "data.h"
  5. #include "debug.h"
  6. volatile static
  7. DSTATUS Stat = STA_NOINIT; /* Disk status */
  8. /* Interface
  9. ** Scratch Buffer
  10. addr 3 byte
  11. size 1 byte
  12. ** Call Interface
  13. cmd 1 byte
  14. sector 4 bytes
  15. count 1 byte
  16. return 1 byte
  17. ** Commands
  18. * disk_init
  19. * disk_read
  20. * disk_write
  21. */
  22. /*-----------------------------------------------------------------------*/
  23. /* Initialize Disk Drive */
  24. /*-----------------------------------------------------------------------*/
  25. #include <string.h>
  26. #define IMAGE_NAME "disk00.vfat"
  27. BYTE *image_addr;
  28. DSTATUS disk_initialize (BYTE drv) {
  29. byte retval;
  30. print_console("disk_initialize\n");
  31. if (drv) return STA_NOINIT; /* Supports only single drive */
  32. Stat |= STA_NOINIT;
  33. *(byte*) MMIO_RETVAL = STA_VOID;
  34. *(byte*) MMIO_CMD = CMD_INIT;
  35. while(*(byte*) MMIO_RETVAL == STA_VOID);
  36. retval = *(byte*) MMIO_RETVAL;
  37. Stat &= ~STA_NOINIT; /* When device goes ready, clear STA_NOINIT */
  38. print_console("disk_initialize done\n");
  39. return Stat;
  40. }
  41. /*-----------------------------------------------------------------------*/
  42. /* Return Disk Status */
  43. /*-----------------------------------------------------------------------*/
  44. DSTATUS disk_status (BYTE drv){
  45. if (drv) return STA_NOINIT; /* Supports only single drive */
  46. return Stat;
  47. }
  48. /*-----------------------------------------------------------------------*/
  49. /* Read Sector(s) */
  50. /*-----------------------------------------------------------------------*/
  51. DRESULT disk_read (
  52. BYTE drv, /* Physical drive nmuber (0) */
  53. BYTE *buff, /* Data buffer to store read data */
  54. DWORD sector, /* Sector number (LBA) */
  55. BYTE count /* Sector count (1..255) */
  56. )
  57. {
  58. DWORD offset;
  59. INT size;
  60. byte retval;
  61. word i;
  62. print_console("disk_read enter\n");
  63. //if (drv || !count) return RES_PARERR;
  64. print_console("drv ok\n");
  65. if (Stat & STA_NOINIT) return RES_NOTRDY;
  66. print_console("sta ok\n");
  67. *(byte*) MMIO_RETVAL = STA_VOID;
  68. *(byte*) MMIO_CMD = CMD_READ;
  69. *(byte*) MMIO_SECTOR01 = (sector >> 24) & 0xff;
  70. *(byte*) MMIO_SECTOR02 = (sector >> 16) & 0xff;
  71. *(byte*) MMIO_SECTOR03 = (sector >> 8) & 0xff;
  72. *(byte*) MMIO_SECTOR04 = (sector >> 8) & 0xff;
  73. *(byte*) MMIO_COUNT = count;
  74. while(*(byte*) MMIO_RETVAL == STA_VOID);
  75. retval = *(byte*) MMIO_RETVAL;
  76. print_console("copy buffer\n");
  77. for (i=0;i<(count*512);i++)
  78. *(byte*)(SHARED_ADDR+i) = buff[i];
  79. return retval;
  80. }
  81. /*-----------------------------------------------------------------------*/
  82. /* Write Sector(s) */
  83. /*-----------------------------------------------------------------------*/
  84. #if _READONLY == 0
  85. DRESULT disk_write (
  86. BYTE drv, /* Physical drive nmuber (0) */
  87. const BYTE *buff, /* Data to be written */
  88. DWORD sector, /* Sector number (LBA) */
  89. BYTE count /* Sector count (1..255) */
  90. )
  91. {
  92. DWORD offset;
  93. INT size;
  94. if (drv || !count) return RES_PARERR;
  95. if (Stat & STA_NOINIT) return RES_NOTRDY;
  96. offset = sector * 512;
  97. size = count * 512;
  98. return RES_OK;
  99. }
  100. #endif /* _READONLY */
  101. /*-----------------------------------------------------------------------*/
  102. /* Miscellaneous Functions */
  103. /*-----------------------------------------------------------------------*/
  104. #if _USE_IOCTL != 0
  105. DRESULT disk_ioctl (
  106. BYTE drv, /* Physical drive nmuber (0) */
  107. BYTE ctrl, /* Control code */
  108. void *buff /* Buffer to send/receive data block */
  109. )
  110. {
  111. BYTE n, w, ofs, dl, dh, *ptr = (BYTE*)buff;
  112. if (drv) return RES_PARERR;
  113. if (Stat & STA_NOINIT) return RES_NOTRDY;
  114. switch (ctrl) {
  115. case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */
  116. ofs = 60; w = 2; n = 0;
  117. break;
  118. case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */
  119. *(WORD*)buff = 512;
  120. return RES_OK;
  121. case GET_BLOCK_SIZE : /* Get erase block size in sectors (DWORD) */
  122. *(DWORD*)buff = 32;
  123. return RES_OK;
  124. default:
  125. return RES_PARERR;
  126. }
  127. return RES_OK;
  128. }
  129. #endif /* _USE_IOCTL != 0 */