Subversion Repositories Kolibri OS

Rev

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