Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
168 serge 1
 
2
3
 
4
 
5
6
 
7
8
 
9
10
 
11
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
 
233 serge 696
           call [ctrl.ctrl_read32]
697
           test eax, CTRL_ST_CREADY
698
           jnz .ready
699
168 serge 700
 
233 serge 701
           and eax, eax
702
           jz .err
703
168 serge 704
 
233 serge 705
           call [ctrl.codec_write16]
706
168 serge 707
 
233 serge 708
           mov edx, CODEC_REG_POWERDOWN
709
           call [ctrl.codec_write16]
710
711
 
712
.wait:
168 serge 713
           mov edx, CODEC_REG_POWERDOWN
233 serge 714
           call [ctrl.codec_read16]
715
           and eax, 0x0F
716
           cmp eax, 0x0F
717
           je .ready
718
168 serge 719
 
233 serge 720
           call StallExec
721
           sub [counter] , 1
722
           jnz .wait
723
.err:
168 serge 724
           xor eax, eax        ; timeout error
233 serge 725
           ret
726
.ready:
168 serge 727
           call detect_codec
233 serge 728
168 serge 729
 
233 serge 730
           inc eax
731
           ret
732
endp
168 serge 733
734
 
735
proc reset_codec
736
           mov edx, GLOB_CTRL
227 serge 737
           call [ctrl.ctrl_read32]
738
168 serge 739
 
740
           jz .cold
741
742
 
743
           jnc .ok
744
.cold:
745
           call cold_reset
227 serge 746
           jnc .ok
747
168 serge 748
 
749
           mov esi, msgCFail
227 serge 750
           call SysMsgBoardStr
188 serge 751
     end if
168 serge 752
           xor eax, eax     ; timeout error
227 serge 753
           ret
754
.ok:
168 serge 755
           xor eax, eax
756
           inc eax
227 serge 757
           ret
758
endp
168 serge 759
760
 
761
proc warm_reset
762
           locals
227 serge 763
             counter dd ?
764
           endl
765
168 serge 766
 
227 serge 767
           mov edx, GLOB_CTRL
768
           call [ctrl.ctrl_write32]
769
168 serge 770
 
771
           mov esi, msgWarm
227 serge 772
           call SysMsgBoardStr
188 serge 773
     end if
168 serge 774
775
 
227 serge 776
.wait:
168 serge 777
           mov eax, 100000    ; wait 100 ms
227 serge 778
           call StallExec
779
168 serge 780
 
227 serge 781
           call [ctrl.ctrl_read32]
782
           test eax, 4
783
           jz .ok
784
           sub [counter], 1
785
           jnz .wait
786
168 serge 787
 
788
           mov esi, msgWRFail
227 serge 789
           call SysMsgBoardStr
188 serge 790
     end if
168 serge 791
           stc
227 serge 792
           ret
793
.ok:
168 serge 794
           mov edx, CTRL_STAT
227 serge 795
           call [ctrl.ctrl_read32]
796
           and eax, CTRL_ST_CREADY
797
           jz .fail
168 serge 798
           clc
799
           ret
227 serge 800
.fail:
168 serge 801
           stc
802
           ret
227 serge 803
endp
168 serge 804
805
 
806
proc cold_reset
807
           locals
227 serge 808
             counter dd ?
809
            endl
810
168 serge 811
 
227 serge 812
           call [ctrl.ctrl_read32]
233 serge 813
           and eax, not 0x08
814
           or eax, 0x02
815
           mov edx, GLOB_CTRL
816
           call [ctrl.ctrl_write32]
227 serge 817
168 serge 818
 
819
           mov esi, msgCold
227 serge 820
           call SysMsgBoardStr
188 serge 821
     end if
168 serge 822
823
 
227 serge 824
.wait:
168 serge 825
           mov eax, 100000    ; wait 100 ms
227 serge 826
           call StallExec
827
168 serge 828
 
227 serge 829
           call [ctrl.ctrl_read32]
830
           test eax, 4
831
           jz .ok
832
           sub [counter], 1
833
           jnz .wait
834
168 serge 835
 
836
           mov esi, msgCRFail
227 serge 837
           call SysMsgBoardStr
188 serge 838
     end if
168 serge 839
.fail:
233 serge 840
           stc
227 serge 841
           ret
842
.ok:
168 serge 843
           mov edx, CTRL_STAT
227 serge 844
           call [ctrl.ctrl_read32]
845
           and eax, CTRL_ST_CREADY
846
           jz .fail
168 serge 847
           clc
848
           ret
227 serge 849
endp
168 serge 850
851
 
852
proc play
853
           xor eax, eax
854
           mov [civ_val], eax
855
           mov edx, PCM_OUT_CIV_REG
856
           call [ctrl.ctrl_write8]
227 serge 857
168 serge 858
 
227 serge 859
           mov [ctrl.lvi_reg], eax
860
           mov edx, PCM_OUT_LVI_REG
861
           call [ctrl.ctrl_write8]
862
168 serge 863
 
227 serge 864
           mov ax, 0x1D
865
           call [ctrl.ctrl_write8]
866
           ret
867
endp
168 serge 868
869
 
870
proc stop
871
           mov edx, PCM_OUT_CR_REG
227 serge 872
           mov ax, 0x0
873
           call [ctrl.ctrl_write8]
874
168 serge 875
 
227 serge 876
           mov edx, PCM_OUT_SR_REG
877
           call [ctrl.ctrl_write16]
878
           ret
879
endp
168 serge 880
881
 
882
proc get_dev_info stdcall, p_info:dword
883
           virtual at esi
884
             CTRL_INFO CTRL_INFO
885
           end virtual
886
887
 
888
           mov eax, [ctrl.int_line]
889
           mov ebx, [ctrl.codec_io_base]
890
           mov ecx, [ctrl.ctrl_io_base]
891
           mov edx, [ctrl.codec_mem_base]
892
           mov edi, [ctrl.ctrl_mem_base]
893
894
 
895
           mov [CTRL_INFO.codec_io_base], ebx
896
           mov [CTRL_INFO.ctrl_io_base], ecx
897
           mov [CTRL_INFO.codec_mem_base], edx
898
           mov [CTRL_INFO.ctrl_mem_base], edi
899
900
 
901
           mov [CTRL_INFO.codec_id], eax
902
903
 
904
           call [ctrl.ctrl_read32]
905
           mov [CTRL_INFO.glob_cntrl], eax
906
907
 
908
           call [ctrl.ctrl_read32]
909
           mov [CTRL_INFO.glob_sta], eax
910
911
 
912
           mov [CTRL_INFO.pci_cmd], ebx
913
914
 
915
endp
916
917
 
918
proc set_callback stdcall, handler:dword
919
           mov eax, [handler]
227 serge 920
           mov [ctrl.user_callback], eax
921
           ret
922
endp
168 serge 923
924
 
925
proc codec_read stdcall, ac_reg:dword	   ; reg = edx, reval = eax
926
927
 
227 serge 928
168 serge 929
 
227 serge 930
           shr ebx, 1
931
           bt [codec.shadow_flag], ebx
932
           jc .use_shadow
933
168 serge 934
 
227 serge 935
           mov ecx, eax
936
168 serge 937
 
938
           call [ctrl.ctrl_read32]
227 serge 939
           test eax, CTRL_ST_RCS
940
           jz .read_ok
941
168 serge 942
 
943
           call [ctrl.ctrl_write32]
227 serge 944
           xor eax,eax
945
           not eax  ;timeout
946
           ret
947
.read_ok:
168 serge 948
           mov edx, [ac_reg]
227 serge 949
           mov [codec.regs+edx], cx
950
           bts [codec.shadow_flag], ebx
951
           mov eax, ecx
952
           ret
953
.use_shadow:
168 serge 954
           movzx eax, word [codec.regs+edx]
227 serge 955
           ret
956
endp
168 serge 957
958
 
959
proc codec_write stdcall, ac_reg:dword
960
           push eax
227 serge 961
           call check_semafore
962
           and eax, eax
963
           jz .err
964
           pop eax
965
168 serge 966
 
227 serge 967
           mov edx, esi
968
           call [ctrl.codec_write16]
969
           mov [codec.regs+esi], ax
970
           shr esi, 1
971
           bts [codec.shadow_flag], esi
972
           ret
973
.err:
168 serge 974
           pop eax
227 serge 975
           ret
976
endp
168 serge 977
978
 
979
 
980
proc codec_check_ready
981
982
 
227 serge 983
           call [ctrl.ctrl_read32]
984
           and eax, CTRL_ST_CREADY
985
           jz .not_ready
986
168 serge 987
 
227 serge 988
           inc eax
989
           ret
990
168 serge 991
 
992
.not_ready:
993
           xor eax, eax
227 serge 994
           ret
995
endp
168 serge 996
997
 
998
 
999
proc check_semafore
1000
           local counter:DWORD
227 serge 1001
168 serge 1002
 
227 serge 1003
.l1:
168 serge 1004
           mov edx, CTRL_CAS
227 serge 1005
           call [ctrl.ctrl_read8]
1006
           and eax, CAS_FLAG
1007
           jz .ok
1008
168 serge 1009
 
227 serge 1010
           call StallExec
1011
           sub [counter], 1
1012
           jnz .l1
1013
           xor eax, eax
1014
           ret
1015
align 4
168 serge 1016
.ok:
1017
           xor eax,eax
227 serge 1018
           inc eax
1019
           ret
1020
endp
168 serge 1021
1022
 
1023
proc StallExec
1024
           push ecx
227 serge 1025
           push edx
1026
           push ebx
1027
           push eax
1028
168 serge 1029
 
227 serge 1030
           mul ecx
1031
           mov ebx, eax       ;low
1032
           mov ecx, edx       ;high
1033
           rdtsc
1034
           add ebx, eax
1035
           adc ecx, edx
233 serge 1036
@@:
168 serge 1037
           rdtsc
227 serge 1038
           sub eax, ebx
1039
           sbb edx, ecx
1040
           js @B
233 serge 1041
168 serge 1042
 
227 serge 1043
           pop ebx
1044
           pop edx
1045
           pop ecx
1046
           ret
1047
endp
168 serge 1048
1049
 
1050
;          CONTROLLER IO functions
1051
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1052
1053
 
1054
proc codec_io_r16
1055
           add edx, [ctrl.codec_io_base]
227 serge 1056
           in  ax, dx
1057
           ret
1058
endp
168 serge 1059
1060
 
1061
proc codec_io_w16
1062
           add edx, [ctrl.codec_io_base]
227 serge 1063
           out dx, ax
1064
           ret
1065
endp
168 serge 1066
1067
 
1068
proc ctrl_io_r8
1069
           add edx, [ctrl.ctrl_io_base]
227 serge 1070
           in  al, dx
1071
           ret
1072
endp
168 serge 1073
1074
 
1075
proc ctrl_io_r16
1076
           add edx, [ctrl.ctrl_io_base]
227 serge 1077
           in  ax, dx
1078
           ret
1079
endp
168 serge 1080
1081
 
1082
proc ctrl_io_r32
1083
           add edx, [ctrl.ctrl_io_base]
227 serge 1084
           in  eax, dx
1085
           ret
1086
endp
168 serge 1087
1088
 
1089
proc ctrl_io_w8
1090
           add edx, [ctrl.ctrl_io_base]
227 serge 1091
           out dx, al
1092
           ret
1093
endp
168 serge 1094
1095
 
1096
proc ctrl_io_w16
1097
           add edx, [ctrl.ctrl_io_base]
227 serge 1098
           out dx, ax
1099
           ret
1100
endp
168 serge 1101
1102
 
1103
proc ctrl_io_w32
1104
           add edx, [ctrl.ctrl_io_base]
227 serge 1105
           out dx, eax
1106
           ret
1107
endp
168 serge 1108
1109
 
1110
1111
 
188 serge 1112
devices dd (CTRL_SIS  shl 16)+VID_SIS,msg_AC, set_SIS
168 serge 1113
	dd 0
1114
1115
 
227 serge 1116
168 serge 1117
 
227 serge 1118
msg_SIS      db 'Silicon Integrated Systems',13,10, 0
1119
1120
 
168 serge 1121
1122
 
1123
msgFail      db 'device not found',13,10,0
1124
msgPlay      db 'start play', 13,10,0
1125
msgStop      db 'stop play',  13,10,0
1126
msgNotify    db 'call notify',13,10,0
1127
msgIRQ       db 'AC97 IRQ', 13,10,0
227 serge 1128
msgInitCtrl  db 'init controller',13,10,0
168 serge 1129
msgInitCodec db 'init codec',13,10,0
1130
msgPrimBuff  db 'create primary buffer',13,10,0
1131
msgReg       db 'set service handler',13,10,0
1132
msgOk        db 'service installed',13,10,0
1133
msgCold      db 'cold resret',13,10,0
1134
msgWarm      db 'warm reset',13,10,0
1135
msgWRFail    db 'warm reset failed',13,10,0
1136
msgCRFail    db 'cold reset failed',13,10,0
1137
msgCFail     db 'codec not ready',13,10,0
1138
188 serge 1139
 
1140
1141
 
1142
buff_list        rd 32
1143
1144
 
1145
ctrl AC_CNTRL
1146
1147
 
1148
civ_val  rd 1
1149