Subversion Repositories Kolibri OS

Rev

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

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