Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
168 serge 1
 
2
3
 
4
 
5
6
 
7
8
 
9
10
 
11
;               FEDCBA9876543210
12
VALID_IRQ   equ 1100111011111000b
13
ATTCH_IRQ   equ 0000111010101000b
14
15
 
16
17
 
18
19
 
20
BIT1  EQU 0x00000002
21
BIT2  EQU 0x00000004
22
BIT3  EQU 0x00000008
23
BIT4  EQU 0x00000010
24
BIT5  EQU 0x00000020
25
BIT6  EQU 0x00000040
26
BIT7  EQU 0x00000080
27
BIT8  EQU 0x00000100
28
BIT9  EQU 0x00000200
29
BIT10 EQU 0x00000400
30
BIT11 EQU 0x00000800
31
BIT12 EQU 0x00001000
32
BIT13 EQU 0x00002000
33
BIT14 EQU 0x00004000
34
BIT15 EQU 0x00008000
35
BIT16 EQU 0x00010000
36
BIT17 EQU 0x00020000
37
BIT18 EQU 0x00040000
38
BIT19 EQU 0x00080000
39
BIT20 EQU 0x00100000
40
BIT21 EQU 0x00200000
41
BIT22 EQU 0x00400000
42
BIT23 EQU 0x00800000
43
BIT24 EQU 0x00100000
44
BIT25 EQU 0x02000000
45
BIT26 EQU 0x04000000
46
BIT27 EQU 0x08000000
47
BIT28 EQU 0x10000000
48
BIT29 EQU 0x20000000
49
BIT30 EQU 0x40000000
50
BIT31 EQU 0x80000000
51
52
 
53
VID_NVIDIA        equ 0x10DE
54
55
 
56
CTRL_ICH0	  equ 0x2425
57
CTRL_ICH2	  equ 0x2435
58
CTRL_ICH3	  equ 0x2445
59
CTRL_ICH4	  equ 0x24C5
60
CTRL_ICH5	  equ 0x24D5
61
CTRL_ICH6	  equ 0x266E
62
CTRL_ICH7	  equ 0x27DE
63
64
 
65
CTRL_NFORCE2      equ 0x006A
66
CTRL_NFORCE3      equ 0x00DA
67
CTRL_MCP04        equ 0x003A
198 serge 68
CTRL_CK804        equ 0x0059
69
CTRL_CK8          equ 0x008A
70
CTRL_CK8S         equ 0x00EA
71
CTRL_MCP51        equ 0x026B
72
168 serge 73
 
74
 
75
PCM_OUT_CR_REG	  equ  0x1b	 ; PCM out Control Register
76
PCM_OUT_LVI_REG   equ  0x15	 ; PCM last valid index
77
PCM_OUT_SR_REG	  equ  0x16	 ; PCM out Status register
78
PCM_OUT_PIV_REG   equ  0x1a
79
PCM_OUT_CIV_REG   equ  0x14	 ; PCM out current index
80
81
 
82
MC_IN_CR_REG	  equ  0x2b	 ; MIC in Control Register
83
RR		  equ  BIT1	 ; reset registers.  Nukes all regs
84
85
 
86
CODEC_AUX_VOL			equ	0x04	;
87
CODEC_PCM_OUT_REG		equ	18h	; PCM output volume
88
CODEC_EXT_AUDIO_REG		equ	28h	; extended audio
89
CODEC_EXT_AUDIO_CTRL_REG	equ	2ah	; extended audio control
90
CODEC_PCM_FRONT_DACRATE_REG	equ	2ch	; PCM out sample rate
91
CODEC_PCM_SURND_DACRATE_REG	equ	2eh	; surround sound sample rate
92
CODEC_PCM_LFE_DACRATE_REG	equ	30h	; LFE sample rate
93
94
 
95
CTRL_STAT	equ  0x30	 ;   Global Status
96
CTRL_CAS	equ  0x34	 ;   Codec Access Semiphore
97
98
 
99
100
 
101
102
 
103
104
 
105
CTRL_CNT_AC_OFF equ  0x00000008  ;   ACLINK Off
106
CTRL_CNT_WARM	equ  0x00000004  ;   AC97 Warm Reset
107
CTRL_CNT_COLD	equ  0x00000002  ;   AC97 Cold Reset
108
CTRL_CNT_GIE	equ  0x00000001  ;   GPI Interrupt Enable
109
110
 
111
CODEC_REG_ST          equ 0x26
247 serge 112
168 serge 113
 
247 serge 114
DEV_STOP              equ  2
115
DEV_CALLBACK          equ  3
116
DEV_SET_BUFF          equ  4
117
DEV_NOTIFY            equ  5
118
DEV_SET_MASTERVOL     equ  6
168 serge 119
DEV_GET_MASTERVOL     equ  7
120
DEV_GET_INFO          equ  8
247 serge 121
168 serge 122
 
123
{ .bus                dd ?
188 serge 124
  .devfn              dd ?
125
168 serge 126
 
188 serge 127
  .dev_id             dd ?
128
  .pci_cmd            dd ?
129
  .pci_stat           dd ?
130
168 serge 131
 
188 serge 132
  .codec_mem_base     dd ?
133
168 serge 134
 
188 serge 135
  .ctrl_mem_base      dd ?
136
  .cfg_reg            dd ?
137
  .int_line           dd ?
138
168 serge 139
 
188 serge 140
  .ctrl_ids           dd ?    ;hub id string
141
168 serge 142
 
188 serge 143
168 serge 144
 
188 serge 145
  .notify_task        dd ?
146
168 serge 147
 
188 serge 148
  .ctrl_setup         dd ?
149
  .user_callback      dd ?
150
  .codec_read16       dd ?
151
  .codec_write16      dd ?
152
168 serge 153
 
188 serge 154
  .ctrl_read16        dd ?
155
  .ctrl_read32        dd ?
156
168 serge 157
 
188 serge 158
  .ctrl_write16       dd ?
159
  .ctrl_write32       dd ?
160
}
168 serge 161
162
 
163
{
164
  .chip_id            dd ?
188 serge 165
  .flags              dd ?
166
  .status             dd ?
167
168 serge 168
 
188 serge 169
  .chip_ids           dd ?    ;chip model string
170
168 serge 171
 
188 serge 172
                      dd ?
173
168 serge 174
 
188 serge 175
  .reg_master_vol     dw ?     ;0x02
176
  .reg_aux_out_vol    dw ?     ;0x04
177
  .reg_mone_vol       dw ?     ;0x06
178
  .reg_master_tone    dw ?     ;0x08
179
  .reg_beep_vol       dw ?     ;0x0A
180
  .reg_phone_vol      dw ?     ;0x0C
181
  .reg_mic_vol        dw ?     ;0x0E
182
  .reg_line_in_vol    dw ?     ;0x10
183
  .reg_cd_vol         dw ?     ;0x12
184
  .reg_video_vol      dw ?     ;0x14
185
  .reg_aux_in_vol     dw ?     ;0x16
186
  .reg_pcm_out_vol    dw ?     ;0x18
187
  .reg_rec_select     dw ?     ;0x1A
188
  .reg_rec_gain       dw ?     ;0x1C
189
  .reg_rec_gain_mic   dw ?     ;0x1E
190
  .reg_gen            dw ?     ;0x20
191
  .reg_3d_ctrl        dw ?     ;0X22
192
  .reg_page           dw ?     ;0X24
193
  .reg_powerdown      dw ?     ;0x26
194
  .reg_ext_audio      dw ?     ;0x28
195
  .reg_ext_st         dw ?     ;0x2a
196
  .reg_pcm_front_rate dw ?     ;0x2c
197
  .reg_pcm_surr_rate  dw ?     ;0x2e
198
  .reg_lfe_rate       dw ?     ;0x30
199
  .reg_pcm_in_rate    dw ?     ;0x32
200
                      dw ?     ;0x34
201
  .reg_cent_lfe_vol   dw ?     ;0x36
202
  .reg_surr_vol       dw ?     ;0x38
203
  .reg_spdif_ctrl     dw ?     ;0x3A
204
                      dw ?     ;0x3C
205
                      dw ?     ;0x3E
206
                      dw ?     ;0x40
207
                      dw ?     ;0x42
208
                      dw ?     ;0x44
209
                      dw ?     ;0x46
210
                      dw ?     ;0x48
211
                      dw ?     ;0x4A
212
                      dw ?     ;0x4C
213
                      dw ?     ;0x4E
214
                      dw ?     ;0x50
215
                      dw ?     ;0x52
216
                      dw ?     ;0x54
217
                      dw ?     ;0x56
218
                      dw ?     ;0x58
219
                      dw ?     ;0x5A
220
                      dw ?     ;0x5C
221
                      dw ?     ;0x5E
222
  .reg_page_0         dw ?     ;0x60
223
  .reg_page_1         dw ?     ;0x62
224
  .reg_page_2         dw ?     ;0x64
225
  .reg_page_3         dw ?     ;0x66
226
  .reg_page_4         dw ?     ;0x68
227
  .reg_page_5         dw ?     ;0x6A
228
  .reg_page_6         dw ?     ;0x6C
229
  .reg_page_7         dw ?     ;0x6E
230
                      dw ?     ;0x70
231
                      dw ?     ;0x72
232
                      dw ?     ;0x74
233
                      dw ?     ;0x76
234
                      dw ?     ;0x78
235
                      dw ?     ;0x7A
236
  .reg_vendor_id_1    dw ?     ;0x7C
237
  .reg_vendor_id_2    dw ?     ;0x7E
238
168 serge 239
 
240
 
188 serge 241
  .set_master_vol     dd ?
242
}
168 serge 243
244
 
245
{   .pci_cmd         dd ?
247 serge 246
    .irq             dd ?
247
    .glob_cntrl      dd ?
248
    .glob_sta        dd ?
249
    .codec_io_base   dd ?
250
    .ctrl_io_base    dd ?
251
    .codec_mem_base  dd ?
252
    .ctrl_mem_base   dd ?
253
    .codec_id        dd ?
254
}
168 serge 255
256
 
257
{  .handle           dd ?
258
   .io_code          dd ?
259
   .input            dd ?
260
   .inp_size         dd ?
261
   .output           dd ?
262
   .out_size         dd ?
263
}
264
265
 
266
  IOCTL IOCTL
267
end virtual
268
269
 
247 serge 270
168 serge 271
 
247 serge 272
new_app_base    equ 0x60400000
273
PROC_BASE	      equ OS_BASE+0x0080000
168 serge 274
275
 
188 serge 276
public service_proc
168 serge 277
public version
227 serge 278
168 serge 279
 
188 serge 280
extrn SysMsgBoardStr
281
extrn PciApi
282
extrn PciRead32
283
extrn PciRead8
284
extrn PciWrite8
285
extrn AllocKernelSpace
286
extrn MapPage
287
extrn RegService
288
extrn KernelAlloc
289
extrn GetPgAddr
290
extrn GetCurrentTask
291
168 serge 292
 
188 serge 293
294
 
214 serge 295
296
 
227 serge 297
           jne .stop
224 serge 298
214 serge 299
 
168 serge 300
           mov esi, msgInit
233 serge 301
           call SysMsgBoardStr
188 serge 302
     end if
168 serge 303
304
 
233 serge 305
           test eax, eax
306
           jz .fail
168 serge 307
308
 
309
           mov esi,[ctrl.vendor_ids]
233 serge 310
           call SysMsgBoardStr
188 serge 311
           mov esi, [ctrl.ctrl_ids]
233 serge 312
           call SysMsgBoardStr
188 serge 313
168 serge 314
 
315
316
 
317
           test eax, eax
318
           jz .fail
319
320
 
321
           mov esi, msgInitCodec
322
           call SysMsgBoardStr
188 serge 323
     end if
168 serge 324
325
 
326
           test eax, eax
327
           jz .fail
328
329
 
330
           mov esi, [codec.ac_vendor_ids]
233 serge 331
           call SysMsgBoardStr
188 serge 332
168 serge 333
 
233 serge 334
           call SysMsgBoardStr
188 serge 335
     end if
168 serge 336
337
 
338
           call setup_codec
339
340
 
341
           call SysMsgBoardStr
188 serge 342
168 serge 343
 
344
345
 
346
347
 
348
;           cmp eax, -1
349
;           jz .fail
350
351
 
352
;           call remap_irq
353
;     end if
354
355
 
356
           mov ebx, [ctrl.int_line]
357
           mov esi, msgInvIRQ
358
           bt eax, ebx
359
           jnc .fail
360
           mov eax, ATTCH_IRQ
361
           mov esi, msgAttchIRQ
362
           bt eax, ebx
363
           jnc .fail
364
365
 
188 serge 366
           stdcall RegService, sz_sound_srv, service_proc
367
           ret
233 serge 368
.fail:
168 serge 369
     if DEBUG
370
           mov esi, msgFail
233 serge 371
           call SysMsgBoardStr
188 serge 372
     end if
168 serge 373
           xor eax, eax
233 serge 374
           ret
188 serge 375
.stop:
214 serge 376
           call stop
377
           xor eax, eax
227 serge 378
           ret
214 serge 379
endp
380
168 serge 381
 
382
io_code    equ  IOCTL.io_code
383
input      equ  IOCTL.input
384
inp_size   equ  IOCTL.inp_size
385
output     equ  IOCTL.output
386
out_size   equ  IOCTL.out_size
387
388
 
389
proc service_proc stdcall, ioctl:dword
390
391
 
392
           mov eax, [edi+io_code]
393
           cmp eax, DEV_PLAY
233 serge 394
           jne @F
395
     if DEBUG
168 serge 396
           mov esi, msgPlay
233 serge 397
           call SysMsgBoardStr
188 serge 398
     end if
168 serge 399
           call play
233 serge 400
           ret
401
@@:
168 serge 402
           cmp eax, DEV_STOP
233 serge 403
           jne @F
404
     if DEBUG
168 serge 405
           mov esi, msgStop
233 serge 406
           call SysMsgBoardStr
188 serge 407
     end if
168 serge 408
           call stop
233 serge 409
           ret
410
@@:
168 serge 411
           cmp eax, DEV_CALLBACK
233 serge 412
           jne @F
413
           mov ebx, [edi+input]
168 serge 414
           stdcall set_callback, [ebx]
415
           ret
233 serge 416
@@:
168 serge 417
           cmp eax, DEV_SET_MASTERVOL
233 serge 418
           jne @F
419
           mov ebx, [edi+input]
168 serge 420
           stdcall set_master_vol, [ebx]
421
           ret
233 serge 422
@@:
168 serge 423
           cmp eax, DEV_GET_MASTERVOL
233 serge 424
           jne @F
425
           mov ebx, [edi+output]
168 serge 426
           test ebx, ebx
427
           jz .fail
428
429
 
430
           ret
233 serge 431
@@:
168 serge 432
           cmp eax, DEV_GET_INFO
233 serge 433
           jne @F
434
           mov ebx, [edi+output]
168 serge 435
           stdcall get_dev_info, ebx
233 serge 436
           ret
437
@@:
168 serge 438
.fail:
439
           xor eax, eax
233 serge 440
           ret
441
endp
168 serge 442
443
 
444
restore   io_code
445
restore   input
446
restore   inp_size
447
restore   output
448
restore   out_size
449
450
 
451
 
452
proc remap_irq                         ;for Intel chipsets ONLY !!!
453
           mov eax, VALID_IRQ
233 serge 454
           bt eax, IRQ_LINE
455
           jnc .exit
456
168 serge 457
 
233 serge 458
           in ax,dx
459
           bts ax, IRQ_LINE
460
           out dx, aX
461
168 serge 462
 
188 serge 463
           mov [ctrl.int_line], IRQ_LINE
233 serge 464
168 serge 465
 
466
	   ret
467
endp
468
469
 
470
proc ac97_irq
471
472
 
473
;           mov esi, msgIRQ
474
;           call SysMsgBoardStr
188 serge 475
;     end if
168 serge 476
477
 
233 serge 478
           mov al, 0x14
479
           call [ctrl.ctrl_write8]
480
168 serge 481
 
233 serge 482
           mov edx, PCM_OUT_SR_REG
483
           call [ctrl.ctrl_write16]
484
168 serge 485
 
233 serge 486
           call [ctrl.ctrl_read8]
487
168 serge 488
 
233 serge 489
           cmp eax, [civ_val]
490
           je .skip
491
168 serge 492
 
233 serge 493
           dec eax
494
           and eax, 0x1F
495
           mov [ctrl.lvi_reg], eax
496
168 serge 497
 
233 serge 498
           call [ctrl.ctrl_write8]
499
168 serge 500
 
233 serge 501
           mov ax, 0x1D
502
           call [ctrl.ctrl_write8]
503
168 serge 504
 
233 serge 505
           add eax, 2
506
           and eax, 31
507
           mov ebx, dword [buff_list+eax*4]
508
168 serge 509
 
233 serge 510
           je @f
511
168 serge 512
 
233 serge 513
@@:
168 serge 514
           ret
233 serge 515
168 serge 516
 
517
           mov edx, PCM_OUT_CR_REG
233 serge 518
           mov ax, 0x1D
519
           call [ctrl.ctrl_write8]
520
           ret
521
endp
168 serge 522
523
 
524
proc create_primary_buff
525
526
 
188 serge 527
           mov [ctrl.buffer], eax
233 serge 528
168 serge 529
 
233 serge 530
           mov ecx, 0x10000/4
531
           xor eax, eax
532
           cld
168 serge 533
           rep stosd
233 serge 534
168 serge 535
 
188 serge 536
168 serge 537
 
233 serge 538
           mov ecx, 4
539
           mov edi, pcmout_bdl
540
@@:
168 serge 541
           mov [edi], eax
233 serge 542
           mov [edi+4], ebx
543
168 serge 544
 
233 serge 545
           mov [edi+4+32], ebx
546
168 serge 547
 
233 serge 548
           mov [edi+4+64], ebx
549
168 serge 550
 
233 serge 551
           mov [edi+4+96], ebx
552
168 serge 553
 
233 serge 554
           mov [edi+4+128], ebx
555
168 serge 556
 
233 serge 557
           mov [edi+4+160], ebx
558
168 serge 559
 
233 serge 560
           mov [edi+4+192], ebx
561
168 serge 562
 
233 serge 563
           mov [edi+4+224], ebx
564
168 serge 565
 
233 serge 566
           add edi, 8
567
           loop @B
568
168 serge 569
 
233 serge 570
           mov eax, [ctrl.buffer]
571
           mov ecx, 4
572
@@:
168 serge 573
           mov [edi], eax
233 serge 574
           mov [edi+16], eax
575
           mov [edi+32], eax
576
           mov [edi+48], eax
577
           mov [edi+64], eax
578
           mov [edi+80], eax
579
           mov [edi+96], eax
580
           mov [edi+112], eax
581
168 serge 582
 
233 serge 583
           add edi, 4
584
           loop @B
585
168 serge 586
 
233 serge 587
           stdcall GetPgAddr, ecx
188 serge 588
           and ecx, 0xFFF
233 serge 589
           add eax, ecx
590
168 serge 591
 
233 serge 592
           call [ctrl.ctrl_write32]
593
168 serge 594
 
233 serge 595
           mov [ctrl.lvi_reg], eax
596
           mov edx, PCM_OUT_LVI_REG
597
           call [ctrl.ctrl_write8]
598
           ret
599
endp
168 serge 600
601
 
602
proc detect_controller
603
	   locals
604
	     last_bus dd ?
605
	     bus      dd ?
606
	     devfn    dd ?
607
	   endl
608
609
 
233 serge 610
           mov [bus], eax
611
           inc eax
612
           call PciApi
188 serge 613
           cmp eax, -1
233 serge 614
           je .err
615
168 serge 616
 
233 serge 617
168 serge 618
 
619
           and [devfn], 0
233 serge 620
.next_dev:
168 serge 621
           stdcall PciRead32, [bus], [devfn], dword 0
188 serge 622
           test eax, eax
233 serge 623
           jz .next
624
           cmp eax, -1
625
           je .next
626
168 serge 627
 
233 serge 628
@@:
168 serge 629
           mov ebx, [edi]
233 serge 630
           test ebx, ebx
631
           jz .next
632
168 serge 633
 
233 serge 634
           je .found
635
           add edi, 12
636
           jmp @B
637
168 serge 638
 
233 serge 639
           inc [devfn]
640
           cmp [devfn], 256
641
           jb .next_dev
642
           mov eax, [bus]
643
           inc eax
644
           mov [bus], eax
645
           cmp eax, [last_bus]
646
           jna .next_bus
647
           xor eax, eax
648
           ret
649
.found:
168 serge 650
           mov ebx, [bus]
233 serge 651
           mov [ctrl.bus], ebx
652
168 serge 653
 
233 serge 654
           mov [ctrl.devfn], ecx
655
168 serge 656
 
233 serge 657
           and edx, 0xFFFF
658
           mov [ctrl.vendor], edx
659
           shr eax, 16
660
           mov [ctrl.dev_id], eax
661
168 serge 662
 
233 serge 663
           mov [ctrl.ctrl_ids], ebx
664
           mov esi, [edi+8]
665
           mov [ctrl.ctrl_setup], esi
666
168 serge 667
 
668
           jne @F
669
           mov [ctrl.vendor_ids], msg_Intel
233 serge 670
           ret
168 serge 671
@@:
672
           cmp ebx, VID_NVIDIA
673
           jne @F
674
           mov [ctrl.vendor_ids], msg_NVidia
675
@@:
676
           mov [ctrl.vendor_ids], 0     ;something  wrong ?
677
           ret
233 serge 678
.err:
168 serge 679
           xor eax, eax
233 serge 680
           ret
681
endp
168 serge 682
683
 
684
proc get_LPC_bus                ;for Intel chipsets ONLY !!!
685
           locals
233 serge 686
             last_bus dd ?
687
             bus      dd ?
688
           endl
689
168 serge 690
 
233 serge 691
           mov [bus], eax
692
           inc eax
693
           call [PciApi]
694
           cmp eax, -1
695
           je .err
696
168 serge 697
 
233 serge 698
.next_bus:
168 serge 699
           stdcall PciRead32, [bus], dword 0xF8, dword 0
188 serge 700
           test eax, eax
233 serge 701
           jz .next
702
           cmp eax, -1
703
           je .next
704
168 serge 705
 
233 serge 706
           je .found
707
.next:
168 serge 708
           mov eax, [bus]
233 serge 709
           inc eax
710
           cmp eax, [last_bus]
711
           mov [bus], eax
712
           jna .next_bus
713
.err:
168 serge 714
           xor eax, eax
233 serge 715
           dec eax
716
           ret
717
.found:
168 serge 718
           mov eax, [bus]
233 serge 719
           ret
720
endp
168 serge 721
722
 
723
proc init_controller
724
725
 
188 serge 726
           mov ebx, eax
233 serge 727
           and eax, 0xFFFF
728
           mov [ctrl.pci_cmd], eax
729
           shr ebx, 16
730
           mov [ctrl.pci_stat], ebx
731
168 serge 732
 
188 serge 733
           and eax,0xFFFE
233 serge 734
           mov [ctrl.codec_io_base], eax
735
168 serge 736
 
188 serge 737
           and eax, 0xFFC0
233 serge 738
           mov [ctrl.ctrl_io_base], eax
739
168 serge 740
 
188 serge 741
           mov [ctrl.codec_mem_base], eax
233 serge 742
168 serge 743
 
188 serge 744
           mov [ctrl.ctrl_mem_base], eax
233 serge 745
168 serge 746
 
188 serge 747
           and eax, 0xFF
233 serge 748
           mov [ctrl.int_line], eax
749
168 serge 750
 
188 serge 751
           and eax, 0xFF
233 serge 752
           mov [ctrl.cfg_reg], eax
753
168 serge 754
 
233 serge 755
           xor eax, eax
756
           inc eax
757
           ret
758
endp
168 serge 759
760
 
761
proc set_ICH
762
           mov [ctrl.codec_read16],  codec_io_r16    ;virtual
233 serge 763
           mov [ctrl.codec_write16], codec_io_w16    ;virtual
764
168 serge 765
 
233 serge 766
           mov [ctrl.ctrl_read16],  ctrl_io_r16      ;virtual
767
           mov [ctrl.ctrl_read32],  ctrl_io_r32      ;virtual
768
168 serge 769
 
233 serge 770
           mov [ctrl.ctrl_write16], ctrl_io_w16      ;virtual
771
           mov [ctrl.ctrl_write32], ctrl_io_w32      ;virtual
772
           ret
773
endp
168 serge 774
775
 
776
PG_NOCACHE           equ 0x018
777
778
 
779
proc set_ICH4
780
           stdcall AllocKernelSpace, dword 0x2000
188 serge 781
           mov edi, eax
233 serge 782
           stdcall MapPage, edi,[ctrl.codec_mem_base],PG_SW+PG_NOCACHE
188 serge 783
           mov [ctrl.codec_mem_base], edi
233 serge 784
           add edi, 0x1000
785
           stdcall MapPage, edi, [ctrl.ctrl_mem_base],PG_SW+PG_NOCACHE
188 serge 786
           mov [ctrl.ctrl_mem_base], edi
233 serge 787
168 serge 788
 
233 serge 789
           mov [ctrl.codec_write16], codec_mem_w16    ;virtual
790
168 serge 791
 
233 serge 792
           mov [ctrl.ctrl_read16],  ctrl_mem_r16      ;virtual
793
           mov [ctrl.ctrl_read32],  ctrl_mem_r32      ;virtual
794
168 serge 795
 
233 serge 796
           mov [ctrl.ctrl_write16], ctrl_mem_w16      ;virtual
797
           mov [ctrl.ctrl_write32], ctrl_mem_w32      ;virtual
798
           ret
799
endp
168 serge 800
801
 
802
proc reset_controller
803
804
 
233 serge 805
           mov edx, PCM_IN_CR_REG
806
           call [ctrl.ctrl_write8]
807
168 serge 808
 
233 serge 809
           call [ctrl.ctrl_write8]
810
168 serge 811
 
233 serge 812
           call [ctrl.ctrl_write8]
813
168 serge 814
 
233 serge 815
           mov edx, PCM_IN_CR_REG
816
           call [ctrl.ctrl_write8]
817
168 serge 818
 
233 serge 819
           call [ctrl.ctrl_write8]
820
168 serge 821
 
233 serge 822
           call [ctrl.ctrl_write8]
823
           ret
824
endp
168 serge 825
826
 
827
proc init_codec
828
           locals
233 serge 829
             counter dd ?
830
           endl
831
168 serge 832
 
247 serge 833
           call SysMsgBoardStr
834
835
 
836
           call [ctrl.ctrl_read32]
837
           call dword2str
838
           call SysMsgBoardStr
839
840
 
841
           call SysMsgBoardStr
842
843
 
233 serge 844
           call [ctrl.ctrl_read32]
845
247 serge 846
 
847
           call SysMsgBoardStr
848
849
 
233 serge 850
           jnz .ready
851
168 serge 852
 
233 serge 853
           and eax, eax
854
           jz .err
855
168 serge 856
 
233 serge 857
           call [ctrl.codec_write16]
858
168 serge 859
 
233 serge 860
           mov edx, CODEC_REG_POWERDOWN
861
           call [ctrl.codec_write16]
862
863
 
864
.wait:
168 serge 865
           mov edx, CODEC_REG_POWERDOWN
233 serge 866
           call [ctrl.codec_read16]
867
           and eax, 0x0F
868
           cmp eax, 0x0F
869
           jz .ready
870
168 serge 871
 
233 serge 872
           call StallExec
873
           sub [counter] , 1
874
           jnz .wait
875
.err:
168 serge 876
           xor eax, eax        ; timeout error
233 serge 877
           ret
878
.ready:
168 serge 879
           call detect_codec
233 serge 880
168 serge 881
 
233 serge 882
           inc eax
883
           ret
884
endp
168 serge 885
886
 
887
proc reset_codec
888
           mov edx, GLOB_CTRL
233 serge 889
           call [ctrl.ctrl_read32]
890
168 serge 891
 
892
           jz .cold
893
894
 
895
           jnc .ok
896
.cold:
897
           call cold_reset
233 serge 898
           jnc .ok
899
168 serge 900
 
901
           mov esi, msgCFail
233 serge 902
           call SysMsgBoardStr
188 serge 903
           end if
233 serge 904
           xor eax, eax     ; timeout error
905
           ret
906
.ok:
168 serge 907
     if DEBUG
908
           mov esi, msgResetOk
909
           call SysMsgBoardStr
188 serge 910
     end if
168 serge 911
912
 
913
           inc eax
233 serge 914
           ret
915
endp
168 serge 916
917
 
918
proc warm_reset
919
           locals
233 serge 920
             counter dd ?
921
           endl
922
168 serge 923
 
233 serge 924
           mov edx, GLOB_CTRL
925
           call [ctrl.ctrl_write32]
926
168 serge 927
 
928
           mov esi, msgWarm
233 serge 929
           call SysMsgBoardStr
188 serge 930
     end if
168 serge 931
932
 
233 serge 933
.wait:
168 serge 934
           mov eax, 100000    ; wait 100 ms
233 serge 935
           call StallExec
936
168 serge 937
 
233 serge 938
           call [ctrl.ctrl_read32]
939
           test eax, 4
940
           jz .ok
941
           sub [counter], 1
942
           jnz .wait
943
168 serge 944
 
945
           mov esi, msgWRFail
233 serge 946
           call SysMsgBoardStr
188 serge 947
     end if
168 serge 948
949
 
233 serge 950
           ret
951
.ok:
168 serge 952
           mov edx, CTRL_STAT
233 serge 953
           call [ctrl.ctrl_read32]
954
           and eax, CTRL_ST_CREADY
955
           jz .fail
168 serge 956
           clc
957
           ret
233 serge 958
.fail:
168 serge 959
           stc
960
	   ret
961
endp
962
963
 
964
proc cold_reset
965
           locals
233 serge 966
             counter dd ?
967
           endl
968
168 serge 969
 
233 serge 970
           mov edx, GLOB_CTRL
971
           call [ctrl.ctrl_write32]
972
168 serge 973
 
974
           mov esi, msgCold
233 serge 975
           call SysMsgBoardStr
188 serge 976
     end if
168 serge 977
978
 
233 serge 979
           call StallExec
980
168 serge 981
 
233 serge 982
           mov edx, GLOB_CTRL
983
           call [ctrl.ctrl_write32]
984
168 serge 985
 
233 serge 986
.wait:
168 serge 987
           mov eax, 100000    ; wait 100 ms
233 serge 988
           call StallExec
989
168 serge 990
 
233 serge 991
           call [ctrl.ctrl_read32]
992
           test eax, 4
993
           jz .ok
994
           sub [counter], 1
995
           jnz .wait
996
168 serge 997
 
998
           mov esi, msgCRFail
233 serge 999
           call SysMsgBoardStr
188 serge 1000
     end if
168 serge 1001
           stc
233 serge 1002
           ret
1003
.ok:
168 serge 1004
           mov edx, CTRL_STAT
233 serge 1005
           call [ctrl.ctrl_read32]
1006
           and eax, CTRL_ST_CREADY
1007
           jz .fail
168 serge 1008
           clc
1009
           ret
233 serge 1010
.fail:
168 serge 1011
           stc
1012
           ret
233 serge 1013
endp
168 serge 1014
1015
 
1016
proc play
1017
1018
 
233 serge 1019
           mov [ctrl.lvi_reg], eax
1020
           mov edx, PCM_OUT_LVI_REG
1021
           call [ctrl.ctrl_write8]
1022
168 serge 1023
 
233 serge 1024
           mov ax, 0x1D
1025
           call [ctrl.ctrl_write8]
1026
           ret
1027
endp
168 serge 1028
1029
 
1030
proc stop
1031
           mov edx, PCM_OUT_CR_REG
227 serge 1032
           mov ax, 0x0
233 serge 1033
           call [ctrl.ctrl_write8]
1034
168 serge 1035
 
224 serge 1036
           mov edx, PCM_OUT_SR_REG
233 serge 1037
           call [ctrl.ctrl_write16]
1038
           ret
1039
endp
168 serge 1040
1041
 
1042
proc get_dev_info stdcall, p_info:dword
1043
           virtual at esi
233 serge 1044
             CTRL_INFO CTRL_INFO
1045
           end virtual
1046
168 serge 1047
 
233 serge 1048
           mov eax, [ctrl.int_line]
1049
           mov ebx, [ctrl.codec_io_base]
1050
           mov ecx, [ctrl.ctrl_io_base]
1051
           mov edx, [ctrl.codec_mem_base]
1052
           mov edi, [ctrl.ctrl_mem_base]
1053
168 serge 1054
 
233 serge 1055
           mov [CTRL_INFO.codec_io_base], ebx
1056
           mov [CTRL_INFO.ctrl_io_base], ecx
1057
           mov [CTRL_INFO.codec_mem_base], edx
1058
           mov [CTRL_INFO.ctrl_mem_base], edi
1059
168 serge 1060
 
1061
           mov [CTRL_INFO.codec_id], eax
1062
1063
 
233 serge 1064
           call [ctrl.ctrl_read32]
168 serge 1065
           mov [CTRL_INFO.glob_cntrl], eax
233 serge 1066
168 serge 1067
 
233 serge 1068
           call [ctrl.ctrl_read32]
168 serge 1069
           mov [CTRL_INFO.glob_sta], eax
233 serge 1070
168 serge 1071
 
233 serge 1072
           mov [CTRL_INFO.pci_cmd], ebx
1073
           ret
1074
endp
168 serge 1075
1076
 
1077
proc set_callback stdcall, handler:dword
1078
           mov eax, [handler]
233 serge 1079
           mov [ctrl.user_callback], eax
1080
           ret
1081
endp
168 serge 1082
1083
 
1084
proc codec_read stdcall, ac_reg:dword	   ; reg = edx, reval = eax
1085
1086
 
233 serge 1087
168 serge 1088
 
233 serge 1089
           shr ebx, 1
1090
           bt [codec.shadow_flag], ebx
1091
           jc .use_shadow
1092
168 serge 1093
 
233 serge 1094
           mov ecx, eax
1095
168 serge 1096
 
233 serge 1097
           call [ctrl.ctrl_read32]
1098
           test eax, CTRL_ST_RCS
1099
           jz .read_ok
1100
168 serge 1101
 
233 serge 1102
           call [ctrl.ctrl_write32]
1103
           xor eax,eax
1104
           not eax  ;timeout
1105
           ret
1106
.read_ok:
168 serge 1107
           mov edx, [ac_reg]
233 serge 1108
           mov [codec.regs+edx], cx
1109
           bts [codec.shadow_flag], ebx
1110
           mov eax, ecx
1111
           ret
1112
.use_shadow:
168 serge 1113
           movzx eax, word [codec.regs+edx]
233 serge 1114
           ret
1115
endp
168 serge 1116
1117
 
1118
proc codec_write stdcall, ac_reg:dword
1119
           push eax
233 serge 1120
           call check_semafore
1121
           and eax, eax
1122
           jz .err
1123
           pop eax
1124
168 serge 1125
 
233 serge 1126
           mov edx, esi
1127
           call [ctrl.codec_write16]
1128
           mov [codec.regs+esi], ax
1129
           shr esi, 1
1130
           bts [codec.shadow_flag], esi
1131
           ret
1132
.err:
168 serge 1133
           pop eax
233 serge 1134
           ret
1135
endp
168 serge 1136
1137
 
1138
proc codec_check_ready
1139
1140
 
233 serge 1141
           call [ctrl.ctrl_read32]
1142
           and eax, CTRL_ST_CREADY
1143
           jz .not_ready
1144
168 serge 1145
 
233 serge 1146
           inc eax
1147
           ret
1148
.not_ready:
168 serge 1149
           xor eax, eax
233 serge 1150
           ret
1151
endp
168 serge 1152
1153
 
1154
proc check_semafore
1155
           local counter:DWORD
233 serge 1156
168 serge 1157
 
233 serge 1158
.l1:
168 serge 1159
           mov edx, CTRL_CAS
233 serge 1160
           call [ctrl.ctrl_read8]
1161
           and eax, CAS_FLAG
1162
           jz .ok
1163
168 serge 1164
 
233 serge 1165
           call StallExec
1166
           sub [counter], 1
1167
           jnz .l1
1168
           xor eax, eax
1169
           ret
1170
align 4
168 serge 1171
.ok:
1172
           xor eax,eax
233 serge 1173
           inc eax
1174
           ret
1175
endp
168 serge 1176
1177
 
1178
proc StallExec
1179
           push ecx
233 serge 1180
           push edx
1181
           push ebx
1182
           push eax
1183
168 serge 1184
 
233 serge 1185
           mul ecx
1186
           mov ebx, eax       ;low
1187
           mov ecx, edx       ;high
1188
           rdtsc
1189
           add ebx, eax
1190
           adc ecx,edx
1191
@@:
168 serge 1192
           rdtsc
233 serge 1193
           sub eax, ebx
1194
           sbb edx, ecx
1195
           js @B
1196
168 serge 1197
 
233 serge 1198
           pop ebx
1199
           pop edx
1200
           pop ecx
1201
           ret
1202
endp
168 serge 1203
1204
 
1205
;          CONTROLLER IO functions
1206
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1207
1208
 
1209
proc codec_io_r16
1210
           add edx, [ctrl.codec_io_base]
233 serge 1211
           in  ax, dx
1212
           ret
1213
endp
168 serge 1214
1215
 
1216
proc codec_io_w16
1217
           add edx, [ctrl.codec_io_base]
233 serge 1218
           out dx, ax
1219
           ret
1220
endp
168 serge 1221
1222
 
1223
proc ctrl_io_r8
1224
           add edx, [ctrl.ctrl_io_base]
233 serge 1225
           in  al, dx
1226
           ret
1227
endp
168 serge 1228
1229
 
1230
proc ctrl_io_r16
1231
           add edx, [ctrl.ctrl_io_base]
233 serge 1232
           in  ax, dx
1233
           ret
1234
endp
168 serge 1235
1236
 
1237
proc ctrl_io_r32
1238
           add edx, [ctrl.ctrl_io_base]
233 serge 1239
           in  eax, dx
1240
           ret
1241
endp
168 serge 1242
1243
 
1244
proc ctrl_io_w8
1245
           add edx, [ctrl.ctrl_io_base]
233 serge 1246
           out dx, al
1247
           ret
1248
endp
168 serge 1249
1250
 
1251
proc ctrl_io_w16
1252
           add edx, [ctrl.ctrl_io_base]
233 serge 1253
           out dx, ax
1254
           ret
1255
endp
168 serge 1256
1257
 
1258
proc ctrl_io_w32
1259
           add edx, [ctrl.ctrl_io_base]
233 serge 1260
           out dx, eax
1261
           ret
1262
endp
168 serge 1263
1264
 
1265
;         MEMORY MAPPED IO    (os depended)
1266
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1267
1268
 
1269
proc codec_mem_r16
1270
           add edx, [ctrl.codec_mem_base]
233 serge 1271
           mov ax, word [edx]
1272
           ret
1273
endp
168 serge 1274
1275
 
1276
proc codec_mem_w16
1277
           add edx, [ctrl.codec_mem_base]
233 serge 1278
           mov word [edx], ax
1279
           ret
1280
endp
168 serge 1281
1282
 
1283
proc ctrl_mem_r8
1284
           add edx, [ctrl.ctrl_mem_base]
233 serge 1285
           mov al, [edx]
1286
           ret
1287
endp
168 serge 1288
1289
 
1290
proc ctrl_mem_r16
1291
           add edx, [ctrl.ctrl_mem_base]
233 serge 1292
           mov ax, [edx]
1293
           ret
1294
endp
168 serge 1295
1296
 
1297
proc ctrl_mem_r32
1298
           add edx, [ctrl.ctrl_mem_base]
233 serge 1299
           mov eax, [edx]
1300
           ret
1301
endp
168 serge 1302
1303
 
1304
proc ctrl_mem_w8
1305
           add edx, [ctrl.ctrl_mem_base]
233 serge 1306
           mov [edx], al
1307
           ret
1308
endp
168 serge 1309
1310
 
1311
proc ctrl_mem_w16
1312
           add edx, [ctrl.ctrl_mem_base]
233 serge 1313
           mov [edx], ax
1314
           ret
1315
endp
168 serge 1316
1317
 
1318
proc ctrl_mem_w32
1319
           add edx, [ctrl.ctrl_mem_base]
233 serge 1320
           mov [edx], eax
1321
           ret
1322
endp
168 serge 1323
1324
 
247 serge 1325
dword2str:
1326
      mov  esi, hex_buff
1327
      mov ecx, -8
1328
@@:
1329
      rol eax, 4
1330
      mov ebx, eax
1331
      and ebx, 0x0F
1332
      mov bl, [ebx+hexletters]
1333
      mov [8+esi+ecx], bl
1334
      inc ecx
1335
      jnz @B
1336
      ret
1337
168 serge 1338
 
247 serge 1339
hex_buff     db 8 dup(0),13,10,0
1340
1341
 
1342
 
168 serge 1343
1344
 
188 serge 1345
devices dd (CTRL_ICH  shl 16)+VID_INTEL,msg_ICH, set_ICH
168 serge 1346
	dd (CTRL_ICH0 shl 16)+VID_INTEL,msg_ICH0,set_ICH
1347
	dd (CTRL_ICH2 shl 16)+VID_INTEL,msg_ICH2,set_ICH
1348
	dd (CTRL_ICH3 shl 16)+VID_INTEL,msg_ICH3,set_ICH
1349
        dd (CTRL_ICH4 shl 16)+VID_INTEL,msg_ICH4,set_ICH4
1350
        dd (CTRL_ICH5 shl 16)+VID_INTEL,msg_ICH5,set_ICH4
1351
        dd (CTRL_ICH6 shl 16)+VID_INTEL,msg_ICH6,set_ICH4
1352
        dd (CTRL_ICH7 shl 16)+VID_INTEL,msg_ICH7,set_ICH4
1353
1354
 
1355
        dd (CTRL_NFORCE2 shl 16)+VID_NVIDIA,msg_NForce2,set_ICH
1356
        dd (CTRL_NFORCE3 shl 16)+VID_NVIDIA,msg_NForce3,set_ICH
1357
        dd (CTRL_MCP04   shl 16)+VID_NVIDIA,msg_MCP04,set_ICH
198 serge 1358
        dd (CTRL_CK804   shl 16)+VID_NVIDIA,msg_CK804,set_ICH
1359
        dd (CTRL_CK8     shl 16)+VID_NVIDIA,msg_CK8,set_ICH
1360
        dd (CTRL_CK8S    shl 16)+VID_NVIDIA,msg_CK8S,set_ICH
1361
        dd (CTRL_MCP51   shl 16)+VID_NVIDIA,msg_MCP51,set_ICH
1362
168 serge 1363
 
1364
1365
 
227 serge 1366
1367
 
168 serge 1368
msg_ICH0     db 'Intel ICH0', 13,10, 0
1369
msg_ICH2     db 'Intel ICH2', 13,10, 0
1370
msg_ICH3     db 'Intel ICH3', 13,10, 0
1371
msg_ICH4     db 'Intel ICH4', 13,10, 0
1372
msg_ICH5     db 'Intel ICH5', 13,10, 0
1373
msg_ICH6     db 'Intel ICH6', 13,10, 0
1374
msg_ICH7     db 'Intel ICH7', 13,10, 0
1375
msg_Intel    db 'Intel Corp. ', 0
1376
1377
 
198 serge 1378
msg_NForce2  db 'NForce 2',    13,10, 0
1379
msg_NForce3  db 'NForce 3',    13,10, 0
1380
msg_MCP04    db 'NForce MCP04',13,10, 0
1381
msg_CK804    db 'NForce CK804',13,10, 0
1382
msg_CK8      db 'NForce CK8',  13,10, 0
1383
msg_CK8S     db 'NForce CK8S', 13,10, 0
1384
msg_MCP51    db 'NForce MCP51',13,10, 0
1385
168 serge 1386
 
198 serge 1387
1388
 
168 serge 1389
sz_sound_srv	    db 'SOUND',0
1390
1391
 
1392
msgFail      db 'device not found',13,10,0
1393
msgAttchIRQ  db 'IRQ line not supported', 13,10, 0
1394
msgInvIRQ    db 'IRQ line not assigned or invalid', 13,10, 0
1395
msgPlay      db 'start play', 13,10,0
1396
msgStop      db 'stop play',  13,10,0
1397
msgNotify    db 'call notify',13,10,0
1398
msgIRQ       db 'AC97 IRQ', 13,10,0
247 serge 1399
msgInitCtrl  db 'init controller',13,10,0
168 serge 1400
msgInitCodec db 'init codec',13,10,0
1401
msgPrimBuff  db 'create primary buffer',13,10,0
1402
msgReg       db 'set service handler',13,10,0
247 serge 1403
msgOk        db 'service installed',13,10,0
1404
msgCold      db 'cold reset',13,10,0
168 serge 1405
msgWarm      db 'warm reset',13,10,0
1406
msgWRFail    db 'warm reset failed',13,10,0
1407
msgCRFail    db 'cold reset failed',13,10,0
1408
msgCFail     db 'codec not ready',13,10,0
1409
msgResetOk   db 'reset complete',13,10,0
1410
msgStatus    db 'global status   ',0
247 serge 1411
msgControl   db 'global control  ',0
1412
168 serge 1413
 
188 serge 1414
1415
 
1416
buff_list        rd 32
1417
1418
 
1419
ctrl AC_CNTRL
1420
1421
 
1422
civ_val  rd 1
1423