Subversion Repositories Kolibri OS

Rev

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