driveexist.c
1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <ultra64.h>
#include "piint.h"
#include "leodrive.h"
#ifndef _LONGCMD
#include <leo.h>
#else
#include <leosp.h>
#endif
/*
* ドライブロムのオフセット 0x1010 にアクセスし、既定値が書かれ
* ているかどうかでドライブの有無を判定する
*
* osDriveRomInit を使用した場合、その時点のドライブの有無が確認
* できない可能性があるため、使用せず、自分で読みに行く
*/
u32 LeoDriveExist(void)
{
u32 data;
u32 saveMask;
register u32 stat;
u32 latency, pulse, pageSize, relDuration;
/*
* リソーストークンをゲット
* (ドライブロムにアクセスするため)
*/
__osPiGetAccess();
stat = IO_READ(PI_STATUS_REG);
while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {
stat = IO_READ(PI_STATUS_REG);
}
/*
* アクセススピードを変更する前に、現在の値を保存しておく
*/
latency = IO_READ(PI_BSD_DOM1_LAT_REG);
pageSize = IO_READ(PI_BSD_DOM1_PGS_REG);
relDuration = IO_READ(PI_BSD_DOM1_RLS_REG);
pulse = IO_READ(PI_BSD_DOM1_PWD_REG);
/*
* アクセススピード値は分からないので、超低速な値に設定。
*/
IO_WRITE(PI_BSD_DOM1_LAT_REG, (u8)0xff);
IO_WRITE(PI_BSD_DOM1_PGS_REG, (u8)0x0);
IO_WRITE(PI_BSD_DOM1_RLS_REG, (u8)0x3);
IO_WRITE(PI_BSD_DOM1_PWD_REG, (u8)0xff);
/*
* IPLROM のオフセット 0x1010 をリード
*/
data = IO_READ((u32)PHYS_TO_K1(PI_DOM1_ADDR1) + 0x1010);
/*
* PI バスの設定値を、変更前に戻しておく
*/
IO_WRITE(PI_BSD_DOM1_LAT_REG, latency);
IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize);
IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration);
IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse);
/* Return resource token */
__osPiRelAccess();
/*
* 既定値(0x2129fff8) ならドライブは存在しているといえる
*/
if ( data == 0x2129fff8 )
return 1; /* 存在する */
else
return 0; /* 存在しない */
}