125 lines
2.3 KiB
C
125 lines
2.3 KiB
C
|
#include "Drive.h"
|
||
|
|
||
|
void DVDLowReset( void )
|
||
|
{
|
||
|
clear32( HW_RESETS, (1<<10) | (1<<17) );
|
||
|
set32( HW_RESETS, (1<<10) | (1<<17) );
|
||
|
}
|
||
|
u32 DVDLowGetError( void )
|
||
|
{
|
||
|
write32( 0x0D806000, 0x2E );
|
||
|
write32( 0x0D806008, 0xE0000000 );
|
||
|
write32( 0x0D806020, 0 );
|
||
|
write32( 0x0D80601c, 1 );
|
||
|
|
||
|
while( read32(0x0D80601c) & 1 );
|
||
|
|
||
|
set32( 0x0D806000, (1<<4) );
|
||
|
|
||
|
return read32( 0x0D806020 );
|
||
|
}
|
||
|
u32 DVDLowSeek( void )
|
||
|
{
|
||
|
write32( 0x0D806000, 0x2E );
|
||
|
write32( 0x0D806008, 0xAB000000 );
|
||
|
write32( 0x0D806020, 0 );
|
||
|
write32( 0x0D80601c, 1 );
|
||
|
|
||
|
while( read32(0x0D80601c) & 1 );
|
||
|
|
||
|
set32( 0x0D806000, (1<<4) );
|
||
|
|
||
|
return read32( 0x0D806020 );
|
||
|
}
|
||
|
u32 DVDLowStopMotor( void )
|
||
|
{
|
||
|
write32( 0x0D806000, 0x2E );
|
||
|
write32( 0x0D806008, 0xE3000000 );
|
||
|
write32( 0x0D806020, 0 );
|
||
|
write32( 0x0D80601c, 1 );
|
||
|
|
||
|
while( read32(0x0D80601c) & 1 );
|
||
|
|
||
|
set32( 0x0D806000, (1<<4) );
|
||
|
|
||
|
return read32( 0x0D806020 );
|
||
|
}
|
||
|
u32 LowReadDiscID( void *data )
|
||
|
{
|
||
|
write32( 0x0D806008, 0xA8000040 );
|
||
|
write32( 0x0D80600C, 0 );
|
||
|
write32( 0x0D806010, 0x20 );
|
||
|
write32( 0x0D806018, 0x20 );
|
||
|
|
||
|
write32( 0x0D806014, (u32)data );
|
||
|
|
||
|
write32( 0x0D806000, 0x3A );
|
||
|
|
||
|
write32( 0x0D80601C, 3 );
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
if( read32( 0x0D806000 ) & (1<<2) )
|
||
|
{
|
||
|
set32( 0x0D806000, (1<<2) );
|
||
|
return 1;
|
||
|
}
|
||
|
if( read32( 0x0D806000 ) & (1<<4) )
|
||
|
{
|
||
|
set32( 0x0D806000, (1<<4) );
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
u32 LowRead( void *data, u32 Offset, u32 Length )
|
||
|
{
|
||
|
write32( 0x0D806008, 0xA8000000 );
|
||
|
write32( 0x0D80600C, Offset>>2 );
|
||
|
write32( 0x0D806010, Length );
|
||
|
write32( 0x0D806018, Length );
|
||
|
|
||
|
write32( 0x0D806014, (u32)data );
|
||
|
|
||
|
write32( 0x0D806000, 0x3A );
|
||
|
|
||
|
write32( 0x0D80601C, 3 );
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
if( read32( 0x0D806000 ) & (1<<2) )
|
||
|
{
|
||
|
set32( 0x0D806000, (1<<2) );
|
||
|
return 1;
|
||
|
}
|
||
|
if( read32( 0x0D806000 ) & (1<<4) )
|
||
|
{
|
||
|
set32( 0x0D806000, (1<<4) );
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
u32 DVDEnableAudioStreaming( u32 Enable )
|
||
|
{
|
||
|
write32( 0x0D806004, read32( 0x0D806004 ) );
|
||
|
|
||
|
write32( 0x0D806008, 0xE4000000 | (Enable<<16) | 0x0A );
|
||
|
|
||
|
write32( 0x0D80601C, 1 );
|
||
|
|
||
|
while( read32(0x0D80601C) & 1 );
|
||
|
|
||
|
while(1)
|
||
|
{
|
||
|
if( read32( 0x0D806000 ) & 4 )
|
||
|
return DI_ERROR;
|
||
|
if(!read32(0x0D806018))
|
||
|
return DI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
return DI_FATAL;
|
||
|
}
|