Subversion Repositories Kolibri OS

Rev

Rev 227 | 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
112
113
 
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
119
DEV_GET_MASTERVOL     equ  7
120
DEV_GET_INFO	      equ  8
121
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	?
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
}
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
 
270
271
 
272
new_app_base	      equ 0x60400000;   0x01000000
273
PROC_BASE	      equ OS_BASE+0x0080000
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
 
233 serge 833
           call [ctrl.ctrl_read32]
834
           test eax, CTRL_ST_CREADY
835
           jnz .ready
836
168 serge 837
 
233 serge 838
           and eax, eax
839
           jz .err
840
168 serge 841
 
233 serge 842
           call [ctrl.codec_write16]
843
168 serge 844
 
233 serge 845
           mov edx, CODEC_REG_POWERDOWN
846
           call [ctrl.codec_write16]
847
848
 
849
.wait:
168 serge 850
           mov edx, CODEC_REG_POWERDOWN
233 serge 851
           call [ctrl.codec_read16]
852
           and eax, 0x0F
853
           cmp eax, 0x0F
854
           jz .ready
855
168 serge 856
 
233 serge 857
           call StallExec
858
           sub [counter] , 1
859
           jnz .wait
860
.err:
168 serge 861
           xor eax, eax        ; timeout error
233 serge 862
           ret
863
.ready:
168 serge 864
           call detect_codec
233 serge 865
168 serge 866
 
233 serge 867
           inc eax
868
           ret
869
endp
168 serge 870
871
 
872
proc reset_codec
873
           mov edx, GLOB_CTRL
233 serge 874
           call [ctrl.ctrl_read32]
875
168 serge 876
 
877
           jz .cold
878
879
 
880
           jnc .ok
881
.cold:
882
           call cold_reset
233 serge 883
           jnc .ok
884
168 serge 885
 
886
           mov esi, msgCFail
233 serge 887
           call SysMsgBoardStr
188 serge 888
           end if
233 serge 889
           xor eax, eax     ; timeout error
890
           ret
891
.ok:
168 serge 892
     if DEBUG
893
           mov esi, msgResetOk
894
           call SysMsgBoardStr
188 serge 895
     end if
168 serge 896
897
 
898
           inc eax
233 serge 899
           ret
900
endp
168 serge 901
902
 
903
proc warm_reset
904
           locals
233 serge 905
             counter dd ?
906
           endl
907
168 serge 908
 
233 serge 909
           mov edx, GLOB_CTRL
910
           call [ctrl.ctrl_write32]
911
168 serge 912
 
913
           mov esi, msgWarm
233 serge 914
           call SysMsgBoardStr
188 serge 915
     end if
168 serge 916
917
 
233 serge 918
.wait:
168 serge 919
           mov eax, 100000    ; wait 100 ms
233 serge 920
           call StallExec
921
168 serge 922
 
233 serge 923
           call [ctrl.ctrl_read32]
924
           test eax, 4
925
           jz .ok
926
           sub [counter], 1
927
           jnz .wait
928
168 serge 929
 
930
           mov esi, msgWRFail
233 serge 931
           call SysMsgBoardStr
188 serge 932
     end if
168 serge 933
934
 
233 serge 935
           ret
936
.ok:
168 serge 937
           mov edx, CTRL_STAT
233 serge 938
           call [ctrl.ctrl_read32]
939
           and eax, CTRL_ST_CREADY
940
           jz .fail
168 serge 941
           clc
942
           ret
233 serge 943
.fail:
168 serge 944
           stc
945
	   ret
946
endp
947
948
 
949
proc cold_reset
950
           locals
233 serge 951
             counter dd ?
952
           endl
953
168 serge 954
 
233 serge 955
           mov edx, GLOB_CTRL
956
           call [ctrl.ctrl_write32]
957
168 serge 958
 
959
           mov esi, msgCold
233 serge 960
           call SysMsgBoardStr
188 serge 961
     end if
168 serge 962
963
 
233 serge 964
           call StallExec
965
168 serge 966
 
233 serge 967
           mov edx, GLOB_CTRL
968
           call [ctrl.ctrl_write32]
969
168 serge 970
 
233 serge 971
.wait:
168 serge 972
           mov eax, 100000    ; wait 100 ms
233 serge 973
           call StallExec
974
168 serge 975
 
233 serge 976
           call [ctrl.ctrl_read32]
977
           test eax, 4
978
           jz .ok
979
           sub [counter], 1
980
           jnz .wait
981
168 serge 982
 
983
           mov esi, msgCRFail
233 serge 984
           call SysMsgBoardStr
188 serge 985
     end if
168 serge 986
           stc
233 serge 987
           ret
988
.ok:
168 serge 989
           mov edx, CTRL_STAT
233 serge 990
           call [ctrl.ctrl_read32]
991
           and eax, CTRL_ST_CREADY
992
           jz .fail
168 serge 993
           clc
994
           ret
233 serge 995
.fail:
168 serge 996
           stc
997
           ret
233 serge 998
endp
168 serge 999
1000
 
1001
proc play
1002
1003
 
233 serge 1004
           mov [ctrl.lvi_reg], eax
1005
           mov edx, PCM_OUT_LVI_REG
1006
           call [ctrl.ctrl_write8]
1007
168 serge 1008
 
233 serge 1009
           mov ax, 0x1D
1010
           call [ctrl.ctrl_write8]
1011
           ret
1012
endp
168 serge 1013
1014
 
1015
proc stop
1016
           mov edx, PCM_OUT_CR_REG
227 serge 1017
           mov ax, 0x0
233 serge 1018
           call [ctrl.ctrl_write8]
1019
168 serge 1020
 
224 serge 1021
           mov edx, PCM_OUT_SR_REG
233 serge 1022
           call [ctrl.ctrl_write16]
1023
           ret
1024
endp
168 serge 1025
1026
 
1027
proc get_dev_info stdcall, p_info:dword
1028
           virtual at esi
233 serge 1029
             CTRL_INFO CTRL_INFO
1030
           end virtual
1031
168 serge 1032
 
233 serge 1033
           mov eax, [ctrl.int_line]
1034
           mov ebx, [ctrl.codec_io_base]
1035
           mov ecx, [ctrl.ctrl_io_base]
1036
           mov edx, [ctrl.codec_mem_base]
1037
           mov edi, [ctrl.ctrl_mem_base]
1038
168 serge 1039
 
233 serge 1040
           mov [CTRL_INFO.codec_io_base], ebx
1041
           mov [CTRL_INFO.ctrl_io_base], ecx
1042
           mov [CTRL_INFO.codec_mem_base], edx
1043
           mov [CTRL_INFO.ctrl_mem_base], edi
1044
168 serge 1045
 
1046
           mov [CTRL_INFO.codec_id], eax
1047
1048
 
233 serge 1049
           call [ctrl.ctrl_read32]
168 serge 1050
           mov [CTRL_INFO.glob_cntrl], eax
233 serge 1051
168 serge 1052
 
233 serge 1053
           call [ctrl.ctrl_read32]
168 serge 1054
           mov [CTRL_INFO.glob_sta], eax
233 serge 1055
168 serge 1056
 
233 serge 1057
           mov [CTRL_INFO.pci_cmd], ebx
1058
           ret
1059
endp
168 serge 1060
1061
 
1062
proc set_callback stdcall, handler:dword
1063
           mov eax, [handler]
233 serge 1064
           mov [ctrl.user_callback], eax
1065
           ret
1066
endp
168 serge 1067
1068
 
1069
proc codec_read stdcall, ac_reg:dword	   ; reg = edx, reval = eax
1070
1071
 
233 serge 1072
168 serge 1073
 
233 serge 1074
           shr ebx, 1
1075
           bt [codec.shadow_flag], ebx
1076
           jc .use_shadow
1077
168 serge 1078
 
233 serge 1079
           mov ecx, eax
1080
168 serge 1081
 
233 serge 1082
           call [ctrl.ctrl_read32]
1083
           test eax, CTRL_ST_RCS
1084
           jz .read_ok
1085
168 serge 1086
 
233 serge 1087
           call [ctrl.ctrl_write32]
1088
           xor eax,eax
1089
           not eax  ;timeout
1090
           ret
1091
.read_ok:
168 serge 1092
           mov edx, [ac_reg]
233 serge 1093
           mov [codec.regs+edx], cx
1094
           bts [codec.shadow_flag], ebx
1095
           mov eax, ecx
1096
           ret
1097
.use_shadow:
168 serge 1098
           movzx eax, word [codec.regs+edx]
233 serge 1099
           ret
1100
endp
168 serge 1101
1102
 
1103
proc codec_write stdcall, ac_reg:dword
1104
           push eax
233 serge 1105
           call check_semafore
1106
           and eax, eax
1107
           jz .err
1108
           pop eax
1109
168 serge 1110
 
233 serge 1111
           mov edx, esi
1112
           call [ctrl.codec_write16]
1113
           mov [codec.regs+esi], ax
1114
           shr esi, 1
1115
           bts [codec.shadow_flag], esi
1116
           ret
1117
.err:
168 serge 1118
           pop eax
233 serge 1119
           ret
1120
endp
168 serge 1121
1122
 
1123
proc codec_check_ready
1124
1125
 
233 serge 1126
           call [ctrl.ctrl_read32]
1127
           and eax, CTRL_ST_CREADY
1128
           jz .not_ready
1129
168 serge 1130
 
233 serge 1131
           inc eax
1132
           ret
1133
.not_ready:
168 serge 1134
           xor eax, eax
233 serge 1135
           ret
1136
endp
168 serge 1137
1138
 
1139
proc check_semafore
1140
           local counter:DWORD
233 serge 1141
168 serge 1142
 
233 serge 1143
.l1:
168 serge 1144
           mov edx, CTRL_CAS
233 serge 1145
           call [ctrl.ctrl_read8]
1146
           and eax, CAS_FLAG
1147
           jz .ok
1148
168 serge 1149
 
233 serge 1150
           call StallExec
1151
           sub [counter], 1
1152
           jnz .l1
1153
           xor eax, eax
1154
           ret
1155
align 4
168 serge 1156
.ok:
1157
           xor eax,eax
233 serge 1158
           inc eax
1159
           ret
1160
endp
168 serge 1161
1162
 
1163
proc StallExec
1164
           push ecx
233 serge 1165
           push edx
1166
           push ebx
1167
           push eax
1168
168 serge 1169
 
233 serge 1170
           mul ecx
1171
           mov ebx, eax       ;low
1172
           mov ecx, edx       ;high
1173
           rdtsc
1174
           add ebx, eax
1175
           adc ecx,edx
1176
@@:
168 serge 1177
           rdtsc
233 serge 1178
           sub eax, ebx
1179
           sbb edx, ecx
1180
           js @B
1181
168 serge 1182
 
233 serge 1183
           pop ebx
1184
           pop edx
1185
           pop ecx
1186
           ret
1187
endp
168 serge 1188
1189
 
1190
;          CONTROLLER IO functions
1191
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1192
1193
 
1194
proc codec_io_r16
1195
           add edx, [ctrl.codec_io_base]
233 serge 1196
           in  ax, dx
1197
           ret
1198
endp
168 serge 1199
1200
 
1201
proc codec_io_w16
1202
           add edx, [ctrl.codec_io_base]
233 serge 1203
           out dx, ax
1204
           ret
1205
endp
168 serge 1206
1207
 
1208
proc ctrl_io_r8
1209
           add edx, [ctrl.ctrl_io_base]
233 serge 1210
           in  al, dx
1211
           ret
1212
endp
168 serge 1213
1214
 
1215
proc ctrl_io_r16
1216
           add edx, [ctrl.ctrl_io_base]
233 serge 1217
           in  ax, dx
1218
           ret
1219
endp
168 serge 1220
1221
 
1222
proc ctrl_io_r32
1223
           add edx, [ctrl.ctrl_io_base]
233 serge 1224
           in  eax, dx
1225
           ret
1226
endp
168 serge 1227
1228
 
1229
proc ctrl_io_w8
1230
           add edx, [ctrl.ctrl_io_base]
233 serge 1231
           out dx, al
1232
           ret
1233
endp
168 serge 1234
1235
 
1236
proc ctrl_io_w16
1237
           add edx, [ctrl.ctrl_io_base]
233 serge 1238
           out dx, ax
1239
           ret
1240
endp
168 serge 1241
1242
 
1243
proc ctrl_io_w32
1244
           add edx, [ctrl.ctrl_io_base]
233 serge 1245
           out dx, eax
1246
           ret
1247
endp
168 serge 1248
1249
 
1250
;         MEMORY MAPPED IO    (os depended)
1251
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1252
1253
 
1254
proc codec_mem_r16
1255
           add edx, [ctrl.codec_mem_base]
233 serge 1256
           mov ax, word [edx]
1257
           ret
1258
endp
168 serge 1259
1260
 
1261
proc codec_mem_w16
1262
           add edx, [ctrl.codec_mem_base]
233 serge 1263
           mov word [edx], ax
1264
           ret
1265
endp
168 serge 1266
1267
 
1268
proc ctrl_mem_r8
1269
           add edx, [ctrl.ctrl_mem_base]
233 serge 1270
           mov al, [edx]
1271
           ret
1272
endp
168 serge 1273
1274
 
1275
proc ctrl_mem_r16
1276
           add edx, [ctrl.ctrl_mem_base]
233 serge 1277
           mov ax, [edx]
1278
           ret
1279
endp
168 serge 1280
1281
 
1282
proc ctrl_mem_r32
1283
           add edx, [ctrl.ctrl_mem_base]
233 serge 1284
           mov eax, [edx]
1285
           ret
1286
endp
168 serge 1287
1288
 
1289
proc ctrl_mem_w8
1290
           add edx, [ctrl.ctrl_mem_base]
233 serge 1291
           mov [edx], al
1292
           ret
1293
endp
168 serge 1294
1295
 
1296
proc ctrl_mem_w16
1297
           add edx, [ctrl.ctrl_mem_base]
233 serge 1298
           mov [edx], ax
1299
           ret
1300
endp
168 serge 1301
1302
 
1303
proc ctrl_mem_w32
1304
           add edx, [ctrl.ctrl_mem_base]
233 serge 1305
           mov [edx], eax
1306
           ret
1307
endp
168 serge 1308
1309
 
1310
 
1311
1312
 
188 serge 1313
devices dd (CTRL_ICH  shl 16)+VID_INTEL,msg_ICH, set_ICH
168 serge 1314
	dd (CTRL_ICH0 shl 16)+VID_INTEL,msg_ICH0,set_ICH
1315
	dd (CTRL_ICH2 shl 16)+VID_INTEL,msg_ICH2,set_ICH
1316
	dd (CTRL_ICH3 shl 16)+VID_INTEL,msg_ICH3,set_ICH
1317
        dd (CTRL_ICH4 shl 16)+VID_INTEL,msg_ICH4,set_ICH4
1318
        dd (CTRL_ICH5 shl 16)+VID_INTEL,msg_ICH5,set_ICH4
1319
        dd (CTRL_ICH6 shl 16)+VID_INTEL,msg_ICH6,set_ICH4
1320
        dd (CTRL_ICH7 shl 16)+VID_INTEL,msg_ICH7,set_ICH4
1321
1322
 
1323
        dd (CTRL_NFORCE2 shl 16)+VID_NVIDIA,msg_NForce2,set_ICH
1324
        dd (CTRL_NFORCE3 shl 16)+VID_NVIDIA,msg_NForce3,set_ICH
1325
        dd (CTRL_MCP04   shl 16)+VID_NVIDIA,msg_MCP04,set_ICH
198 serge 1326
        dd (CTRL_CK804   shl 16)+VID_NVIDIA,msg_CK804,set_ICH
1327
        dd (CTRL_CK8     shl 16)+VID_NVIDIA,msg_CK8,set_ICH
1328
        dd (CTRL_CK8S    shl 16)+VID_NVIDIA,msg_CK8S,set_ICH
1329
        dd (CTRL_MCP51   shl 16)+VID_NVIDIA,msg_MCP51,set_ICH
1330
168 serge 1331
 
1332
1333
 
227 serge 1334
1335
 
168 serge 1336
msg_ICH0     db 'Intel ICH0', 13,10, 0
1337
msg_ICH2     db 'Intel ICH2', 13,10, 0
1338
msg_ICH3     db 'Intel ICH3', 13,10, 0
1339
msg_ICH4     db 'Intel ICH4', 13,10, 0
1340
msg_ICH5     db 'Intel ICH5', 13,10, 0
1341
msg_ICH6     db 'Intel ICH6', 13,10, 0
1342
msg_ICH7     db 'Intel ICH7', 13,10, 0
1343
msg_Intel    db 'Intel Corp. ', 0
1344
1345
 
198 serge 1346
msg_NForce2  db 'NForce 2',    13,10, 0
1347
msg_NForce3  db 'NForce 3',    13,10, 0
1348
msg_MCP04    db 'NForce MCP04',13,10, 0
1349
msg_CK804    db 'NForce CK804',13,10, 0
1350
msg_CK8      db 'NForce CK8',  13,10, 0
1351
msg_CK8S     db 'NForce CK8S', 13,10, 0
1352
msg_MCP51    db 'NForce MCP51',13,10, 0
1353
168 serge 1354
 
198 serge 1355
1356
 
168 serge 1357
sz_sound_srv	    db 'SOUND',0
1358
1359
 
1360
msgFail      db 'device not found',13,10,0
1361
msgAttchIRQ  db 'IRQ line not supported', 13,10, 0
1362
msgInvIRQ    db 'IRQ line not assigned or invalid', 13,10, 0
1363
msgPlay      db 'start play', 13,10,0
1364
msgStop      db 'stop play',  13,10,0
1365
msgNotify    db 'call notify',13,10,0
1366
msgIRQ	     db 'AC97 IRQ', 13,10,0
1367
msgInitCtrl  db 'init controller',13,10,0
1368
msgInitCodec db 'init codec',13,10,0
1369
msgPrimBuff  db 'create primary buffer',13,10,0
1370
msgReg	     db 'set service handler',13,10,0
1371
msgOk	     db 'service installed',13,10,0
1372
msgCold      db 'cold reset',13,10,0
1373
msgWarm      db 'warm reset',13,10,0
1374
msgWRFail    db 'warm reset failed',13,10,0
1375
msgCRFail    db 'cold reset failed',13,10,0
1376
msgCFail     db 'codec not ready',13,10,0
1377
msgResetOk   db 'reset complete',13,10,0
1378
1379
 
188 serge 1380
1381
 
1382
buff_list        rd 32
1383
1384
 
1385
ctrl AC_CNTRL
1386
1387
 
1388
civ_val  rd 1
1389