Subversion Repositories Kolibri OS

Rev

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