Subversion Repositories Kolibri OS

Rev

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

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