Subversion Repositories Kolibri OS

Rev

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

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