* Floppy Disk Access Code\r
*/\r
#define DEBUG 0\r
-#include <common.h>\r
+#include <acess.h>\r
#include <modules.h>\r
#include <fs_devfs.h>\r
-#include <tpl_drv_common.h>\r
+#include <tpl_drv_disk.h>\r
#include <dma.h>\r
#include <iocache.h>\r
\r
#define FDD_VERSION ((0<<8)|(75))\r
\r
// --- Options\r
-#define USE_CACHE 1 // Use Sector Cache\r
+#define USE_CACHE 0 // Use Sector Cache\r
#define CACHE_SIZE 32 // Number of cachable sectors\r
#define FDD_SEEK_TIMEOUT 10 // Timeout for a seek operation\r
#define MOTOR_ON_DELAY 500 // Miliseconds\r
int track[2];\r
int timer;\r
tVFS_Node Node;\r
+ #if !USE_CACHE\r
+ tIOCache *CacheHandle;\r
+ #endif\r
} t_floppyDevice;\r
\r
/**\r
tVFS_Node *FDD_FindDir(tVFS_Node *dirNode, char *Name);\r
int FDD_IOCtl(tVFS_Node *Node, int ID, void *Data);\r
Uint64 FDD_ReadFS(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer);\r
+// --- 1st Level Disk Access\r
+Uint FDD_ReadSectors(Uint64 SectorAddr, Uint Count, void *Buffer, Uint Disk);\r
// --- Raw Disk Access\r
int FDD_ReadSector(Uint32 disk, Uint64 lba, void *Buffer);\r
int FDD_WriteSector(Uint32 Disk, Uint64 LBA, void *Buffer);\r
gFDD_Devices[0].track[0] = -1;\r
gFDD_Devices[1].track[1] = -1;\r
\r
- Log("[FDD ] Detected Disk 0: %s and Disk 1: %s\n", cFDD_TYPES[data>>4], cFDD_TYPES[data&0xF]);\r
+ Log("[FDD ] Detected Disk 0: %s and Disk 1: %s", cFDD_TYPES[data>>4], cFDD_TYPES[data&0xF]);\r
\r
// Clear FDD IRQ Flag\r
FDD_SensInt(0x3F0, NULL, NULL);\r
// Register with devfs\r
DevFS_AddDevice(&gFDD_DriverInfo);\r
\r
- return 0;\r
+ return 1;\r
}\r
\r
/**\r
* \fn tVFS_Node *FDD_FindDir(tVFS_Node *Node, char *filename);\r
* \brief Find File Routine (for vfs_node)\r
*/\r
-tVFS_Node *FDD_FindDir(tVFS_Node *Node, char *filename)\r
+tVFS_Node *FDD_FindDir(tVFS_Node *Node, char *Filename)\r
{\r
int i;\r
\r
- ENTER("sfilename", filename);\r
+ ENTER("sFilename", Filename);\r
\r
// Sanity check string\r
- if(filename == NULL) {\r
+ if(Filename == NULL) {\r
LEAVE('n');\r
return NULL;\r
}\r
\r
// Check string length (should be 1)\r
- if(filename[0] == '\0' || filename[1] != '\0') {\r
+ if(Filename[0] == '\0' || Filename[1] != '\0') {\r
LEAVE('n');\r
return NULL;\r
}\r
\r
// Get First character\r
- i = filename[0] - '0';\r
+ i = Filename[0] - '0';\r
\r
// Check for 1st disk and if it is present return\r
if(i == 0 && gFDD_Devices[0].type != 0) {\r
return NULL;\r
}\r
\r
+static const char *casIOCTLS[] = {DRV_IOCTLNAMES,DRV_DISK_IOCTLNAMES,NULL};\r
/**\r
- * \fn int FDD_IOCtl(tVFS_Node *node, int id, void *data)\r
+ * \fn int FDD_IOCtl(tVFS_Node *Node, int id, void *data)\r
* \brief Stub ioctl function\r
*/\r
-int FDD_IOCtl(tVFS_Node *node, int id, void *data)\r
+int FDD_IOCtl(tVFS_Node *Node, int ID, void *Data)\r
{\r
- switch(id)\r
+ switch(ID)\r
{\r
- case DRV_IOCTL_TYPE: return DRV_TYPE_DISK;\r
- case DRV_IOCTL_IDENT: memcpy(data, "FDD\0", 4); return 1;\r
- case DRV_IOCTL_VERSION: return FDD_VERSION;\r
- default: return 0;\r
+ case DRV_IOCTL_TYPE:\r
+ return DRV_TYPE_DISK;\r
+ \r
+ case DRV_IOCTL_IDENT:\r
+ if(!CheckMem(Data, 4)) return -1;\r
+ memcpy(Data, "FDD\0", 4);\r
+ return 1;\r
+ \r
+ case DRV_IOCTL_VERSION:\r
+ return FDD_VERSION;\r
+ \r
+ case DRV_IOCTL_LOOKUP:\r
+ if(!CheckString(Data)) return -1;\r
+ return LookupString((char**)casIOCTLS, Data);\r
+ \r
+ case DISK_IOCTL_GETBLOCKSIZE:\r
+ return 512; \r
+ \r
+ default:\r
+ return 0;\r
}\r
}\r
\r
/**\r
- * \fn Uint64 fdd_readFS(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)\r
+ * \fn Uint64 FDD_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)\r
* \brief Read Data from a disk\r
*/\r
-Uint64 FDD_ReadFS(tVFS_Node *node, Uint64 off, Uint64 len, void *buffer)\r
+Uint64 FDD_ReadFS(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)\r
{\r
- int i = 0;\r
- int disk;\r
- Uint32 buf[128];\r
+ int i = 0;\r
+ int disk;\r
+ //Uint32 buf[128];\r
\r
- ENTER("xoff xlen pbuffer", off, len, buffer);\r
+ ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);\r
\r
- if(node == NULL) {\r
+ if(Node == NULL) {\r
LEAVE('i', -1);\r
return -1;\r
}\r
\r
- if(node->Inode != 0 && node->Inode != 1) {\r
+ if(Node->Inode != 0 && Node->Inode != 1) {\r
LEAVE('i', -1);\r
return -1;\r
}\r
\r
- disk = node->Inode;\r
+ disk = Node->Inode;\r
\r
// Update Accessed Time\r
- node->ATime = now();\r
+ Node->ATime = now();\r
\r
- if((off & 0x1FF) || (len & 0x1FF))\r
+ #if 0\r
+ if((Offset & 0x1FF) || (Length & 0x1FF))\r
{\r
// Un-Aligned Offset/Length\r
- int startOff = off>>9;\r
- int sectOff = off&0x1FF;\r
- int sectors = (len+0x1FF)>>9;\r
+ int startOff = Offset >> 9;\r
+ int sectOff = Offset & 0x1FF;\r
+ int sectors = (Length + 0x1FF) >> 9;\r
\r
LOG("Non-aligned Read");\r
\r
//Read Starting Sector\r
if(!FDD_ReadSector(disk, startOff, buf))\r
return 0;\r
- memcpy(buffer, (char*)(buf+sectOff), len>512-sectOff?512-sectOff:len);\r
+ memcpy(Buffer, (char*)(buf+sectOff), Length > 512-sectOff ? 512-sectOff : Length);\r
\r
- //If the data size is one sector or less\r
- if(len <= 512-sectOff) {\r
- LEAVE('X', len);\r
- return len; //Return\r
+ // If the data size is one sector or less\r
+ if(Length <= 512-sectOff)\r
+ {\r
+ LEAVE('X', Length);\r
+ return Length; //Return\r
}\r
- buffer += 512-sectOff;\r
+ Buffer += 512-sectOff;\r
\r
//Read Middle Sectors\r
- for(i=1;i<sectors-1;i++) {\r
+ for( i = 1; i < sectors - 1; i++ )\r
+ {\r
if(!FDD_ReadSector(disk, startOff+i, buf)) {\r
LEAVE('i', -1);\r
return -1;\r
}\r
- memcpy(buffer, buf, 512);\r
- buffer += 512;\r
+ memcpy(Buffer, buf, 512);\r
+ Buffer += 512;\r
}\r
\r
//Read End Sectors\r
if(!FDD_ReadSector(disk, startOff+i, buf))\r
return 0;\r
- memcpy(buffer, buf, (len&0x1FF)-sectOff);\r
+ memcpy(Buffer, buf, (len&0x1FF)-sectOff);\r
- LEAVE('X', len);\r
- return len;\r
+ LEAVE('X', Length);\r
+ return Length;\r
}\r
else\r
{\r
- int count = len >> 9;\r
- int sector = off >> 9;\r
+ int count = Length >> 9;\r
+ int sector = Offset >> 9;\r
LOG("Aligned Read");\r
//Aligned Offset and Length - Simple Code\r
- for(i=0;i<count;i++)\r
+ for( i = 0; i < count; i ++ )\r
{\r
FDD_ReadSector(disk, sector, buf);\r
memcpy(buffer, buf, 512);\r
buffer += 512;\r
sector++;\r
}
- LEAVE('i', len);\r
- return len;\r
+ LEAVE('i', Length);\r
+ return Length;\r
}\r
+ #endif\r
+ \r
+ i = DrvUtil_ReadBlock(Offset, Length, Buffer, FDD_ReadSectors, 512, disk);\r
+ LEAVE('i', i);\r
+ return i;\r
+}\r
+\r
+/**\r
+ * \fn Uint FDD_ReadSectors(Uint64 SectorAddr, Uint Count, void *Buffer, Uint32 Disk)\r
+ * \brief Reads \a Count contiguous sectors from a disk\r
+ * \param SectorAddr Address of the first sector\r
+ * \param Count Number of sectors to read\r
+ * \param Buffer Destination Buffer\r
+ * \param Disk Disk Number\r
+ * \return Number of sectors read\r
+ * \note Used as a ::DrvUtil_ReadBlock helper\r
+ */\r
+Uint FDD_ReadSectors(Uint64 SectorAddr, Uint Count, void *Buffer, Uint Disk)\r
+{\r
+ Uint ret = 0;\r
+ while(Count --)\r
+ {\r
+ if( FDD_ReadSector(Disk, SectorAddr, Buffer) != 1 )\r
+ return ret;\r
+ \r
+ Buffer = (void*)( (tVAddr)Buffer + 512 );\r
+ SectorAddr ++;\r
+ ret ++;\r
+ }\r
+ return ret;\r
}\r
\r
/**\r
LOG("Read %i from Disk", lba);\r
FDD_FreeCacheSpinlock();\r
#else\r
- if( IOCache_Read( gFDD_Devices[Disk].Cache, SectorAddr, Buffer ) == 1 ) {\r
+ if( IOCache_Read( gFDD_Devices[Disk].CacheHandle, SectorAddr, Buffer ) == 1 ) {\r
LEAVE('i', 1);\r
return 1;\r
}\r
base = cPORTBASE[Disk>>1];\r
\r
LOG("Calculating Disk Dimensions");\r
- //Get CHS position\r
+ // Get CHS position\r
if(FDD_int_GetDims(gFDD_Devices[Disk].type, lba, &cyl, &head, &sec, &spt) != 1) {\r
LEAVE('i', -1);\r
return -1;\r
return 1;\r
}\r
\r
+/**\r
+ * \fn int FDD_WriteSector(Uint32 Disk, Uint64 LBA, void *Buffer)\r
+ * \brief Write a sector to the floppy disk\r
+ * \note Not Implemented\r
+ */\r
+int FDD_WriteSector(Uint32 Disk, Uint64 LBA, void *Buffer)\r
+{\r
+ Warning("[FDD ] Read Only at the moment");\r
+ return -1;\r
+}\r
+\r
/**\r
* \fn int FDD_int_SeekTrack(int disk, int track)\r
* \brief Seek disk to selected track\r
*s = (lba % 18) + 1;\r
*c = lba / 36;\r
*h = (lba / 18) & 1;\r
+ //Log("1440k - lba=%i(0x%x), *s=%i,*c=%i,*h=%i", lba, lba, *s, *c, *h);\r
break;\r
\r
// 2880Kb 3.5"\r