Updated gitignore rules, cleaned up MBR parsing
[tpg/acess2.git] / Modules / FDD / fdd.c
index c33b281..69d3a55 100644 (file)
@@ -3,10 +3,10 @@
  * 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
@@ -17,7 +17,7 @@
 #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
@@ -33,6 +33,9 @@ typedef struct {
         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
@@ -83,6 +86,8 @@ char  *FDD_ReadDir(tVFS_Node *Node, int pos);
 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
@@ -146,7 +151,7 @@ int FDD_Install(char **Arguments)
        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
@@ -195,7 +200,7 @@ int FDD_Install(char **Arguments)
        // Register with devfs\r
        DevFS_AddDevice(&gFDD_DriverInfo);\r
        \r
-       return 0;\r
+       return 1;\r
 }\r
 \r
 /**\r
@@ -225,26 +230,26 @@ char *FDD_ReadDir(tVFS_Node *Node, int pos)
  * \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
@@ -263,103 +268,153 @@ tVFS_Node *FDD_FindDir(tVFS_Node *Node, char *filename)
        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
@@ -393,7 +448,7 @@ int FDD_ReadSector(Uint32 Disk, Uint64 SectorAddr, void *Buffer)
        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
@@ -402,7 +457,7 @@ int FDD_ReadSector(Uint32 Disk, Uint64 SectorAddr, void *Buffer)
        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
@@ -497,6 +552,17 @@ int FDD_ReadSector(Uint32 Disk, Uint64 SectorAddr, void *Buffer)
        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
@@ -569,6 +635,7 @@ int FDD_int_GetDims(int type, int lba, int *c, int *h, int *s, int *spt)
                *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

UCC git Repository :: git.ucc.asn.au