Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
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
 
378 serge 47
PCM_OUT_CR_REG    equ  0x1b  ; PCM out Control Register
48
PCM_OUT_LVI_REG   equ  0x15	 ; PCM last valid index
168 serge 49
PCM_OUT_SR_REG    equ  0x18  ; PCM out Status register
378 serge 50
PCM_OUT_PIV_REG   equ  0x1a	 ; PCM out prefetched index
168 serge 51
PCM_OUT_CIV_REG   equ  0x14      ; PCM out current index
52
53
 
54
MC_IN_CR_REG      equ  0x2b  ; MIC in Control Register
378 serge 55
RR		  equ  BIT1	 ; reset registers.  Nukes all regs
168 serge 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
 
378 serge 68
CTRL_STAT         equ  0x30        ;   Global Status
69
CTRL_CAS          equ  0x34        ;   Codec Access Semiphore
70
168 serge 71
 
378 serge 72
168 serge 73
 
378 serge 74
168 serge 75
 
378 serge 76
168 serge 77
 
378 serge 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
168 serge 83
 
84
CODEC_REG_ST          equ 0x26
378 serge 85
168 serge 86
 
87
DEV_STOP              equ  2
88
DEV_CALLBACK          equ  3
89
DEV_SET_BUFF          equ  4
90
DEV_NOTIFY            equ  5
91
DEV_SET_MASTERVOL     equ  6
92
DEV_GET_MASTERVOL     equ  7
93
DEV_GET_INFO          equ  8
94
95
 
96
{ .bus                dd ?
188 serge 97
  .devfn              dd ?
98
168 serge 99
 
188 serge 100
  .dev_id             dd ?
101
  .pci_cmd            dd ?
102
  .pci_stat           dd ?
103
168 serge 104
 
188 serge 105
  .codec_mem_base     dd ?
106
168 serge 107
 
188 serge 108
  .ctrl_mem_base      dd ?
109
  .cfg_reg            dd ?
110
  .int_line           dd ?
111
168 serge 112
 
188 serge 113
  .ctrl_ids           dd ?    ;hub id string
114
168 serge 115
 
188 serge 116
168 serge 117
 
188 serge 118
  .notify_task        dd ?
119
168 serge 120
 
188 serge 121
  .ctrl_setup         dd ?
122
  .user_callback      dd ?
123
  .codec_read16       dd ?
124
  .codec_write16      dd ?
125
168 serge 126
 
188 serge 127
  .ctrl_read16        dd ?
128
  .ctrl_read32        dd ?
129
168 serge 130
 
188 serge 131
  .ctrl_write16       dd ?
132
  .ctrl_write32       dd ?
133
}
168 serge 134
135
 
136
{
137
  .chip_id            dd ?
188 serge 138
  .flags              dd ?
139
  .status             dd ?
140
168 serge 141
 
188 serge 142
  .chip_ids           dd ?    ;chip model string
143
168 serge 144
 
188 serge 145
                      dd ?
146
168 serge 147
 
188 serge 148
  .reg_master_vol     dw ?     ;0x02
149
  .reg_aux_out_vol    dw ?     ;0x04
150
  .reg_mone_vol       dw ?     ;0x06
151
  .reg_master_tone    dw ?     ;0x08
152
  .reg_beep_vol       dw ?     ;0x0A
153
  .reg_phone_vol      dw ?     ;0x0C
154
  .reg_mic_vol        dw ?     ;0x0E
155
  .reg_line_in_vol    dw ?     ;0x10
156
  .reg_cd_vol         dw ?     ;0x12
157
  .reg_video_vol      dw ?     ;0x14
158
  .reg_aux_in_vol     dw ?     ;0x16
159
  .reg_pcm_out_vol    dw ?     ;0x18
160
  .reg_rec_select     dw ?     ;0x1A
161
  .reg_rec_gain       dw ?     ;0x1C
162
  .reg_rec_gain_mic   dw ?     ;0x1E
163
  .reg_gen            dw ?     ;0x20
164
  .reg_3d_ctrl        dw ?     ;0X22
165
  .reg_page           dw ?     ;0X24
166
  .reg_powerdown      dw ?     ;0x26
167
  .reg_ext_audio      dw ?     ;0x28
168
  .reg_ext_st         dw ?     ;0x2a
169
  .reg_pcm_front_rate dw ?     ;0x2c
170
  .reg_pcm_surr_rate  dw ?     ;0x2e
171
  .reg_lfe_rate       dw ?     ;0x30
172
  .reg_pcm_in_rate    dw ?     ;0x32
173
                      dw ?     ;0x34
174
  .reg_cent_lfe_vol   dw ?     ;0x36
175
  .reg_surr_vol       dw ?     ;0x38
176
  .reg_spdif_ctrl     dw ?     ;0x3A
177
                      dw ?     ;0x3C
178
                      dw ?     ;0x3E
179
                      dw ?     ;0x40
180
                      dw ?     ;0x42
181
                      dw ?     ;0x44
182
                      dw ?     ;0x46
183
                      dw ?     ;0x48
184
                      dw ?     ;0x4A
185
                      dw ?     ;0x4C
186
                      dw ?     ;0x4E
187
                      dw ?     ;0x50
188
                      dw ?     ;0x52
189
                      dw ?     ;0x54
190
                      dw ?     ;0x56
191
                      dw ?     ;0x58
192
                      dw ?     ;0x5A
193
                      dw ?     ;0x5C
194
                      dw ?     ;0x5E
195
  .reg_page_0         dw ?     ;0x60
196
  .reg_page_1         dw ?     ;0x62
197
  .reg_page_2         dw ?     ;0x64
198
  .reg_page_3         dw ?     ;0x66
199
  .reg_page_4         dw ?     ;0x68
200
  .reg_page_5         dw ?     ;0x6A
201
  .reg_page_6         dw ?     ;0x6C
202
  .reg_page_7         dw ?     ;0x6E
203
                      dw ?     ;0x70
204
                      dw ?     ;0x72
205
                      dw ?     ;0x74
206
                      dw ?     ;0x76
207
                      dw ?     ;0x78
208
                      dw ?     ;0x7A
209
  .reg_vendor_id_1    dw ?     ;0x7C
210
  .reg_vendor_id_2    dw ?     ;0x7E
211
168 serge 212
 
213
 
188 serge 214
  .set_master_vol     dd ?
215
}
168 serge 216
217
 
218
{   .pci_cmd          dd ?
378 serge 219
    .irq              dd ?
220
    .glob_cntrl       dd ?
221
    .glob_sta         dd ?
222
    .codec_io_base    dd ?
223
    .ctrl_io_base     dd ?
224
    .codec_mem_base   dd ?
225
    .ctrl_mem_base    dd ?
226
    .codec_id         dd ?
227
}
168 serge 228
229
 
230
{  .handle            dd ?
378 serge 231
   .io_code           dd ?
232
   .input             dd ?
233
   .inp_size          dd ?
234
   .output            dd ?
235
   .out_size          dd ?
236
}
168 serge 237
238
 
239
  IOCTL IOCTL
240
end virtual
241
242
 
243
244
 
417 serge 245
SLOT_BASE          equ OS_BASE+0x0080000
380 serge 246
168 serge 247
 
188 serge 248
public service_proc
168 serge 249
public version
227 serge 250
168 serge 251
 
188 serge 252
253
 
214 serge 254
255
 
227 serge 256
           jne .stop
257
258
 
168 serge 259
           mov esi, msgInit
227 serge 260
           call SysMsgBoardStr
188 serge 261
     end if
168 serge 262
263
 
227 serge 264
           test eax, eax
265
           jz .fail
266
168 serge 267
 
268
           mov esi,[ctrl.vendor_ids]
269
           call SysMsgBoardStr
188 serge 270
           mov  esi, [ctrl.ctrl_ids]
168 serge 271
           call SysMsgBoardStr
188 serge 272
     end if
168 serge 273
274
 
227 serge 275
           test eax, eax
276
           jz .fail
277
168 serge 278
 
279
           mov esi, msgInitCodec
280
           call SysMsgBoardStr
188 serge 281
     end if
168 serge 282
283
 
284
           test eax, eax
285
           jz .fail
286
287
 
288
           mov esi, [codec.ac_vendor_ids]
227 serge 289
           call SysMsgBoardStr
188 serge 290
168 serge 291
 
227 serge 292
           call SysMsgBoardStr
188 serge 293
     end if
168 serge 294
295
 
227 serge 296
           call setup_codec
168 serge 297
298
 
299
           call SysMsgBoardStr
188 serge 300
168 serge 301
 
227 serge 302
168 serge 303
 
188 serge 304
168 serge 305
 
188 serge 306
168 serge 307
 
308
           call SysMsgBoardStr
188 serge 309
           ret
227 serge 310
.fail:
168 serge 311
   if DEBUG
312
           mov esi, msgFail
227 serge 313
           call SysMsgBoardStr
188 serge 314
   end if
168 serge 315
           xor eax, eax
214 serge 316
           ret
317
.stop:
318
           call stop
319
           xor eax, eax
227 serge 320
           ret
214 serge 321
endp
322
168 serge 323
 
324
io_code    equ  IOCTL.io_code
325
input      equ  IOCTL.input
326
inp_size   equ  IOCTL.inp_size
327
output     equ  IOCTL.output
328
out_size   equ  IOCTL.out_size
329
330
 
331
proc service_proc stdcall, ioctl:dword
332
333
 
334
           mov eax, [edi+io_code]
335
           cmp eax, DEV_PLAY
227 serge 336
           jne @F
337
     if DEBUG
168 serge 338
           mov esi, msgPlay
227 serge 339
           call SysMsgBoardStr
188 serge 340
     end if
168 serge 341
           call play
227 serge 342
           ret
343
@@:
168 serge 344
           cmp eax, DEV_STOP
227 serge 345
           jne @F
346
     if DEBUG
168 serge 347
           mov esi, msgStop
227 serge 348
           call SysMsgBoardStr
188 serge 349
     end if
168 serge 350
           call stop
227 serge 351
           ret
352
@@:
168 serge 353
           cmp eax, DEV_CALLBACK
227 serge 354
           jne @F
355
           mov ebx, [edi+input]
168 serge 356
           stdcall set_callback, [ebx]
357
           ret
227 serge 358
@@:
168 serge 359
           cmp eax, DEV_SET_MASTERVOL
227 serge 360
           jne @F
361
           mov eax, [edi+input]
378 serge 362
           mov eax, [eax]
363
           call set_master_vol      ;eax= vol
364
           ret
227 serge 365
@@:
168 serge 366
           cmp eax, DEV_GET_MASTERVOL
227 serge 367
           jne @F
368
           mov ebx, [edi+output]
168 serge 369
           stdcall get_master_vol, ebx
370
           ret
227 serge 371
;@@:
417 serge 372
;           cmp eax, DEV_GET_INFO
373
;           jne @F
374
;           mov ebx, [edi+output]
375
;           stdcall get_dev_info, ebx
376
;           ret
377
@@:
168 serge 378
.fail:
379
           or eax, -1
378 serge 380
           ret
227 serge 381
endp
168 serge 382
383
 
384
restore   io_code
385
restore   input
386
restore   inp_size
387
restore   output
388
restore   out_size
389
390
 
391
proc ac97_irq
392
393
 
394
;           mov esi, msgIRQ
395
;           call SysMsgBoardStr
188 serge 396
;     end if
168 serge 397
398
 
227 serge 399
           mov al, 0x10
378 serge 400
           call [ctrl.ctrl_write8]
227 serge 401
168 serge 402
 
227 serge 403
           mov edx, PCM_OUT_SR_REG
404
           call [ctrl.ctrl_write16]
405
168 serge 406
 
407
           call [ctrl.ctrl_read8]
227 serge 408
168 serge 409
 
410
           cmp eax, [civ_val]
411
           je .skip
412
413
 
414
           dec eax
227 serge 415
           and eax, 0x1F
416
           mov [ctrl.lvi_reg], eax
417
168 serge 418
 
227 serge 419
           call [ctrl.ctrl_write8]
420
168 serge 421
 
227 serge 422
           mov ax, 0x11
378 serge 423
           call [ctrl.ctrl_write8]
227 serge 424
168 serge 425
 
426
           add eax, 1
378 serge 427
           and eax, 31
227 serge 428
           mov ebx, dword [buff_list+eax*4]
429
168 serge 430
 
227 serge 431
           je @f
432
168 serge 433
 
227 serge 434
@@:
168 serge 435
           ret
227 serge 436
168 serge 437
 
438
           mov edx, PCM_OUT_CR_REG
227 serge 439
           mov ax, 0x11
378 serge 440
           call [ctrl.ctrl_write8]
227 serge 441
           ret
168 serge 442
endp
443
444
 
445
proc create_primary_buff
446
447
 
188 serge 448
           mov [ctrl.buffer], eax
227 serge 449
168 serge 450
 
451
           mov ecx, 0x10000/4
452
           xor eax, eax
453
           cld
378 serge 454
           rep stosd
168 serge 455
456
 
285 serge 457
           call GetPgAddr
458
168 serge 459
 
227 serge 460
           mov ecx, 4
461
           mov edi, pcmout_bdl
462
@@:
168 serge 463
           mov [edi], eax
227 serge 464
           mov [edi+4], ebx
465
           mov [edi+32], eax
466
           mov [edi+4+32], ebx
467
           mov [edi+64], eax
468
           mov [edi+4+64], ebx
469
           mov [edi+96], eax
470
           mov [edi+4+96], ebx
471
           mov [edi+128], eax
472
           mov [edi+4+128], ebx
473
           mov [edi+160], eax
474
           mov [edi+4+160], ebx
475
           mov [edi+192], eax
476
           mov [edi+4+192], ebx
477
           mov [edi+224], eax
478
           mov [edi+4+224], ebx
479
168 serge 480
 
227 serge 481
           add edi, 8
482
           loop @B
483
168 serge 484
 
227 serge 485
           mov eax, [ctrl.buffer]
486
           mov ecx, 4
487
@@:
168 serge 488
           mov [edi], eax
227 serge 489
           mov [edi+16], eax
490
           mov [edi+32], eax
491
           mov [edi+48], eax
492
           mov [edi+64], eax
493
           mov [edi+80], eax
494
           mov [edi+96], eax
495
           mov [edi+112], eax
496
168 serge 497
 
227 serge 498
           add edi, 4
499
           loop @B
500
168 serge 501
 
285 serge 502
           mov ebx, eax
503
           call GetPgAddr     ;eax
504
           and ebx, 0xFFF
505
           add eax, ebx
506
168 serge 507
 
227 serge 508
           call [ctrl.ctrl_write32]
509
168 serge 510
 
227 serge 511
           mov [ctrl.lvi_reg], eax
512
           mov edx, PCM_OUT_LVI_REG
513
           call [ctrl.ctrl_write8]
514
168 serge 515
 
516
           call [ctrl.ctrl_read32]
517
           and eax, not 0x000000C0
518
           mov edx, GLOB_CTRL
519
           call [ctrl.ctrl_write32]
520
521
 
522
 
523
endp
524
525
 
526
proc detect_controller
527
           locals
227 serge 528
             last_bus dd ?
529
             bus      dd ?
530
             devfn    dd ?
531
           endl
532
168 serge 533
 
227 serge 534
           mov [bus], eax
535
           inc eax
536
           call PciApi
188 serge 537
           cmp eax, -1
227 serge 538
           je .err
539
168 serge 540
 
541
542
 
543
           and [devfn], 0
227 serge 544
.next_dev:
168 serge 545
           stdcall PciRead32, [bus], [devfn], dword 0
188 serge 546
           test eax, eax
227 serge 547
           jz .next
548
           cmp eax, -1
549
           je .next
550
           mov edi, devices
551
@@:
168 serge 552
           mov ebx, [edi]
227 serge 553
           test ebx, ebx
554
           jz .next
555
168 serge 556
 
227 serge 557
           je .found
558
           add edi, 12
559
           jmp @B
560
168 serge 561
 
227 serge 562
           inc [devfn]
563
           cmp [devfn], 256
564
           jb  .next_dev
565
           mov eax, [bus]
566
           inc eax
567
           mov [bus], eax
568
           cmp eax, [last_bus]
569
           jna .next_bus
570
           xor eax, eax
571
           ret
572
.found:
168 serge 573
           mov ebx, [bus]
227 serge 574
           mov [ctrl.bus], ebx
575
168 serge 576
 
227 serge 577
           mov [ctrl.devfn], ecx
578
168 serge 579
 
227 serge 580
           and edx, 0xFFFF
581
           mov [ctrl.vendor], edx
582
           shr eax, 16
583
           mov [ctrl.dev_id], eax
584
168 serge 585
 
227 serge 586
           mov [ctrl.ctrl_ids], ebx
587
           mov [ctrl.vendor_ids], msg_SIS
588
168 serge 589
 
227 serge 590
           mov [ctrl.ctrl_setup], esi
591
           ret
592
.err:
168 serge 593
           xor eax, eax
227 serge 594
           ret
595
endp
168 serge 596
597
 
598
proc init_controller
599
600
 
188 serge 601
           mov ebx, eax
227 serge 602
           and eax, 0xFFFF
603
           mov [ctrl.pci_cmd], eax
604
           shr ebx, 16
605
           mov [ctrl.pci_stat], ebx
606
168 serge 607
 
188 serge 608
           and eax,0xFFFE
227 serge 609
           mov [ctrl.codec_io_base], eax
610
168 serge 611
 
188 serge 612
           and eax, 0xFFC0
227 serge 613
           mov [ctrl.ctrl_io_base], eax
614
168 serge 615
 
188 serge 616
           mov [ctrl.codec_mem_base], eax
227 serge 617
168 serge 618
 
188 serge 619
           mov [ctrl.ctrl_mem_base], eax
227 serge 620
168 serge 621
 
188 serge 622
           and eax, 0xFF
227 serge 623
           mov [ctrl.int_line], eax
624
168 serge 625
 
188 serge 626
           and eax, 0xFF
227 serge 627
           mov [ctrl.cfg_reg], eax
628
168 serge 629
 
227 serge 630
           xor eax, eax
631
           inc eax
632
           ret
633
endp
168 serge 634
635
 
636
proc set_SIS
637
           mov [ctrl.codec_read16],  codec_io_r16    ;virtual
227 serge 638
           mov [ctrl.codec_write16], codec_io_w16    ;virtual
639
168 serge 640
 
227 serge 641
           mov [ctrl.ctrl_read16],  ctrl_io_r16      ;virtual
642
           mov [ctrl.ctrl_read32],  ctrl_io_r32      ;virtual
643
168 serge 644
 
227 serge 645
           mov [ctrl.ctrl_write16], ctrl_io_w16      ;virtual
646
           mov [ctrl.ctrl_write32], ctrl_io_w32      ;virtual
647
           ret
648
endp
168 serge 649
650
 
651
proc reset_controller
652
653
 
227 serge 654
           mov edx, PCM_IN_CR_REG
655
           call [ctrl.ctrl_write8]
656
168 serge 657
 
227 serge 658
           call [ctrl.ctrl_write8]
659
168 serge 660
 
227 serge 661
           call [ctrl.ctrl_write8]
662
168 serge 663
 
227 serge 664
           mov edx, PCM_IN_CR_REG
665
           call [ctrl.ctrl_write8]
666
168 serge 667
 
227 serge 668
           call [ctrl.ctrl_write8]
669
168 serge 670
 
227 serge 671
           call [ctrl.ctrl_write8]
672
           ret
673
endp
168 serge 674
675
 
676
proc init_codec
677
           locals
233 serge 678
             counter dd ?
679
           endl
680
168 serge 681
 
247 serge 682
           call SysMsgBoardStr
683
684
 
685
           call [ctrl.ctrl_read32]
686
           call dword2str
687
           call SysMsgBoardStr
688
689
 
690
           call SysMsgBoardStr
691
692
 
233 serge 693
           call [ctrl.ctrl_read32]
694
247 serge 695
 
696
           call SysMsgBoardStr
697
698
 
233 serge 699
           jnz .ready
700
168 serge 701
 
233 serge 702
           and eax, eax
703
           jz .err
704
168 serge 705
 
233 serge 706
           call [ctrl.codec_write16]
707
168 serge 708
 
233 serge 709
           mov edx, CODEC_REG_POWERDOWN
710
           call [ctrl.codec_write16]
711
712
 
713
.wait:
168 serge 714
           mov edx, CODEC_REG_POWERDOWN
233 serge 715
           call [ctrl.codec_read16]
716
           and eax, 0x0F
717
           cmp eax, 0x0F
718
           je .ready
719
168 serge 720
 
233 serge 721
           call StallExec
722
           sub [counter] , 1
723
           jnz .wait
724
.err:
168 serge 725
           xor eax, eax        ; timeout error
233 serge 726
           ret
727
.ready:
168 serge 728
           call detect_codec
233 serge 729
168 serge 730
 
233 serge 731
           inc eax
732
           ret
733
endp
168 serge 734
735
 
736
proc reset_codec
737
           mov edx, GLOB_CTRL
227 serge 738
           call [ctrl.ctrl_read32]
739
168 serge 740
 
741
           jz .cold
742
743
 
744
           jnc .ok
745
.cold:
746
           call cold_reset
227 serge 747
           jnc .ok
748
168 serge 749
 
750
           mov esi, msgCFail
227 serge 751
           call SysMsgBoardStr
188 serge 752
     end if
168 serge 753
           xor eax, eax     ; timeout error
227 serge 754
           ret
755
.ok:
168 serge 756
           xor eax, eax
757
           inc eax
227 serge 758
           ret
759
endp
168 serge 760
761
 
762
proc warm_reset
763
           locals
227 serge 764
             counter dd ?
765
           endl
766
168 serge 767
 
227 serge 768
           mov edx, GLOB_CTRL
769
           call [ctrl.ctrl_write32]
770
168 serge 771
 
772
           mov esi, msgWarm
227 serge 773
           call SysMsgBoardStr
188 serge 774
     end if
168 serge 775
776
 
227 serge 777
.wait:
168 serge 778
           mov eax, 100000    ; wait 100 ms
227 serge 779
           call StallExec
780
168 serge 781
 
227 serge 782
           call [ctrl.ctrl_read32]
783
           test eax, 4
784
           jz .ok
785
           sub [counter], 1
786
           jnz .wait
787
168 serge 788
 
789
           mov esi, msgWRFail
227 serge 790
           call SysMsgBoardStr
188 serge 791
     end if
168 serge 792
           stc
227 serge 793
           ret
794
.ok:
168 serge 795
           mov edx, CTRL_STAT
227 serge 796
           call [ctrl.ctrl_read32]
797
           and eax, CTRL_ST_CREADY
798
           jz .fail
168 serge 799
           clc
800
           ret
227 serge 801
.fail:
168 serge 802
           stc
803
           ret
227 serge 804
endp
168 serge 805
806
 
807
proc cold_reset
808
           locals
227 serge 809
             counter dd ?
810
            endl
811
168 serge 812
 
227 serge 813
           call [ctrl.ctrl_read32]
233 serge 814
           and eax, not 0x08
815
           or eax, 0x02
816
           mov edx, GLOB_CTRL
817
           call [ctrl.ctrl_write32]
227 serge 818
168 serge 819
 
820
           mov esi, msgCold
227 serge 821
           call SysMsgBoardStr
188 serge 822
     end if
168 serge 823
824
 
227 serge 825
.wait:
168 serge 826
           mov eax, 100000    ; wait 100 ms
227 serge 827
           call StallExec
828
168 serge 829
 
227 serge 830
           call [ctrl.ctrl_read32]
831
           test eax, 4
832
           jz .ok
833
           sub [counter], 1
834
           jnz .wait
835
168 serge 836
 
837
           mov esi, msgCRFail
227 serge 838
           call SysMsgBoardStr
188 serge 839
     end if
168 serge 840
.fail:
233 serge 841
           stc
227 serge 842
           ret
843
.ok:
168 serge 844
           mov edx, CTRL_STAT
227 serge 845
           call [ctrl.ctrl_read32]
846
           and eax, CTRL_ST_CREADY
847
           jz .fail
168 serge 848
           clc
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
233 serge 1037
@@:
168 serge 1038
           rdtsc
227 serge 1039
           sub eax, ebx
1040
           sbb edx, ecx
1041
           js @B
233 serge 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
 
247 serge 1111
dword2str:
1112
      mov  esi, hex_buff
1113
      mov ecx, -8
1114
@@:
1115
      rol eax, 4
1116
      mov ebx, eax
1117
      and ebx, 0x0F
1118
      mov bl, [ebx+hexletters]
1119
      mov [8+esi+ecx], bl
1120
      inc ecx
1121
      jnz @B
1122
      ret
1123
1124
 
1125
 
168 serge 1126
1127
 
188 serge 1128
devices dd (CTRL_SIS  shl 16)+VID_SIS,msg_AC, set_SIS
168 serge 1129
        dd 0
247 serge 1130
168 serge 1131
 
378 serge 1132
168 serge 1133
 
227 serge 1134
msg_SIS      db 'Silicon Integrated Systems',13,10, 0
1135
1136
 
168 serge 1137
1138
 
1139
msgFail      db 'device not found',13,10,0
1140
msgPlay      db 'start play', 13,10,0
1141
msgStop      db 'stop play',  13,10,0
1142
msgNotify    db 'call notify',13,10,0
1143
msgIRQ       db 'AC97 IRQ', 13,10,0
227 serge 1144
msgInitCtrl  db 'init controller',13,10,0
168 serge 1145
msgInitCodec db 'init codec',13,10,0
1146
msgPrimBuff  db 'create primary buffer',13,10,0
1147
msgReg       db 'set service handler',13,10,0
1148
msgOk        db 'service installed',13,10,0
1149
msgCold      db 'cold resret',13,10,0
1150
msgWarm      db 'warm reset',13,10,0
1151
msgWRFail    db 'warm reset failed',13,10,0
1152
msgCRFail    db 'cold reset failed',13,10,0
1153
msgCFail     db 'codec not ready',13,10,0
1154
msgStatus    db 'global status   ',0
247 serge 1155
msgControl   db 'global control  ',0
1156
188 serge 1157
 
247 serge 1158
hex_buff     db 8 dup(0),13,10,0
1159
1160
 
1161
 
188 serge 1162
1163
 
1164
buff_list        rd 32
1165
1166
 
1167
ctrl AC_CNTRL
1168
1169
 
1170
civ_val  rd 1
1171