Fix bug in using nor flash storage without SD
[SCSI2SD.git] / software / SCSI2SD / src / geometry.h
1 //      Copyright (C) 2013 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17 #ifndef GEOMETRY_H
18 #define GEOMETRY_H
19
20 #include "device.h"
21
22 #include "config.h"
23 #include "storedevice.h"
24 #include "sd.h"
25     
26 typedef enum
27 {
28         ADDRESS_BLOCK = 0,
29         ADDRESS_PHYSICAL_BYTE = 4,
30         ADDRESS_PHYSICAL_SECTOR = 5
31 } SCSI_ADDRESS_FORMAT;
32
33 static inline int SDSectorsPerSCSISector(uint16_t bytesPerSector)
34 {
35         return (bytesPerSector + SD_SECTOR_SIZE - 1) / SD_SECTOR_SIZE;
36 }
37
38 uint32_t getScsiCapacity(
39         S2S_Device* device,
40         uint32_t sdSectorStart,
41         uint16_t bytesPerSector,
42         uint32_t scsiSectors);
43
44 uint32_t SCSISector2SD(
45         uint32_t sdSectorStart,
46         uint16_t bytesPerSector,
47         uint32_t scsiSector);
48
49 uint64_t CHS2LBA(
50         uint32_t c,
51         uint8_t h,
52         uint32_t s,
53         uint16_t headsPerCylinder,
54         uint16_t sectorsPerTrack);
55 void LBA2CHS(
56         uint32_t lba,
57         uint32_t* c,
58         uint8_t* h,
59         uint32_t* s,
60         uint16_t headsPerCylinder,
61         uint16_t sectorsPerTrack);
62
63 // Convert an address in the given SCSI_ADDRESS_FORMAT to
64 // a linear byte address.
65 // addr must be >= 8 bytes.
66 uint64_t scsiByteAddress(
67         uint16_t bytesPerSector,
68         uint16_t headsPerCylinder,
69         uint16_t sectorsPerTrack,
70         int format,
71         const uint8_t* addr);
72 void scsiSaveByteAddress(
73         uint16_t bytesPerSector,
74         uint16_t headsPerCylinder,
75         uint16_t sectorsPerTrack,
76         int format,
77         uint64_t byteAddr,
78         uint8_t* buf);
79
80
81 #endif