Subversion Repositories Kolibri OS

Rev

Rev 247 | 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
include 'imports.inc'
281 serge 5
168 serge 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
255
 
214 serge 256
257
 
227 serge 258
           jne .stop
259
260
 
168 serge 261
           mov esi, msgInit
227 serge 262
           call SysMsgBoardStr
188 serge 263
     end if
168 serge 264
265
 
227 serge 266
           test eax, eax
267
           jz .fail
268
168 serge 269
 
270
           mov esi,[ctrl.vendor_ids]
271
           call SysMsgBoardStr
188 serge 272
           mov  esi, [ctrl.ctrl_ids]
168 serge 273
           call SysMsgBoardStr
188 serge 274
     end if
168 serge 275
276
 
227 serge 277
           test eax, eax
278
           jz .fail
279
168 serge 280
 
281
           mov esi, msgInitCodec
282
           call SysMsgBoardStr
188 serge 283
     end if
168 serge 284
285
 
286
           test eax, eax
287
           jz .fail
288
289
 
290
           mov esi, [codec.ac_vendor_ids]
227 serge 291
           call SysMsgBoardStr
188 serge 292
168 serge 293
 
227 serge 294
           call SysMsgBoardStr
188 serge 295
     end if
168 serge 296
297
 
227 serge 298
           call setup_codec
168 serge 299
300
 
301
           call SysMsgBoardStr
188 serge 302
168 serge 303
 
227 serge 304
168 serge 305
 
188 serge 306
168 serge 307
 
188 serge 308
168 serge 309
 
310
           call SysMsgBoardStr
188 serge 311
           ret
227 serge 312
.fail:
168 serge 313
   if DEBUG
314
           mov esi, msgFail
227 serge 315
           call SysMsgBoardStr
188 serge 316
   end if
168 serge 317
           xor eax, eax
214 serge 318
           ret
319
.stop:
320
           call stop
321
           xor eax, eax
227 serge 322
           ret
214 serge 323
endp
324
168 serge 325
 
326
io_code    equ  IOCTL.io_code
327
input      equ  IOCTL.input
328
inp_size   equ  IOCTL.inp_size
329
output     equ  IOCTL.output
330
out_size   equ  IOCTL.out_size
331
332
 
333
proc service_proc stdcall, ioctl:dword
334
335
 
336
           mov eax, [edi+io_code]
337
           cmp eax, DEV_PLAY
227 serge 338
           jne @F
339
     if DEBUG
168 serge 340
           mov esi, msgPlay
227 serge 341
           call SysMsgBoardStr
188 serge 342
     end if
168 serge 343
           call play
227 serge 344
           ret
345
@@:
168 serge 346
           cmp eax, DEV_STOP
227 serge 347
           jne @F
348
     if DEBUG
168 serge 349
           mov esi, msgStop
227 serge 350
           call SysMsgBoardStr
188 serge 351
     end if
168 serge 352
           call stop
227 serge 353
           ret
354
@@:
168 serge 355
           cmp eax, DEV_CALLBACK
227 serge 356
           jne @F
357
           mov ebx, [edi+input]
168 serge 358
           stdcall set_callback, [ebx]
359
           ret
227 serge 360
@@:
168 serge 361
           cmp eax, DEV_SET_MASTERVOL
227 serge 362
           jne @F
363
           mov ebx, [edi+input]
168 serge 364
           stdcall set_master_vol, [ebx]
365
           ret
227 serge 366
@@:
168 serge 367
           cmp eax, DEV_GET_MASTERVOL
227 serge 368
           jne @F
369
           mov ebx, [edi+output]
168 serge 370
           test ebx, ebx
371
           jz .fail
372
373
 
374
           ret
227 serge 375
@@:
168 serge 376
           cmp eax, DEV_GET_INFO
227 serge 377
           jne @F
378
           mov ebx, [edi+output]
168 serge 379
           stdcall get_dev_info, ebx
227 serge 380
           ret
381
@@:
168 serge 382
.fail:
383
           xor eax, eax
227 serge 384
           ret
385
endp
168 serge 386
387
 
388
restore   io_code
389
restore   input
390
restore   inp_size
391
restore   output
392
restore   out_size
393
394
 
395
proc ac97_irq
396
397
 
398
;           mov esi, msgIRQ
399
;           call SysMsgBoardStr
188 serge 400
;     end if
168 serge 401
402
 
227 serge 403
           mov al, 0x14
404
           call [ctrl.ctrl_write8]
405
168 serge 406
 
227 serge 407
           mov edx, PCM_OUT_SR_REG
408
           call [ctrl.ctrl_write16]
409
168 serge 410
 
411
           call [ctrl.ctrl_read8]
227 serge 412
168 serge 413
 
414
           cmp eax, [civ_val]
415
           je .skip
416
417
 
418
           dec eax
227 serge 419
           and eax, 0x1F
420
           mov [ctrl.lvi_reg], eax
421
168 serge 422
 
227 serge 423
           call [ctrl.ctrl_write8]
424
168 serge 425
 
227 serge 426
           mov ax, 0x1D
427
           call [ctrl.ctrl_write8]
428
168 serge 429
 
430
           add eax, 2
431
           and eax, 31
227 serge 432
           mov ebx, dword [buff_list+eax*4]
433
168 serge 434
 
227 serge 435
           je @f
436
168 serge 437
 
227 serge 438
@@:
168 serge 439
           ret
227 serge 440
168 serge 441
 
442
           mov edx, PCM_OUT_CR_REG
227 serge 443
           mov ax, 0x1D
444
           call [ctrl.ctrl_write8]
445
           ret
168 serge 446
endp
447
448
 
449
proc create_primary_buff
450
451
 
188 serge 452
           mov [ctrl.buffer], eax
227 serge 453
168 serge 454
 
455
           mov ecx, 0x10000/4
456
           xor eax, eax
457
           rep stosd
458
459
 
188 serge 460
168 serge 461
 
227 serge 462
           mov ecx, 4
463
           mov edi, pcmout_bdl
464
@@:
168 serge 465
           mov [edi], eax
227 serge 466
           mov [edi+4], ebx
467
           mov [edi+32], eax
468
           mov [edi+4+32], ebx
469
           mov [edi+64], eax
470
           mov [edi+4+64], ebx
471
           mov [edi+96], eax
472
           mov [edi+4+96], ebx
473
           mov [edi+128], eax
474
           mov [edi+4+128], ebx
475
           mov [edi+160], eax
476
           mov [edi+4+160], ebx
477
           mov [edi+192], eax
478
           mov [edi+4+192], ebx
479
           mov [edi+224], eax
480
           mov [edi+4+224], ebx
481
168 serge 482
 
227 serge 483
           add edi, 8
484
           loop @B
485
168 serge 486
 
227 serge 487
           mov eax, [ctrl.buffer]
488
           mov ecx, 4
489
@@:
168 serge 490
           mov [edi], eax
227 serge 491
           mov [edi+16], eax
492
           mov [edi+32], eax
493
           mov [edi+48], eax
494
           mov [edi+64], eax
495
           mov [edi+80], eax
496
           mov [edi+96], eax
497
           mov [edi+112], eax
498
168 serge 499
 
227 serge 500
           add edi, 4
501
           loop @B
502
168 serge 503
 
227 serge 504
           stdcall GetPgAddr, ecx
188 serge 505
           and ecx, 0xFFF
227 serge 506
           add eax, ecx
507
168 serge 508
 
227 serge 509
           call [ctrl.ctrl_write32]
510
168 serge 511
 
227 serge 512
           mov [ctrl.lvi_reg], eax
513
           mov edx, PCM_OUT_LVI_REG
514
           call [ctrl.ctrl_write8]
515
168 serge 516
 
517
           call [ctrl.ctrl_read32]
518
           and eax, not 0x000000C0
519
           mov edx, GLOB_CTRL
520
           call [ctrl.ctrl_write32]
521
522
 
523
 
524
endp
525
526
 
527
proc detect_controller
528
           locals
227 serge 529
             last_bus dd ?
530
             bus      dd ?
531
             devfn    dd ?
532
           endl
533
168 serge 534
 
227 serge 535
           mov [bus], eax
536
           inc eax
537
           call PciApi
188 serge 538
           cmp eax, -1
227 serge 539
           je .err
540
168 serge 541
 
542
543
 
544
           and [devfn], 0
227 serge 545
.next_dev:
168 serge 546
           stdcall PciRead32, [bus], [devfn], dword 0
188 serge 547
           test eax, eax
227 serge 548
           jz .next
549
           cmp eax, -1
550
           je .next
551
           mov edi, devices
552
@@:
168 serge 553
           mov ebx, [edi]
227 serge 554
           test ebx, ebx
555
           jz .next
556
168 serge 557
 
227 serge 558
           je .found
559
           add edi, 12
560
           jmp @B
561
168 serge 562
 
227 serge 563
           inc [devfn]
564
           cmp [devfn], 256
565
           jb  .next_dev
566
           mov eax, [bus]
567
           inc eax
568
           mov [bus], eax
569
           cmp eax, [last_bus]
570
           jna .next_bus
571
           xor eax, eax
572
           ret
573
.found:
168 serge 574
           mov ebx, [bus]
227 serge 575
           mov [ctrl.bus], ebx
576
168 serge 577
 
227 serge 578
           mov [ctrl.devfn], ecx
579
168 serge 580
 
227 serge 581
           and edx, 0xFFFF
582
           mov [ctrl.vendor], edx
583
           shr eax, 16
584
           mov [ctrl.dev_id], eax
585
168 serge 586
 
227 serge 587
           mov [ctrl.ctrl_ids], ebx
588
           mov [ctrl.vendor_ids], msg_SIS
589
168 serge 590
 
227 serge 591
           mov [ctrl.ctrl_setup], esi
592
           ret
593
.err:
168 serge 594
           xor eax, eax
227 serge 595
           ret
596
endp
168 serge 597
598
 
599
proc init_controller
600
601
 
188 serge 602
           mov ebx, eax
227 serge 603
           and eax, 0xFFFF
604
           mov [ctrl.pci_cmd], eax
605
           shr ebx, 16
606
           mov [ctrl.pci_stat], ebx
607
168 serge 608
 
188 serge 609
           and eax,0xFFFE
227 serge 610
           mov [ctrl.codec_io_base], eax
611
168 serge 612
 
188 serge 613
           and eax, 0xFFC0
227 serge 614
           mov [ctrl.ctrl_io_base], eax
615
168 serge 616
 
188 serge 617
           mov [ctrl.codec_mem_base], eax
227 serge 618
168 serge 619
 
188 serge 620
           mov [ctrl.ctrl_mem_base], eax
227 serge 621
168 serge 622
 
188 serge 623
           and eax, 0xFF
227 serge 624
           mov [ctrl.int_line], eax
625
168 serge 626
 
188 serge 627
           and eax, 0xFF
227 serge 628
           mov [ctrl.cfg_reg], eax
629
168 serge 630
 
227 serge 631
           xor eax, eax
632
           inc eax
633
           ret
634
endp
168 serge 635
636
 
637
proc set_SIS
638
           mov [ctrl.codec_read16],  codec_io_r16    ;virtual
227 serge 639
           mov [ctrl.codec_write16], codec_io_w16    ;virtual
640
168 serge 641
 
227 serge 642
           mov [ctrl.ctrl_read16],  ctrl_io_r16      ;virtual
643
           mov [ctrl.ctrl_read32],  ctrl_io_r32      ;virtual
644
168 serge 645
 
227 serge 646
           mov [ctrl.ctrl_write16], ctrl_io_w16      ;virtual
647
           mov [ctrl.ctrl_write32], ctrl_io_w32      ;virtual
648
           ret
649
endp
168 serge 650
651
 
652
proc reset_controller
653
654
 
227 serge 655
           mov edx, PCM_IN_CR_REG
656
           call [ctrl.ctrl_write8]
657
168 serge 658
 
227 serge 659
           call [ctrl.ctrl_write8]
660
168 serge 661
 
227 serge 662
           call [ctrl.ctrl_write8]
663
168 serge 664
 
227 serge 665
           mov edx, PCM_IN_CR_REG
666
           call [ctrl.ctrl_write8]
667
168 serge 668
 
227 serge 669
           call [ctrl.ctrl_write8]
670
168 serge 671
 
227 serge 672
           call [ctrl.ctrl_write8]
673
           ret
674
endp
168 serge 675
676
 
677
proc init_codec
678
           locals
233 serge 679
             counter dd ?
680
           endl
681
168 serge 682
 
247 serge 683
           call SysMsgBoardStr
684
685
 
686
           call [ctrl.ctrl_read32]
687
           call dword2str
688
           call SysMsgBoardStr
689
690
 
691
           call SysMsgBoardStr
692
693
 
233 serge 694
           call [ctrl.ctrl_read32]
695
247 serge 696
 
697
           call SysMsgBoardStr
698
699
 
233 serge 700
           jnz .ready
701
168 serge 702
 
233 serge 703
           and eax, eax
704
           jz .err
705
168 serge 706
 
233 serge 707
           call [ctrl.codec_write16]
708
168 serge 709
 
233 serge 710
           mov edx, CODEC_REG_POWERDOWN
711
           call [ctrl.codec_write16]
712
713
 
714
.wait:
168 serge 715
           mov edx, CODEC_REG_POWERDOWN
233 serge 716
           call [ctrl.codec_read16]
717
           and eax, 0x0F
718
           cmp eax, 0x0F
719
           je .ready
720
168 serge 721
 
233 serge 722
           call StallExec
723
           sub [counter] , 1
724
           jnz .wait
725
.err:
168 serge 726
           xor eax, eax        ; timeout error
233 serge 727
           ret
728
.ready:
168 serge 729
           call detect_codec
233 serge 730
168 serge 731
 
233 serge 732
           inc eax
733
           ret
734
endp
168 serge 735
736
 
737
proc reset_codec
738
           mov edx, GLOB_CTRL
227 serge 739
           call [ctrl.ctrl_read32]
740
168 serge 741
 
742
           jz .cold
743
744
 
745
           jnc .ok
746
.cold:
747
           call cold_reset
227 serge 748
           jnc .ok
749
168 serge 750
 
751
           mov esi, msgCFail
227 serge 752
           call SysMsgBoardStr
188 serge 753
     end if
168 serge 754
           xor eax, eax     ; timeout error
227 serge 755
           ret
756
.ok:
168 serge 757
           xor eax, eax
758
           inc eax
227 serge 759
           ret
760
endp
168 serge 761
762
 
763
proc warm_reset
764
           locals
227 serge 765
             counter dd ?
766
           endl
767
168 serge 768
 
227 serge 769
           mov edx, GLOB_CTRL
770
           call [ctrl.ctrl_write32]
771
168 serge 772
 
773
           mov esi, msgWarm
227 serge 774
           call SysMsgBoardStr
188 serge 775
     end if
168 serge 776
777
 
227 serge 778
.wait:
168 serge 779
           mov eax, 100000    ; wait 100 ms
227 serge 780
           call StallExec
781
168 serge 782
 
227 serge 783
           call [ctrl.ctrl_read32]
784
           test eax, 4
785
           jz .ok
786
           sub [counter], 1
787
           jnz .wait
788
168 serge 789
 
790
           mov esi, msgWRFail
227 serge 791
           call SysMsgBoardStr
188 serge 792
     end if
168 serge 793
           stc
227 serge 794
           ret
795
.ok:
168 serge 796
           mov edx, CTRL_STAT
227 serge 797
           call [ctrl.ctrl_read32]
798
           and eax, CTRL_ST_CREADY
799
           jz .fail
168 serge 800
           clc
801
           ret
227 serge 802
.fail:
168 serge 803
           stc
804
           ret
227 serge 805
endp
168 serge 806
807
 
808
proc cold_reset
809
           locals
227 serge 810
             counter dd ?
811
            endl
812
168 serge 813
 
227 serge 814
           call [ctrl.ctrl_read32]
233 serge 815
           and eax, not 0x08
816
           or eax, 0x02
817
           mov edx, GLOB_CTRL
818
           call [ctrl.ctrl_write32]
227 serge 819
168 serge 820
 
821
           mov esi, msgCold
227 serge 822
           call SysMsgBoardStr
188 serge 823
     end if
168 serge 824
825
 
227 serge 826
.wait:
168 serge 827
           mov eax, 100000    ; wait 100 ms
227 serge 828
           call StallExec
829
168 serge 830
 
227 serge 831
           call [ctrl.ctrl_read32]
832
           test eax, 4
833
           jz .ok
834
           sub [counter], 1
835
           jnz .wait
836
168 serge 837
 
838
           mov esi, msgCRFail
227 serge 839
           call SysMsgBoardStr
188 serge 840
     end if
168 serge 841
.fail:
233 serge 842
           stc
227 serge 843
           ret
844
.ok:
168 serge 845
           mov edx, CTRL_STAT
227 serge 846
           call [ctrl.ctrl_read32]
847
           and eax, CTRL_ST_CREADY
848
           jz .fail
168 serge 849
           clc
850
           ret
227 serge 851
endp
168 serge 852
853
 
854
proc play
855
           xor eax, eax
856
           mov [civ_val], eax
857
           mov edx, PCM_OUT_CIV_REG
858
           call [ctrl.ctrl_write8]
227 serge 859
168 serge 860
 
227 serge 861
           mov [ctrl.lvi_reg], eax
862
           mov edx, PCM_OUT_LVI_REG
863
           call [ctrl.ctrl_write8]
864
168 serge 865
 
227 serge 866
           mov ax, 0x1D
867
           call [ctrl.ctrl_write8]
868
           ret
869
endp
168 serge 870
871
 
872
proc stop
873
           mov edx, PCM_OUT_CR_REG
227 serge 874
           mov ax, 0x0
875
           call [ctrl.ctrl_write8]
876
168 serge 877
 
227 serge 878
           mov edx, PCM_OUT_SR_REG
879
           call [ctrl.ctrl_write16]
880
           ret
881
endp
168 serge 882
883
 
884
proc get_dev_info stdcall, p_info:dword
885
           virtual at esi
886
             CTRL_INFO CTRL_INFO
887
           end virtual
888
889
 
890
           mov eax, [ctrl.int_line]
891
           mov ebx, [ctrl.codec_io_base]
892
           mov ecx, [ctrl.ctrl_io_base]
893
           mov edx, [ctrl.codec_mem_base]
894
           mov edi, [ctrl.ctrl_mem_base]
895
896
 
897
           mov [CTRL_INFO.codec_io_base], ebx
898
           mov [CTRL_INFO.ctrl_io_base], ecx
899
           mov [CTRL_INFO.codec_mem_base], edx
900
           mov [CTRL_INFO.ctrl_mem_base], edi
901
902
 
903
           mov [CTRL_INFO.codec_id], eax
904
905
 
906
           call [ctrl.ctrl_read32]
907
           mov [CTRL_INFO.glob_cntrl], eax
908
909
 
910
           call [ctrl.ctrl_read32]
911
           mov [CTRL_INFO.glob_sta], eax
912
913
 
914
           mov [CTRL_INFO.pci_cmd], ebx
915
916
 
917
endp
918
919
 
920
proc set_callback stdcall, handler:dword
921
           mov eax, [handler]
227 serge 922
           mov [ctrl.user_callback], eax
923
           ret
924
endp
168 serge 925
926
 
927
proc codec_read stdcall, ac_reg:dword	   ; reg = edx, reval = eax
928
929
 
227 serge 930
168 serge 931
 
227 serge 932
           shr ebx, 1
933
           bt [codec.shadow_flag], ebx
934
           jc .use_shadow
935
168 serge 936
 
227 serge 937
           mov ecx, eax
938
168 serge 939
 
940
           call [ctrl.ctrl_read32]
227 serge 941
           test eax, CTRL_ST_RCS
942
           jz .read_ok
943
168 serge 944
 
945
           call [ctrl.ctrl_write32]
227 serge 946
           xor eax,eax
947
           not eax  ;timeout
948
           ret
949
.read_ok:
168 serge 950
           mov edx, [ac_reg]
227 serge 951
           mov [codec.regs+edx], cx
952
           bts [codec.shadow_flag], ebx
953
           mov eax, ecx
954
           ret
955
.use_shadow:
168 serge 956
           movzx eax, word [codec.regs+edx]
227 serge 957
           ret
958
endp
168 serge 959
960
 
961
proc codec_write stdcall, ac_reg:dword
962
           push eax
227 serge 963
           call check_semafore
964
           and eax, eax
965
           jz .err
966
           pop eax
967
168 serge 968
 
227 serge 969
           mov edx, esi
970
           call [ctrl.codec_write16]
971
           mov [codec.regs+esi], ax
972
           shr esi, 1
973
           bts [codec.shadow_flag], esi
974
           ret
975
.err:
168 serge 976
           pop eax
227 serge 977
           ret
978
endp
168 serge 979
980
 
981
 
982
proc codec_check_ready
983
984
 
227 serge 985
           call [ctrl.ctrl_read32]
986
           and eax, CTRL_ST_CREADY
987
           jz .not_ready
988
168 serge 989
 
227 serge 990
           inc eax
991
           ret
992
168 serge 993
 
994
.not_ready:
995
           xor eax, eax
227 serge 996
           ret
997
endp
168 serge 998
999
 
1000
 
1001
proc check_semafore
1002
           local counter:DWORD
227 serge 1003
168 serge 1004
 
227 serge 1005
.l1:
168 serge 1006
           mov edx, CTRL_CAS
227 serge 1007
           call [ctrl.ctrl_read8]
1008
           and eax, CAS_FLAG
1009
           jz .ok
1010
168 serge 1011
 
227 serge 1012
           call StallExec
1013
           sub [counter], 1
1014
           jnz .l1
1015
           xor eax, eax
1016
           ret
1017
align 4
168 serge 1018
.ok:
1019
           xor eax,eax
227 serge 1020
           inc eax
1021
           ret
1022
endp
168 serge 1023
1024
 
1025
proc StallExec
1026
           push ecx
227 serge 1027
           push edx
1028
           push ebx
1029
           push eax
1030
168 serge 1031
 
227 serge 1032
           mul ecx
1033
           mov ebx, eax       ;low
1034
           mov ecx, edx       ;high
1035
           rdtsc
1036
           add ebx, eax
1037
           adc ecx, edx
233 serge 1038
@@:
168 serge 1039
           rdtsc
227 serge 1040
           sub eax, ebx
1041
           sbb edx, ecx
1042
           js @B
233 serge 1043
168 serge 1044
 
227 serge 1045
           pop ebx
1046
           pop edx
1047
           pop ecx
1048
           ret
1049
endp
168 serge 1050
1051
 
1052
;          CONTROLLER IO functions
1053
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1054
1055
 
1056
proc codec_io_r16
1057
           add edx, [ctrl.codec_io_base]
227 serge 1058
           in  ax, dx
1059
           ret
1060
endp
168 serge 1061
1062
 
1063
proc codec_io_w16
1064
           add edx, [ctrl.codec_io_base]
227 serge 1065
           out dx, ax
1066
           ret
1067
endp
168 serge 1068
1069
 
1070
proc ctrl_io_r8
1071
           add edx, [ctrl.ctrl_io_base]
227 serge 1072
           in  al, dx
1073
           ret
1074
endp
168 serge 1075
1076
 
1077
proc ctrl_io_r16
1078
           add edx, [ctrl.ctrl_io_base]
227 serge 1079
           in  ax, dx
1080
           ret
1081
endp
168 serge 1082
1083
 
1084
proc ctrl_io_r32
1085
           add edx, [ctrl.ctrl_io_base]
227 serge 1086
           in  eax, dx
1087
           ret
1088
endp
168 serge 1089
1090
 
1091
proc ctrl_io_w8
1092
           add edx, [ctrl.ctrl_io_base]
227 serge 1093
           out dx, al
1094
           ret
1095
endp
168 serge 1096
1097
 
1098
proc ctrl_io_w16
1099
           add edx, [ctrl.ctrl_io_base]
227 serge 1100
           out dx, ax
1101
           ret
1102
endp
168 serge 1103
1104
 
1105
proc ctrl_io_w32
1106
           add edx, [ctrl.ctrl_io_base]
227 serge 1107
           out dx, eax
1108
           ret
1109
endp
168 serge 1110
1111
 
247 serge 1112
dword2str:
1113
      mov  esi, hex_buff
1114
      mov ecx, -8
1115
@@:
1116
      rol eax, 4
1117
      mov ebx, eax
1118
      and ebx, 0x0F
1119
      mov bl, [ebx+hexletters]
1120
      mov [8+esi+ecx], bl
1121
      inc ecx
1122
      jnz @B
1123
      ret
1124
1125
 
1126
 
168 serge 1127
1128
 
188 serge 1129
devices dd (CTRL_SIS  shl 16)+VID_SIS,msg_AC, set_SIS
168 serge 1130
        dd 0
247 serge 1131
168 serge 1132
 
281 serge 1133
168 serge 1134
 
227 serge 1135
msg_SIS      db 'Silicon Integrated Systems',13,10, 0
1136
1137
 
168 serge 1138
1139
 
1140
msgFail      db 'device not found',13,10,0
1141
msgPlay      db 'start play', 13,10,0
1142
msgStop      db 'stop play',  13,10,0
1143
msgNotify    db 'call notify',13,10,0
1144
msgIRQ       db 'AC97 IRQ', 13,10,0
227 serge 1145
msgInitCtrl  db 'init controller',13,10,0
168 serge 1146
msgInitCodec db 'init codec',13,10,0
1147
msgPrimBuff  db 'create primary buffer',13,10,0
1148
msgReg       db 'set service handler',13,10,0
1149
msgOk        db 'service installed',13,10,0
1150
msgCold      db 'cold resret',13,10,0
1151
msgWarm      db 'warm reset',13,10,0
1152
msgWRFail    db 'warm reset failed',13,10,0
1153
msgCRFail    db 'cold reset failed',13,10,0
1154
msgCFail     db 'codec not ready',13,10,0
1155
msgStatus    db 'global status   ',0
247 serge 1156
msgControl   db 'global control  ',0
1157
188 serge 1158
 
247 serge 1159
hex_buff     db 8 dup(0),13,10,0
1160
1161
 
1162
 
188 serge 1163
1164
 
1165
buff_list        rd 32
1166
1167
 
1168
ctrl AC_CNTRL
1169
1170
 
1171
civ_val  rd 1
1172