#if 0 cd [file dirname [info script]] source makefile.tcl return #endif /* * $Id:$ */ #include "ide.h" #include "uart.h" bool Ide::verify(char *s) { if(pb()) { if(s) com1 << s; com1 << "error " << U8(error) << '\r' << '\n'; reset(); return false; } return true; } #if 0 void Ide::init() { driveHead=0xe0; deviceCtrl=0x00; features=featureCacheEnable; command=SET_FEATURES; if(semTake(sem,sysClkRateGet()*2)!=OK) printf("timeout on set features featureCacheEnable\n"); verify("pb on set features featureCacheEnable "); sectorCountReg=ultraDmaMode; featuresReg=featureXferMode; commandReg=SET_FEATURES; if(semTake(sem,sysClkRateGet()*2)!=OK) printf("timeout on set features ultraDmaMode\n"); verify("pb on set features ultraDmaMode "); featuresReg=AdvancedPowerManagementDisable; commandReg=SET_FEATURES; if(semTake(sem,sysClkRateGet()*2)!=OK) printf("timeout on set features AdvancedPowerManagementDisable\n"); verify("pb on set features AdvancedPowerManagementDisable "); } STATUS Ide::smart(int subCmd,int param,u_short *data,u_short *status) { featuresReg=subCmd; sectorCountReg=param; cylinderLowReg=0x4f; cylinderHighReg=0xc2; driveHeadReg=0xa0; commandReg=SMART; if(!verify("smart pb ")) return -1; if(semTake(sem,sysClkRateGet()*10)!=OK) { logMsg("smart timeout\n",0,0,0,0,0,0); return -1; } if(data) { int dcnt; dcnt=512/sizeof(u_short); while(dcnt--) { *data=dataReg16; data++; } } if(status) { *status=(cylinderHighReg<<8)|cylinderLowReg; } if(!verify("smart pb ")) return -1; return OK; } #endif bool Ide::genericSet (U8 *req) { features =req[1]; sectorCount =req[2]; sectorNumber =req[3]; cylinderLow =req[4]; cylinderHigh =req[5]; driveHead =req[6]; command =req[7]; return true; } bool Ide::genericGet (U8 *req) { req[1]=errorCode; req[2]=sectorCount; req[3]=sectorNumber; req[4]=cylinderLow; req[5]=cylinderHigh; req[6]=driveHead; req[7]=status; return true; } bool Ide::genericTo (U8 *req,U8*buf,U32 len) { U16 *pt=(U16*)buf; genericSet(req); len>>=1; while(len--) { while(!dataRequested()) { if(!verify("genericTo pb ")) return false; } U16 v; v=*pt++; data16=((v&0x00ff)<<8)|((v&0xff00)>>8); } genericGet(req); return verify("genericTo pb"); } bool Ide::genericFrom(U8 *req,U8*buf,U32 len) { U16 *pt=(U16*)buf; genericSet(req); len>>=1; while(len--) { while(!dataRequested()) { if(!verify("genericFrom pb ")) return false; } U16 v; v=data16; *pt++=((v&0x00ff)<<8)|((v&0xff00)>>8); } genericGet(req); return verify("genericFrom pb"); } U32 Ide::read(U32 sector,U32 qt,U16 *buf) { sectorCount=qt; sectorNumber32(sector); command=READ_SECT; while(dataRequested()) { *buf++=data16; } if(!verify("read pb")) return 0; return qt; } U32 Ide::write(U32 sector,U32 qt,U16 *buf) { sectorCount=qt; sectorNumber32(sector); command=WRITE_SECT; while(dataRequested()) { data16=*buf++; } if(!verify("write pb")) return 0; return qt; } bool Ide::seek(U32 sector) { sectorNumber32(sector); command=SEEK; if(!waitReady(100)) return false; if(!verify("seek pb ")) return false; return true; } bool Ide::idleImmediate() { command=IDLE_IMMEDIATE; if(!waitReady(100)) return false; if(!verify("idle immediate pb ")) return false; return true; } bool Ide::idle(U32 quintupleSec) { sectorCount=quintupleSec; command=IDLE; if(!waitReady(100)) return false; if(!verify("idle pb ")) return false; return true; } bool Ide::waitReady(int dcnt) { while(dcnt && !diskReady()) dcnt--; return dcnt!=0; } bool Ide::identify(U8 *buf,int len) { if(buf && len!=0x200) return false; driveHead=0xa0; command=IDENTIFY; if(!verify("identify pb ")) return false; /* if(!waitReady(100)) return false; */ if(buf) { U16 *pt=(U16*)buf; int dcnt=len/sizeof(U16); while(dcnt--) { while(!dataRequested()) { if(!verify("identify data pb ")) return false; } U16 v; v=data16; *pt++=((v&0x00ff)<<8)|((v&0xff00)>>8); } } if(!verify("identify pb ")) return false; return true; } /* * $Log: ide.cpp,v $ * Revision 1.3 2002/06/04 11:30:07 TLa * -Wall free * * Revision 1.2 2002/02/21 18:07:41 TLa * Id et Log pour tout le monde * */