Subversion Repositories Kolibri OS

Rev

Rev 387 | 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
           stdcall RegService, sz_sound_srv, service_proc
354
           ret
355
.fail:
356
     if DEBUG
357
           mov esi, msgFail
358
           call SysMsgBoardStr
359
     end if
360
           xor eax, eax
361
           ret
362
.stop:
363
           call stop
364
           xor eax, eax
365
           ret
366
endp
367
368
 
369
io_code    equ  IOCTL.io_code
370
input      equ  IOCTL.input
371
inp_size   equ  IOCTL.inp_size
372
output     equ  IOCTL.output
373
out_size   equ  IOCTL.out_size
374
375
 
376
proc service_proc stdcall, ioctl:dword
377
378
 
379
           mov eax, [edi+io_code]
380
           cmp eax, DEV_PLAY
381
           jne @F
382
     if DEBUG
383
           mov esi, msgPlay
384
           call SysMsgBoardStr
385
     end if
386
           call play
387
           ret
388
@@:
389
           cmp eax, DEV_STOP
390
           jne @F
391
     if DEBUG
392
           mov esi, msgStop
393
           call SysMsgBoardStr
394
     end if
395
           call stop
396
           ret
397
@@:
398
           cmp eax, DEV_CALLBACK
399
           jne @F
400
           mov ebx, [edi+input]
401
           stdcall set_callback, [ebx]
402
           ret
403
@@:
404
           cmp eax, DEV_SET_MASTERVOL
405
           jne @F
406
           mov eax, [edi+input]
378 serge 407
           mov eax, [eax]
408
           call set_master_vol      ;eax= vol
409
           ret
351 diamond 410
@@:
411
           cmp eax, DEV_GET_MASTERVOL
412
           jne @F
413
           mov ebx, [edi+output]
414
           stdcall get_master_vol, ebx
415
           ret
416
;@@:
378 serge 417
;           cmp eax, DEV_GET_INFO
418
;           jne @F
419
;           mov ebx, [edi+output]
420
;           stdcall get_dev_info, ebx
421
;           ret
422
@@:
351 diamond 423
.fail:
424
           or eax, -1
378 serge 425
           ret
351 diamond 426
endp
427
428
 
429
restore   io_code
430
restore   input
431
restore   inp_size
432
restore   output
433
restore   out_size
434
435
 
436
 
437
proc remap_irq                         ;for Intel chipsets ONLY !!!
438
           mov eax, VALID_IRQ
439
           bt eax, IRQ_LINE
440
           jnc .exit
441
442
 
443
           in ax,dx
444
           bts ax, IRQ_LINE
445
           out dx, aX
446
447
 
448
           mov [ctrl.int_line], IRQ_LINE
449
450
 
451
	   ret
452
endp
453
454
 
455
proc ac97_irq
456
457
 
458
;           mov esi, msgIRQ
459
;           call SysMsgBoardStr
460
;     end if
461
462
 
463
           mov al, 0x10;               0x10
464
           call [ctrl.ctrl_write8]
465
466
 
467
           mov edx, PCM_OUT_SR_REG
468
           call [ctrl.ctrl_write16]
469
470
 
471
           call [ctrl.ctrl_read8]
472
473
 
474
           cmp eax, [civ_val]
475
           je .skip
476
477
 
478
           dec eax
479
           and eax, 0x1F
480
           mov [ctrl.lvi_reg], eax
481
482
 
483
           call [ctrl.ctrl_write8]
484
485
 
486
           mov ax, 0x11              ;0x1D
487
           call [ctrl.ctrl_write8]
488
489
 
490
           add eax, 1
491
           and eax, 31
492
           mov ebx, dword [buff_list+eax*4]
493
494
 
495
           je @f
496
497
 
498
@@:
499
           ret
500
501
 
502
           mov edx, PCM_OUT_CR_REG
503
           mov ax, 0x11               ;0x1D
504
           call [ctrl.ctrl_write8]
505
           ret
506
endp
507
508
 
509
proc create_primary_buff
510
511
 
512
           mov [ctrl.buffer], eax
513
514
 
515
           mov ecx, 0x10000/4
516
           xor eax, eax
517
           cld
518
           rep stosd
519
520
 
521
           call GetPgAddr
522
523
 
524
           mov ecx, 4
525
           mov edi, pcmout_bdl
526
@@:
527
           mov [edi], eax
528
           mov [edi+4], ebx
529
530
 
531
           mov [edi+4+32], ebx
532
533
 
534
           mov [edi+4+64], ebx
535
536
 
537
           mov [edi+4+96], ebx
538
539
 
540
           mov [edi+4+128], ebx
541
542
 
543
           mov [edi+4+160], ebx
544
545
 
546
           mov [edi+4+192], ebx
547
548
 
549
           mov [edi+4+224], ebx
550
551
 
552
           add edi, 8
553
           loop @B
554
555
 
556
           mov eax, [ctrl.buffer]
557
           mov ecx, 4
558
@@:
559
           mov [edi], eax
560
           mov [edi+16], eax
561
           mov [edi+32], eax
562
           mov [edi+48], eax
563
           mov [edi+64], eax
564
           mov [edi+80], eax
565
           mov [edi+96], eax
566
           mov [edi+112], eax
567
568
 
569
           add edi, 4
570
           loop @B
571
572
 
573
           mov ebx, eax
574
           call GetPgAddr     ;eax
575
           and ebx, 0xFFF
576
           add eax, ebx
577
578
 
579
           call [ctrl.ctrl_write32]
580
581
 
582
           mov [ctrl.lvi_reg], eax
583
           mov edx, PCM_OUT_LVI_REG
584
           call [ctrl.ctrl_write8]
585
           ret
586
endp
587
588
 
589
proc detect_controller
590
	   locals
591
	     last_bus dd ?
592
	     bus      dd ?
593
	     devfn    dd ?
594
	   endl
595
596
 
597
           mov [bus], eax
598
           inc eax
599
           call PciApi
600
           cmp eax, -1
601
           je .err
602
603
 
604
605
 
606
           and [devfn], 0
607
.next_dev:
608
           stdcall PciRead32, [bus], [devfn], dword 0
609
           test eax, eax
610
           jz .next
611
           cmp eax, -1
612
           je .next
613
614
 
615
@@:
616
           mov ebx, [edi]
617
           test ebx, ebx
618
           jz .next
619
620
 
621
           je .found
622
           add edi, 12
623
           jmp @B
624
625
 
626
           inc [devfn]
627
           cmp [devfn], 256
628
           jb .next_dev
629
           mov eax, [bus]
630
           inc eax
631
           mov [bus], eax
632
           cmp eax, [last_bus]
633
           jna .next_bus
634
           xor eax, eax
635
           ret
636
.found:
637
           mov ebx, [bus]
638
           mov [ctrl.bus], ebx
639
640
 
641
           mov [ctrl.devfn], ecx
642
643
 
644
           and edx, 0xFFFF
645
           mov [ctrl.vendor], edx
646
           shr eax, 16
647
           mov [ctrl.dev_id], eax
648
649
 
650
           mov [ctrl.ctrl_ids], ebx
651
           mov esi, [edi+8]
652
           mov [ctrl.ctrl_setup], esi
653
654
 
655
           jne @F
656
           mov [ctrl.vendor_ids], msg_Intel
657
           ret
658
@@:
659
           cmp ebx, VID_NVIDIA
660
           jne @F
661
           mov [ctrl.vendor_ids], msg_NVidia
662
@@:
663
           mov [ctrl.vendor_ids], 0     ;something  wrong ?
664
           ret
665
.err:
666
           xor eax, eax
667
           ret
668
endp
669
670
 
671
proc get_LPC_bus                ;for Intel chipsets ONLY !!!
672
           locals
673
             last_bus dd ?
674
             bus      dd ?
675
           endl
676
677
 
678
           mov [bus], eax
679
           inc eax
680
           call [PciApi]
681
           cmp eax, -1
682
           je .err
683
684
 
685
.next_bus:
686
           stdcall PciRead32, [bus], dword 0xF8, dword 0
687
           test eax, eax
688
           jz .next
689
           cmp eax, -1
690
           je .next
691
692
 
693
           je .found
694
.next:
695
           mov eax, [bus]
696
           inc eax
697
           cmp eax, [last_bus]
698
           mov [bus], eax
699
           jna .next_bus
700
.err:
701
           xor eax, eax
702
           dec eax
703
           ret
704
.found:
705
           mov eax, [bus]
706
           ret
707
endp
708
709
 
710
proc init_controller
711
712
 
713
           mov ebx, eax
714
           and eax, 0xFFFF
715
           mov [ctrl.pci_cmd], eax
716
           shr ebx, 16
717
           mov [ctrl.pci_stat], ebx
718
719
 
720
           and eax,0xFFFE
721
           mov [ctrl.codec_io_base], eax
722
723
 
724
           and eax, 0xFFC0
725
           mov [ctrl.ctrl_io_base], eax
726
727
 
728
           mov [ctrl.codec_mem_base], eax
729
730
 
731
           mov [ctrl.ctrl_mem_base], eax
732
733
 
734
           and eax, 0xFF
735
           mov [ctrl.int_line], eax
736
737
 
738
           and eax, 0xFF
739
           mov [ctrl.cfg_reg], eax
740
741
 
742
           xor eax, eax
743
           inc eax
744
           ret
745
endp
746
747
 
748
proc set_ICH
749
           mov [ctrl.codec_read16],  codec_io_r16    ;virtual
750
           mov [ctrl.codec_write16], codec_io_w16    ;virtual
751
752
 
753
           mov [ctrl.ctrl_read16],  ctrl_io_r16      ;virtual
754
           mov [ctrl.ctrl_read32],  ctrl_io_r32      ;virtual
755
756
 
757
           mov [ctrl.ctrl_write16], ctrl_io_w16      ;virtual
758
           mov [ctrl.ctrl_write32], ctrl_io_w32      ;virtual
759
           ret
760
endp
761
762
 
378 serge 763
PG_NOCACHE       equ 0x018
764
351 diamond 765
 
766
proc set_ICH4
767
           stdcall AllocKernelSpace, dword 0x2000
768
           mov edi, eax
769
           stdcall MapPage, edi,[ctrl.codec_mem_base],PG_SW+PG_NOCACHE
770
           mov [ctrl.codec_mem_base], edi
771
           add edi, 0x1000
772
           stdcall MapPage, edi, [ctrl.ctrl_mem_base],PG_SW+PG_NOCACHE
773
           mov [ctrl.ctrl_mem_base], edi
774
775
 
776
           mov [ctrl.codec_write16], codec_mem_w16    ;virtual
777
778
 
779
           mov [ctrl.ctrl_read16],  ctrl_mem_r16      ;virtual
780
           mov [ctrl.ctrl_read32],  ctrl_mem_r32      ;virtual
781
782
 
783
           mov [ctrl.ctrl_write16], ctrl_mem_w16      ;virtual
784
           mov [ctrl.ctrl_write32], ctrl_mem_w32      ;virtual
785
           ret
786
endp
787
788
 
789
proc reset_controller
790
791
 
792
           mov edx, PCM_IN_CR_REG
793
           call [ctrl.ctrl_write8]
794
795
 
796
           call [ctrl.ctrl_write8]
797
798
 
799
           call [ctrl.ctrl_write8]
800
801
 
802
           mov edx, PCM_IN_CR_REG
803
           call [ctrl.ctrl_write8]
804
805
 
806
           call [ctrl.ctrl_write8]
807
808
 
809
           call [ctrl.ctrl_write8]
810
           ret
811
endp
812
813
 
814
proc init_codec
815
           locals
816
             counter dd ?
817
           endl
818
819
 
820
           call SysMsgBoardStr
821
822
 
823
           call [ctrl.ctrl_read32]
824
           call dword2str
825
           call SysMsgBoardStr
826
827
 
828
           call SysMsgBoardStr
829
830
 
831
           call [ctrl.ctrl_read32]
832
833
 
834
           call SysMsgBoardStr
835
836
 
837
           jnz .ready
838
839
 
840
           and eax, eax
841
           jz .err
842
843
 
844
           call [ctrl.codec_write16]
845
846
 
847
           mov edx, CODEC_REG_POWERDOWN
848
           call [ctrl.codec_write16]
849
850
 
851
.wait:
852
           mov edx, CODEC_REG_POWERDOWN
853
           call [ctrl.codec_read16]
854
           and eax, 0x0F
855
           cmp eax, 0x0F
856
           jz .ready
857
858
 
859
           call StallExec
860
           sub [counter] , 1
861
           jnz .wait
862
.err:
863
           xor eax, eax        ; timeout error
864
           ret
865
.ready:
866
           call detect_codec
867
868
 
869
           inc eax
870
           ret
871
endp
872
873
 
874
proc reset_codec
875
           mov edx, GLOB_CTRL
876
           call [ctrl.ctrl_read32]
877
878
 
879
           jz .cold
880
881
 
882
           jnc .ok
883
.cold:
884
           call cold_reset
885
           jnc .ok
886
887
 
888
           mov esi, msgCFail
889
           call SysMsgBoardStr
890
           end if
891
           xor eax, eax     ; timeout error
892
           ret
893
.ok:
894
     if DEBUG
895
           mov esi, msgResetOk
896
           call SysMsgBoardStr
897
     end if
898
899
 
900
           inc eax
901
           ret
902
endp
903
904
 
905
proc warm_reset
906
           locals
907
             counter dd ?
908
           endl
909
910
 
911
           mov edx, GLOB_CTRL
912
           call [ctrl.ctrl_write32]
913
914
 
915
           mov esi, msgWarm
916
           call SysMsgBoardStr
917
     end if
918
919
 
920
.wait:
921
           mov eax, 100000    ; wait 100 ms
922
           call StallExec
923
924
 
925
           call [ctrl.ctrl_read32]
926
           test eax, 4
927
           jz .ok
928
           sub [counter], 1
929
           jnz .wait
930
931
 
932
           mov esi, msgWRFail
933
           call SysMsgBoardStr
934
     end if
935
936
 
937
           ret
938
.ok:
939
           mov edx, CTRL_STAT
940
           call [ctrl.ctrl_read32]
941
           and eax, CTRL_ST_CREADY
942
           jz .fail
943
           clc
944
           ret
945
.fail:
946
           stc
947
	   ret
948
endp
949
950
 
951
proc cold_reset
952
           locals
953
             counter dd ?
954
           endl
955
956
 
957
           mov edx, GLOB_CTRL
958
           call [ctrl.ctrl_write32]
959
960
 
961
           mov esi, msgCold
962
           call SysMsgBoardStr
963
     end if
964
965
 
966
           call StallExec
967
968
 
969
           mov edx, GLOB_CTRL
970
           call [ctrl.ctrl_write32]
971
972
 
973
.wait:
974
           mov eax, 100000    ; wait 100 ms
975
           call StallExec
976
977
 
978
           call [ctrl.ctrl_read32]
979
           test eax, 4
980
           jz .ok
981
           sub [counter], 1
982
           jnz .wait
983
984
 
985
           mov esi, msgCRFail
986
           call SysMsgBoardStr
987
     end if
988
           stc
989
           ret
990
.ok:
991
           mov edx, CTRL_STAT
992
           call [ctrl.ctrl_read32]
993
           and eax, CTRL_ST_CREADY
994
           jz .fail
995
           clc
996
           ret
997
.fail:
998
           stc
999
           ret
1000
endp
1001
1002
 
1003
play:
378 serge 1004
           mov eax, 16
351 diamond 1005
           mov [ctrl.lvi_reg], eax
1006
           mov edx, PCM_OUT_LVI_REG
1007
           call [ctrl.ctrl_write8]
1008
1009
 
1010
           mov ax, 0x1D
1011
           call [ctrl.ctrl_write8]
1012
           xor eax, eax
378 serge 1013
           ret
351 diamond 1014
1015
 
1016
stop:
378 serge 1017
           mov edx, PCM_OUT_CR_REG
351 diamond 1018
           mov ax, 0x0
1019
           call [ctrl.ctrl_write8]
1020
1021
 
1022
           mov edx, PCM_OUT_SR_REG
1023
           call [ctrl.ctrl_write16]
1024
           xor eax, eax
378 serge 1025
           ret
351 diamond 1026
1027
 
1028
proc get_dev_info stdcall, p_info:dword
1029
           virtual at esi
1030
             CTRL_INFO CTRL_INFO
1031
           end virtual
1032
1033
 
1034
           mov eax, [ctrl.int_line]
1035
           mov ebx, [ctrl.codec_io_base]
1036
           mov ecx, [ctrl.ctrl_io_base]
1037
           mov edx, [ctrl.codec_mem_base]
1038
           mov edi, [ctrl.ctrl_mem_base]
1039
1040
 
1041
           mov [CTRL_INFO.codec_io_base], ebx
1042
           mov [CTRL_INFO.ctrl_io_base], ecx
1043
           mov [CTRL_INFO.codec_mem_base], edx
1044
           mov [CTRL_INFO.ctrl_mem_base], edi
1045
1046
 
1047
           mov [CTRL_INFO.codec_id], eax
1048
1049
 
1050
           call [ctrl.ctrl_read32]
1051
           mov [CTRL_INFO.glob_cntrl], eax
1052
1053
 
1054
           call [ctrl.ctrl_read32]
1055
           mov [CTRL_INFO.glob_sta], eax
1056
1057
 
1058
           mov [CTRL_INFO.pci_cmd], ebx
1059
           ret
1060
endp
1061
1062
 
1063
proc set_callback stdcall, handler:dword
1064
           mov eax, [handler]
1065
           mov [ctrl.user_callback], eax
1066
           ret
1067
endp
1068
1069
 
1070
proc codec_read stdcall, ac_reg:dword	   ; reg = edx, reval = eax
1071
1072
 
1073
1074
 
1075
           shr ebx, 1
1076
           bt [codec.shadow_flag], ebx
1077
           jc .use_shadow
1078
1079
 
1080
           mov ecx, eax
1081
1082
 
1083
           call [ctrl.ctrl_read32]
1084
           test eax, CTRL_ST_RCS
1085
           jz .read_ok
1086
1087
 
1088
           call [ctrl.ctrl_write32]
1089
           xor eax,eax
1090
           not eax  ;timeout
1091
           ret
1092
.read_ok:
1093
           mov edx, [ac_reg]
1094
           mov [codec.regs+edx], cx
1095
           bts [codec.shadow_flag], ebx
1096
           mov eax, ecx
1097
           ret
1098
.use_shadow:
1099
           movzx eax, word [codec.regs+edx]
1100
           ret
1101
endp
1102
1103
 
1104
proc codec_write stdcall, ac_reg:dword
1105
           push eax
1106
           call check_semafore
1107
           and eax, eax
1108
           jz .err
1109
           pop eax
1110
1111
 
1112
           mov edx, esi
1113
           call [ctrl.codec_write16]
1114
           mov [codec.regs+esi], ax
1115
           shr esi, 1
1116
           bts [codec.shadow_flag], esi
1117
           ret
1118
.err:
1119
           pop eax
1120
           ret
1121
endp
1122
1123
 
1124
proc codec_check_ready
1125
1126
 
1127
           call [ctrl.ctrl_read32]
1128
           and eax, CTRL_ST_CREADY
1129
           jz .not_ready
1130
1131
 
1132
           inc eax
1133
           ret
1134
.not_ready:
1135
           xor eax, eax
1136
           ret
1137
endp
1138
1139
 
1140
proc check_semafore
1141
           local counter:DWORD
1142
1143
 
1144
.l1:
1145
           mov edx, CTRL_CAS
1146
           call [ctrl.ctrl_read8]
1147
           and eax, CAS_FLAG
1148
           jz .ok
1149
1150
 
1151
           call StallExec
1152
           sub [counter], 1
1153
           jnz .l1
1154
           xor eax, eax
1155
           ret
1156
align 4
1157
.ok:
1158
           xor eax,eax
1159
           inc eax
1160
           ret
1161
endp
1162
1163
 
1164
proc StallExec
1165
           push ecx
1166
           push edx
1167
           push ebx
1168
           push eax
1169
1170
 
1171
           mul ecx
1172
           mov ebx, eax       ;low
1173
           mov ecx, edx       ;high
1174
           rdtsc
1175
           add ebx, eax
1176
           adc ecx,edx
1177
@@:
1178
           rdtsc
1179
           sub eax, ebx
1180
           sbb edx, ecx
1181
           js @B
1182
1183
 
1184
           pop ebx
1185
           pop edx
1186
           pop ecx
1187
           ret
1188
endp
1189
1190
 
1191
;          CONTROLLER IO functions
1192
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1193
1194
 
1195
proc codec_io_r16
1196
           add edx, [ctrl.codec_io_base]
1197
           in  ax, dx
1198
           ret
1199
endp
1200
1201
 
1202
proc codec_io_w16
1203
           add edx, [ctrl.codec_io_base]
1204
           out dx, ax
1205
           ret
1206
endp
1207
1208
 
1209
proc ctrl_io_r8
1210
           add edx, [ctrl.ctrl_io_base]
1211
           in  al, dx
1212
           ret
1213
endp
1214
1215
 
1216
proc ctrl_io_r16
1217
           add edx, [ctrl.ctrl_io_base]
1218
           in  ax, dx
1219
           ret
1220
endp
1221
1222
 
1223
proc ctrl_io_r32
1224
           add edx, [ctrl.ctrl_io_base]
1225
           in  eax, dx
1226
           ret
1227
endp
1228
1229
 
1230
proc ctrl_io_w8
1231
           add edx, [ctrl.ctrl_io_base]
1232
           out dx, al
1233
           ret
1234
endp
1235
1236
 
1237
proc ctrl_io_w16
1238
           add edx, [ctrl.ctrl_io_base]
1239
           out dx, ax
1240
           ret
1241
endp
1242
1243
 
1244
proc ctrl_io_w32
1245
           add edx, [ctrl.ctrl_io_base]
1246
           out dx, eax
1247
           ret
1248
endp
1249
1250
 
1251
;         MEMORY MAPPED IO    (os depended)
1252
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1253
1254
 
1255
proc codec_mem_r16
1256
           add edx, [ctrl.codec_mem_base]
1257
           mov ax, word [edx]
1258
           ret
1259
endp
1260
1261
 
1262
proc codec_mem_w16
1263
           add edx, [ctrl.codec_mem_base]
1264
           mov word [edx], ax
1265
           ret
1266
endp
1267
1268
 
1269
proc ctrl_mem_r8
1270
           add edx, [ctrl.ctrl_mem_base]
1271
           mov al, [edx]
1272
           ret
1273
endp
1274
1275
 
1276
proc ctrl_mem_r16
1277
           add edx, [ctrl.ctrl_mem_base]
1278
           mov ax, [edx]
1279
           ret
1280
endp
1281
1282
 
1283
proc ctrl_mem_r32
1284
           add edx, [ctrl.ctrl_mem_base]
1285
           mov eax, [edx]
1286
           ret
1287
endp
1288
1289
 
1290
proc ctrl_mem_w8
1291
           add edx, [ctrl.ctrl_mem_base]
1292
           mov [edx], al
1293
           ret
1294
endp
1295
1296
 
1297
proc ctrl_mem_w16
1298
           add edx, [ctrl.ctrl_mem_base]
1299
           mov [edx], ax
1300
           ret
1301
endp
1302
1303
 
1304
proc ctrl_mem_w32
1305
           add edx, [ctrl.ctrl_mem_base]
1306
           mov [edx], eax
1307
           ret
1308
endp
1309
1310
 
1311
dword2str:
1312
      mov  esi, hex_buff
1313
      mov ecx, -8
1314
@@:
1315
      rol eax, 4
1316
      mov ebx, eax
1317
      and ebx, 0x0F
1318
      mov bl, [ebx+hexletters]
1319
      mov [8+esi+ecx], bl
1320
      inc ecx
1321
      jnz @B
1322
      ret
1323
1324
 
1325
hex_buff     db 8 dup(0),13,10,0
1326
1327
 
1328
 
1329
1330
 
1331
devices dd (CTRL_ICH  shl 16)+VID_INTEL,msg_ICH, set_ICH
1332
        dd (CTRL_ICH0 shl 16)+VID_INTEL,msg_ICH0,set_ICH
378 serge 1333
        dd (CTRL_ICH2 shl 16)+VID_INTEL,msg_ICH2,set_ICH
1334
        dd (CTRL_ICH3 shl 16)+VID_INTEL,msg_ICH3,set_ICH
1335
        dd (CTRL_ICH4 shl 16)+VID_INTEL,msg_ICH4,set_ICH4
351 diamond 1336
        dd (CTRL_ICH5 shl 16)+VID_INTEL,msg_ICH5,set_ICH4
1337
        dd (CTRL_ICH6 shl 16)+VID_INTEL,msg_ICH6,set_ICH4
1338
        dd (CTRL_ICH7 shl 16)+VID_INTEL,msg_ICH7,set_ICH4
1339
1340
 
1341
        dd (CTRL_NFORCE2 shl 16)+VID_NVIDIA,msg_NForce2,set_ICH
1342
        dd (CTRL_NFORCE3 shl 16)+VID_NVIDIA,msg_NForce3,set_ICH
1343
        dd (CTRL_MCP04   shl 16)+VID_NVIDIA,msg_MCP04,set_ICH
1344
        dd (CTRL_CK804   shl 16)+VID_NVIDIA,msg_CK804,set_ICH
1345
        dd (CTRL_CK8     shl 16)+VID_NVIDIA,msg_CK8,set_ICH
1346
        dd (CTRL_CK8S    shl 16)+VID_NVIDIA,msg_CK8S,set_ICH
1347
        dd (CTRL_MCP51   shl 16)+VID_NVIDIA,msg_MCP51,set_ICH
1348
1349
 
1350
1351
 
378 serge 1352
351 diamond 1353
 
1354
msg_ICH0     db 'Intel ICH0', 13,10, 0
1355
msg_ICH2     db 'Intel ICH2', 13,10, 0
1356
msg_ICH3     db 'Intel ICH3', 13,10, 0
1357
msg_ICH4     db 'Intel ICH4', 13,10, 0
1358
msg_ICH5     db 'Intel ICH5', 13,10, 0
1359
msg_ICH6     db 'Intel ICH6', 13,10, 0
1360
msg_ICH7     db 'Intel ICH7', 13,10, 0
1361
msg_Intel    db 'Intel Corp. ', 0
1362
1363
 
1364
msg_NForce2  db 'NForce 2',    13,10, 0
1365
msg_NForce3  db 'NForce 3',    13,10, 0
1366
msg_MCP04    db 'NForce MCP04',13,10, 0
1367
msg_CK804    db 'NForce CK804',13,10, 0
1368
msg_CK8      db 'NForce CK8',  13,10, 0
1369
msg_CK8S     db 'NForce CK8S', 13,10, 0
1370
msg_MCP51    db 'NForce MCP51',13,10, 0
1371
1372
 
1373
1374
 
1375
sz_sound_srv	    db 'SOUND',0
1376
1377
 
1378
msgFail      db 'device not found',13,10,0
1379
msgAttchIRQ  db 'IRQ line not supported', 13,10, 0
1380
msgInvIRQ    db 'IRQ line not assigned or invalid', 13,10, 0
1381
msgPlay      db 'start play', 13,10,0
1382
msgStop      db 'stop play',  13,10,0
1383
msgNotify    db 'call notify',13,10,0
1384
msgIRQ       db 'AC97 IRQ', 13,10,0
1385
msgInitCtrl  db 'init controller',13,10,0
1386
msgInitCodec db 'init codec',13,10,0
1387
msgPrimBuff  db 'create primary buffer',13,10,0
1388
msgReg       db 'set service handler',13,10,0
1389
msgOk        db 'service installed',13,10,0
1390
msgCold      db 'cold reset',13,10,0
1391
msgWarm      db 'warm reset',13,10,0
1392
msgWRFail    db 'warm reset failed',13,10,0
1393
msgCRFail    db 'cold reset failed',13,10,0
1394
msgCFail     db 'codec not ready',13,10,0
1395
msgResetOk   db 'reset complete',13,10,0
1396
msgStatus    db 'global status   ',0
1397
msgControl   db 'global control  ',0
1398
1399
 
1400
1401
 
1402
buff_list        rd 32
1403
1404
 
1405
ctrl AC_CNTRL
1406
1407
 
1408
civ_val  rd 1
1409