Subversion Repositories Kolibri OS

Rev

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

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