Subversion Repositories Kolibri OS

Rev

Rev 3539 | Rev 3706 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2455 mario79 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 3702 $
9
 
10
 
11
;******************************************************
3539 clevermous 12
; поиск приводов HDD и CD
13
; автор исходного текста Кулаков Владимир Геннадьевич.
14
; адаптация и доработка Mario79
2288 clevermous 15
;******************************************************
16
 
17
;****************************************************
3539 clevermous 18
;*                 ПОИСК HDD и CD                   *
2288 clevermous 19
;****************************************************
20
FindHDD:
21
        mov     [ChannelNumber], 1
22
        mov     [DiskNumber], 0
23
        call    FindHDD_3
24
;        mov     ax,[Sector512+176]
25
;        mov     [DRIVE_DATA+6],ax
26
;        mov     ax,[Sector512+126]
27
;        mov     [DRIVE_DATA+8],ax
28
;        mov     ax,[Sector512+128]
29
;        mov     [DRIVE_DATA+8],ax
30
        mov     [DiskNumber], 1
31
        call    FindHDD_3
32
;        mov     al,[Sector512+176]
33
;        mov     [DRIVE_DATA+7],al
34
        inc     [ChannelNumber]
35
        mov     [DiskNumber], 0
36
        call    FindHDD_3
37
;        mov     al,[Sector512+176]
38
;        mov     [DRIVE_DATA+8],al
39
        mov     [DiskNumber], 1
40
        call    FindHDD_1
41
;        mov     al,[Sector512+176]
42
;        mov     [DRIVE_DATA+9],al
43
 
44
        jmp     EndFindHDD
45
 
46
FindHDD_1:
3702 mario79 47
	movzx	eax,word [ChannelNumber]
48
        DEBUGF  1, "K : Channel %d ",eax
49
	movzx	eax,byte [DiskNumber]
50
        DEBUGF  1, "Disk %d\n",eax
2288 clevermous 51
        call    ReadHDD_ID
52
        cmp     [DevErrorCode], 0
53
        jne     FindHDD_2
54
        cmp     [Sector512+6], word 16
55
        ja      FindHDD_2
56
        cmp     [Sector512+12], word 255
57
        ja      FindHDD_2
58
        inc     byte [DRIVE_DATA+1]
3702 mario79 59
        jmp     Print_Device_Name
2288 clevermous 60
   FindHDD_2:
61
        call    DeviceReset
62
        cmp     [DevErrorCode], 0
63
        jne     FindHDD_2_2
64
        call    ReadCD_ID
65
        cmp     [DevErrorCode], 0
66
        jne     FindHDD_2_2
67
        inc     byte [DRIVE_DATA+1]
68
        inc     byte [DRIVE_DATA+1]
3702 mario79 69
Print_Device_Name:
70
	pushad
71
	pushfd
72
	mov	esi,Sector512+27*2
73
	mov	edi,dev_name
74
	mov	ecx,20
75
	cld
76
@@:
77
	lodsw
78
	xchg	ah,al
79
	stosw
80
	loop	@b
81
	popfd
82
	popad
83
        DEBUGF 1, "K : Dev: %s \n", dev_name
2288 clevermous 84
   FindHDD_2_2:
85
        ret
86
 
87
FindHDD_3:
88
        call    FindHDD_1
89
        shl     byte [DRIVE_DATA+1], 2
90
        ret
91
 
3539 clevermous 92
; Адрес считываемого сектора в режиме LBA
2288 clevermous 93
uglobal
94
SectorAddress   DD ?
3702 mario79 95
dev_name:
96
	rb 41
2288 clevermous 97
endg
98
;*************************************************
3539 clevermous 99
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА ЖЕСТКОГО ДИСКА      *
100
;* Входные параметры передаются через глобальные *
101
;* переменные:                                   *
102
;* ChannelNumber - номер канала (1 или 2);       *
103
;* DiskNumber - номер диска на канале (0 или 1). *
104
;* Идентификационный блок данных считывается     *
105
;* в массив Sector512.                           *
2288 clevermous 106
;*************************************************
107
ReadHDD_ID:
3539 clevermous 108
; Задать режим CHS
2288 clevermous 109
        mov     [ATAAddressMode], 0
3539 clevermous 110
; Послать команду идентификации устройства
2288 clevermous 111
        mov     [ATAFeatures], 0
112
        mov     [ATAHead], 0
113
        mov     [ATACommand], 0ECh
114
        call    SendCommandToHDD
3539 clevermous 115
        cmp     [DevErrorCode], 0;проверить код ошибки
116
        jne     @@End  ;закончить, сохранив код ошибки
2288 clevermous 117
        mov     DX, [ATABasePortAddr]
3539 clevermous 118
        add     DX, 7    ;адрес регистра состояни
2288 clevermous 119
        mov     ecx, 0xffff
120
@@WaitCompleet:
3539 clevermous 121
        ; Проверить время выполнения команды
2288 clevermous 122
        dec     ecx
123
;        cmp  ecx,0
3539 clevermous 124
        jz      @@Error1  ;ошибка тайм-аута
125
        ; Проверить готовность
2288 clevermous 126
        in      AL, DX
3539 clevermous 127
        test    AL, 80h  ;состояние сигнала BSY
2288 clevermous 128
        jnz     @@WaitCompleet
3539 clevermous 129
        test    AL, 1    ;состояние сигнала ERR
2288 clevermous 130
        jnz     @@Error6
3539 clevermous 131
        test    AL, 08h  ;состояние сигнала DRQ
2288 clevermous 132
        jz      @@WaitCompleet
3539 clevermous 133
; Принять блок данных от контроллера
2288 clevermous 134
;        mov     AX,DS
135
;        mov     ES,AX
136
        mov     EDI, Sector512 ;offset Sector512
3539 clevermous 137
        mov     DX, [ATABasePortAddr];регистр данных
138
        mov     CX, 256  ;число считываемых слов
139
        rep insw         ;принять блок данных
2288 clevermous 140
        ret
3539 clevermous 141
; Записать код ошибки
2288 clevermous 142
@@Error1:
143
        mov     [DevErrorCode], 1
144
        ret
145
@@Error6:
146
        mov     [DevErrorCode], 6
147
@@End:
148
        ret
149
 
150
 
151
iglobal
3539 clevermous 152
; Стандартные базовые адреса каналов 1 и 2
2288 clevermous 153
StandardATABases DW 1F0h, 170h
154
endg
155
uglobal
3539 clevermous 156
; Номер канала
2288 clevermous 157
ChannelNumber   DW ?
3539 clevermous 158
; Номер диска
2288 clevermous 159
DiskNumber      DB ?
3539 clevermous 160
; Базовый адрес группы портов контроллера ATA
2288 clevermous 161
ATABasePortAddr DW ?
3539 clevermous 162
; Параметры ATA-команды
163
ATAFeatures     DB ? ;особенности
164
ATASectorCount  DB ? ;количество обрабатываемых секторов
165
ATASectorNumber DB ? ;номер начального сектора
166
ATACylinder     DW ? ;номер начального цилиндра
167
ATAHead         DB ? ;номер начальной головки
168
ATAAddressMode  DB ? ;режим адресации (0 - CHS, 1 - LBA)
169
ATACommand      DB ? ;код команды, подлежащей выполнению
170
; Код ошибки (0 - нет ошибок, 1 - превышен допустимый
171
; интервал ожидания, 2 - неверный код режима адресации,
172
; 3 - неверный номер канала, 4 - неверный номер диска,
173
; 5 - неверный номер головки, 6 - ошибка при выполнении
174
; команды)
2288 clevermous 175
DevErrorCode dd ?
176
endg
177
;****************************************************
3539 clevermous 178
;*          ПОСЛАТЬ КОМАНДУ ЗАДАННОМУ ДИСКУ         *
179
;* Входные параметры передаются через глобальные    *
180
;* переменные:                                      *
181
;* ChannelNumber - номер канала (1 или 2);          *
182
;* DiskNumber - номер диска (0 или 1);              *
183
;* ATAFeatures - "особенности";                     *
184
;* ATASectorCount - количество секторов;            *
185
;* ATASectorNumber - номер начального сектора;      *
186
;* ATACylinder - номер начального цилиндра;         *
187
;* ATAHead - номер начальной головки;               *
188
;* ATAAddressMode - режим адресации (0-CHS, 1-LBA); *
189
;* ATACommand - код команды.                        *
190
;* После успешного выполнения функции:              *
191
;* в ATABasePortAddr - базовый адрес HDD;           *
192
;* в DevErrorCode - ноль.                           *
193
;* При возникновении ошибки в DevErrorCode будет    *
194
;* возвращен код ошибки.                            *
2288 clevermous 195
;****************************************************
196
SendCommandToHDD:
3539 clevermous 197
; Проверить значение кода режима
2288 clevermous 198
        cmp     [ATAAddressMode], 1
199
        ja      @@Err2
3539 clevermous 200
; Проверить корректность номера канала
2288 clevermous 201
        mov     BX, [ChannelNumber]
202
        cmp     BX, 1
203
        jb      @@Err3
204
        cmp     BX, 2
205
        ja      @@Err3
3539 clevermous 206
; Установить базовый адрес
2288 clevermous 207
        dec     BX
208
        shl     BX, 1
209
        movzx   ebx, bx
210
        mov     AX, [ebx+StandardATABases]
211
        mov     [ATABasePortAddr], AX
3539 clevermous 212
; Ожидание готовности HDD к приему команды
213
        ; Выбрать нужный диск
2288 clevermous 214
        mov     DX, [ATABasePortAddr]
3539 clevermous 215
        add     DX, 6   ;адрес регистра головок
2288 clevermous 216
        mov     AL, [DiskNumber]
3539 clevermous 217
        cmp     AL, 1   ;проверить номера диска
2288 clevermous 218
        ja      @@Err4
219
        shl     AL, 4
220
        or      AL, 10100000b
221
        out     DX, AL
3539 clevermous 222
        ; Ожидать, пока диск не будет готов
2288 clevermous 223
        inc     DX
224
        mov     ecx, 0xfff
225
;        mov     eax,[timer_ticks]
226
;        mov     [TickCounter_1],eax
227
@@WaitHDReady:
3539 clevermous 228
        ; Проверить время ожидани
2288 clevermous 229
        dec     ecx
230
;        cmp  ecx,0
231
        jz      @@Err1
232
;        mov     eax,[timer_ticks]
233
;        sub     eax,[TickCounter_1]
3539 clevermous 234
;        cmp     eax,300    ;ожидать 300 тиков
235
;        ja      @@Err1   ;ошибка тайм-аута
236
        ; Прочитать регистр состояни
2288 clevermous 237
        in      AL, DX
3539 clevermous 238
        ; Проверить состояние сигнала BSY
2288 clevermous 239
        test    AL, 80h
240
        jnz     @@WaitHDReady
3539 clevermous 241
        ; Проверить состояние сигнала DRQ
2288 clevermous 242
        test    AL, 08h
243
        jnz     @@WaitHDReady
3539 clevermous 244
; Загрузить команду в регистры контроллера
2288 clevermous 245
        cli
246
        mov     DX, [ATABasePortAddr]
3539 clevermous 247
        inc     DX      ;регистр "особенностей"
2288 clevermous 248
        mov     AL, [ATAFeatures]
249
        out     DX, AL
3539 clevermous 250
        inc     DX      ;счетчик секторов
2288 clevermous 251
        mov     AL, [ATASectorCount]
252
        out     DX, AL
3539 clevermous 253
        inc     DX      ;регистр номера сектора
2288 clevermous 254
        mov     AL, [ATASectorNumber]
255
        out     DX, AL
3539 clevermous 256
        inc     DX      ;номер цилиндра (младший байт)
2288 clevermous 257
        mov     AX, [ATACylinder]
258
        out     DX, AL
3539 clevermous 259
        inc     DX      ;номер цилиндра (старший байт)
2288 clevermous 260
        mov     AL, AH
261
        out     DX, AL
3539 clevermous 262
        inc     DX      ;номер головки/номер диска
2288 clevermous 263
        mov     AL, [DiskNumber]
264
        shl     AL, 4
3539 clevermous 265
        cmp     [ATAHead], 0Fh;проверить номер головки
2288 clevermous 266
        ja      @@Err5
267
        or      AL, [ATAHead]
268
        or      AL, 10100000b
269
        mov     AH, [ATAAddressMode]
270
        shl     AH, 6
271
        or      AL, AH
272
        out     DX, AL
3539 clevermous 273
; Послать команду
2288 clevermous 274
        mov     AL, [ATACommand]
3539 clevermous 275
        inc     DX      ;регистр команд
2288 clevermous 276
        out     DX, AL
277
        sti
3539 clevermous 278
; Сбросить признак ошибки
2288 clevermous 279
        mov     [DevErrorCode], 0
280
        ret
3539 clevermous 281
; Записать код ошибки
2288 clevermous 282
@@Err1:
283
        mov     [DevErrorCode], 1
284
        ret
285
@@Err2:
286
        mov     [DevErrorCode], 2
287
        ret
288
@@Err3:
289
        mov     [DevErrorCode], 3
290
        ret
291
@@Err4:
292
        mov     [DevErrorCode], 4
293
        ret
294
@@Err5:
295
        mov     [DevErrorCode], 5
3539 clevermous 296
; Завершение работы программы
2288 clevermous 297
        ret
298
 
299
;*************************************************
3539 clevermous 300
;*     ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI    *
301
;* Входные параметры передаются через глобальные *
302
;* перменные:                                    *
303
;* ChannelNumber - номер канала;                 *
304
;* DiskNumber - номер диска на канале.           *
305
;* Идентификационный блок данных считывается     *
306
;* в массив Sector512.                           *
2288 clevermous 307
;*************************************************
308
ReadCD_ID:
3539 clevermous 309
; Задать режим CHS
2288 clevermous 310
        mov     [ATAAddressMode], 0
3539 clevermous 311
; Послать команду идентификации устройства
2288 clevermous 312
        mov     [ATAFeatures], 0
313
        mov     [ATASectorCount], 0
314
        mov     [ATASectorNumber], 0
315
        mov     [ATACylinder], 0
316
        mov     [ATAHead], 0
317
        mov     [ATACommand], 0A1h
318
        call    SendCommandToHDD
3539 clevermous 319
        cmp     [DevErrorCode], 0;проверить код ошибки
320
        jne     @@End_1  ;закончить, сохранив код ошибки
321
; Ожидать готовность данных HDD
2288 clevermous 322
        mov     DX, [ATABasePortAddr]
3539 clevermous 323
        add     DX, 7  ;порт 1х7h
2288 clevermous 324
        mov     ecx, 0xffff
325
@@WaitCompleet_1:
3539 clevermous 326
        ; Проверить врем
2288 clevermous 327
        dec     ecx
328
;        cmp    ecx,0
3539 clevermous 329
        jz      @@Error1_1 ;ошибка тайм-аута
330
        ; Проверить готовность
2288 clevermous 331
        in      AL, DX
3539 clevermous 332
        test    AL, 80h  ;состояние сигнала BSY
2288 clevermous 333
        jnz     @@WaitCompleet_1
3539 clevermous 334
        test    AL, 1    ;состояние сигнала ERR
2288 clevermous 335
        jnz     @@Error6_1
3539 clevermous 336
        test    AL, 08h  ;состояние сигнала DRQ
2288 clevermous 337
        jz      @@WaitCompleet_1
3539 clevermous 338
; Принять блок данных от контроллера
2288 clevermous 339
;        mov     AX,DS
340
;        mov     ES,AX
341
        mov     EDI, Sector512 ;offset Sector512
3539 clevermous 342
        mov     DX, [ATABasePortAddr];порт 1x0h
343
        mov     CX, 256;число считываемых слов
2288 clevermous 344
        rep insw
345
        ret
3539 clevermous 346
; Записать код ошибки
2288 clevermous 347
@@Error1_1:
348
        mov     [DevErrorCode], 1
349
        ret
350
@@Error6_1:
351
        mov     [DevErrorCode], 6
352
@@End_1:
353
        ret
354
 
355
;*************************************************
3539 clevermous 356
;*                СБРОС УСТРОЙСТВА               *
357
;* Входные параметры передаются через глобальные *
358
;* переменные:                                   *
359
;* ChannelNumber - номер канала (1 или 2);       *
360
;* DiskNumber - номер диска (0 или 1).           *
2288 clevermous 361
;*************************************************
362
DeviceReset:
3539 clevermous 363
; Проверить корректность номера канала
2288 clevermous 364
        mov     BX, [ChannelNumber]
365
        cmp     BX, 1
366
        jb      @@Err3_2
367
        cmp     BX, 2
368
        ja      @@Err3_2
3539 clevermous 369
; Установить базовый адрес
2288 clevermous 370
        dec     BX
371
        shl     BX, 1
372
        movzx   ebx, bx
373
        mov     DX, [ebx+StandardATABases]
374
        mov     [ATABasePortAddr], DX
3539 clevermous 375
; Выбрать нужный диск
376
        add     DX, 6   ;адрес регистра головок
2288 clevermous 377
        mov     AL, [DiskNumber]
3539 clevermous 378
        cmp     AL, 1   ;проверить номера диска
2288 clevermous 379
        ja      @@Err4_2
380
        shl     AL, 4
381
        or      AL, 10100000b
382
        out     DX, AL
3539 clevermous 383
; Послать команду "Сброс"
2288 clevermous 384
        mov     AL, 08h
3539 clevermous 385
        inc     DX      ;регистр команд
2288 clevermous 386
        out     DX, AL
387
        mov     ecx, 0x80000
388
@@WaitHDReady_1:
3539 clevermous 389
        ; Проверить время ожидани
2288 clevermous 390
        dec     ecx
391
;        cmp     ecx,0
3539 clevermous 392
        je      @@Err1_2 ;ошибка тайм-аута
393
        ; Прочитать регистр состояни
2288 clevermous 394
        in      AL, DX
3539 clevermous 395
        ; Проверить состояние сигнала BSY
2288 clevermous 396
        test    AL, 80h
397
        jnz     @@WaitHDReady_1
3539 clevermous 398
; Сбросить признак ошибки
2288 clevermous 399
        mov     [DevErrorCode], 0
400
        ret
3539 clevermous 401
; Обработка ошибок
2288 clevermous 402
@@Err1_2:
403
        mov     [DevErrorCode], 1
404
        ret
405
@@Err3_2:
406
        mov     [DevErrorCode], 3
407
        ret
408
@@Err4_2:
409
        mov     [DevErrorCode], 4
3539 clevermous 410
; Записать код ошибки
2288 clevermous 411
        ret
412
 
413
EndFindHDD:
414