VoodooSDHCI

VoodooSDHCI Svn Source Tree

Root/trunk/VoodooSDHC.h

  • Property svn:executable set to *
1#ifndef _VoodooSDHC_H_
2#define _VoodooSDHC_H_
3#include "License.h"
4#define SLOT1 0
5#define SLOT2 1
6#define SLOT3 2
7#define SLOT4 3
8#define SLOT5 4
9#define SLOT6 5
10
11/* General IOKit includes */
12#include <IOKit/IOLib.h>
13#include <IOKit/IOMessage.h>
14#include <IOKit/IOService.h>
15#include <IOKit/IOFilterInterruptEventSource.h>
16#include <IOKit/IOTimerEventSource.h>
17#include <IOKit/storage/IOBlockStorageDriver.h>
18#include <IOKit/storage/IOBlockStorageDevice.h>
19#include <IOKit/IOBufferMemoryDescriptor.h>
20#include <libkern/locks.h>
21#include "SD_DataTypes.h"
22
23class VoodooSDHC : public IOBlockStorageDevice
24{
25
26OSDeclareDefaultStructors ( VoodooSDHC )
27
28protected:
29
30public:
31
32// Overrides from IOService
33
34virtual boolinit ( OSDictionary * propertyTable );
35virtual voidfree();
36virtual bool start ( IOService * provider );
37virtual void stop ( IOService * provider );
38
39private:
40// This lock protects block I/O access to the card reader
41class Lock {
42IOLock*mutex_;
43boollocked_;
44intwaiting_;
45public:
46void init() {
47mutex_ = IOLockAlloc();
48locked_ = false;
49waiting_ = 0;
50}
51void free() {
52IOLockFree(mutex_);
53}
54void lock() {
55IOLockLock(mutex_);
56if (locked_) {
57waiting_++;
58do {
59IOLockSleep(mutex_, mutex_, THREAD_UNINT);
60} while (locked_);
61waiting_--;
62}
63locked_ = true;
64IOLockUnlock(mutex_);
65}
66void unlock() {
67IOLockLock(mutex_);
68locked_ = false;
69if (waiting_)
70IOLockWakeup(mutex_, mutex_, true);
71IOLockUnlock(mutex_);
72}
73} lock;
74
75#ifdef USE_SDMA
76IOLock*sdmaCond; // this lock handles I/O interrupt
77IOLock*mediaStateLock; // this lock serializes reportMediaState
78IOBufferMemoryDescriptor *sdmaBuffDesc;
79UInt32physSdmaBuff;
80void*virtSdmaBuff;
81IOWorkLoop*workLoop;
82IOFilterInterruptEventSource *interruptSrc;
83IOTimerEventSource*timerSrc;
84virtual IOWorkLoop *getWorkLoop() const { return workLoop; }
85#endif
86
87IOMemoryMap*PCIRegMap;
88structSDHCIRegMap_t *PCIRegP[6];
89structSDCIDReg_t SDCIDReg[6];
90UInt32RCA;
91UInt32maxBlock;
92enum {
93kCardNotPresent,
94kCardIsPresent,
95kCardRemount
96} cardPresence;
97boolisHighCapacity;
98
99boolsetup(IOService *provider);
100voiddumpRegs(UInt8 slot);
101boolisCardPresent(UInt8 slot);
102boolisCardWP(UInt8 slot);
103boolcardInit( UInt8 slot );
104voidLEDControl(UInt8 slot, bool state);
105voidReset( UInt8 slot, UInt8 type );
106boolSDCommand( UInt8 slot, UInt8 command, UInt16 response, UInt32 arg);
107boolcalcClock(UInt8 slot, UInt32 clockspeed);
108boolpowerSD(UInt8 slot);
109voidparseCID(UInt8 slot);
110voidparseCSD(UInt8 slot);
111
112//IOReturnrequestIdle(void); /* 10.6.0 */
113//IOReturndoDiscard(UInt64 block, UInt64 nblks); /* 10.6.0 */
114IOReturnreportRemovability(bool *isRemovable);
115IOReturnreportWriteProtection(bool *isWriteProtected);
116IOReturnsetWriteCacheState(bool enabled);
117IOReturnreportPollRequirements(bool *pollRequired, bool *pollIsExpensive);
118IOReturnreportMediaState(bool *mediaPresent, bool *changedState);
119IOReturnreportMaxValidBlock(UInt64 *maxBlock);
120IOReturnreportLockability(bool *isLockable);
121IOReturnreportEjectability(bool *isEjectable);
122IOReturnreportBlockSize(UInt64 *blockSize);
123IOReturngetWriteCacheState(bool *enabled);
124IOReturnsetPowerState( unsigned long whichState, IOService * whatDevice );
125char *getVendorString(void);
126char *getRevisionString(void);
127char *getProductString(void);
128char *getAdditionalDeviceInfoString(void);
129IOReturndoSynchronizeCache(void);
130IOReturndoLockUnlockMedia(bool doLock);
131UInt32doGetFormatCapacities(UInt64 *capacities, UInt32 capacitiesMaxCount) const;
132IOReturndoFormatMedia(UInt64 byteCapacity);
133IOReturndoEjectMedia(void);
134#ifdef __LP64__
135 virtual IOReturndoAsyncReadWrite(IOMemoryDescriptor *buffer,
136 UInt64 block, UInt64 nblks,
137 IOStorageAttributes *attributes,
138 IOStorageCompletion *completion);
139#endif
140#ifndef __LP64__
141IOReturndoAsyncReadWrite(IOMemoryDescriptor *buffer,
142 UInt32 block, UInt32 nblks,
143 IOStorageCompletion completion); //completion was start
144IOReturnreportMaxWriteTransfer(UInt64 blockSize, UInt64 *max);
145IOReturnreportMaxReadTransfer (UInt64 blockSize, UInt64 *max);
146#endif
147IOReturnsdma_access(IOMemoryDescriptor *buffer, UInt32 block, UInt32 nblks, bool read);
148IOReturnreadBlockMulti_pio(IOMemoryDescriptor *buffer, UInt32 block, UInt32 nblks,
149UInt32 offset);
150IOReturnreadBlockSingle_pio(UInt8 *buff, UInt32 block);
151IOReturnwriteBlockMulti_pio(IOMemoryDescriptor *buffer, UInt32 block, UInt32 nblks,
152UInt32 offset);
153IOReturnwriteBlockSingle_pio(IOMemoryDescriptor *buffer, UInt32 block,
154UInt32 offset);
155boolwaitIntStatus(UInt32 maskBits);
156voidhandleInterrupt();
157voidhandleTimer();
158
159static void interruptHandler(OSObject *owner, IOInterruptEventSource *source, int count);
160static bool interruptFilter(OSObject *owner, IOFilterInterruptEventSource *source);
161static void timerHandler(OSObject *owner, IOTimerEventSource *sender);
162};
163
164#endif /* _VoodooSDHC_H_ */
165

Archive Download this file

Revision: 2