Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. align 4
  3. proc detect_codec
  4.            locals
  5.              codec_id dd ?
  6.            endl
  7.  
  8.            stdcall codec_read, dword 0x7C
  9.            shl eax, 16
  10.            mov [codec_id], eax
  11.  
  12.            stdcall codec_read, dword 0x7E
  13.            or eax, [codec_id]
  14.  
  15.            mov [codec.chip_id], eax
  16.            and eax, 0xFFFFFF00
  17.  
  18.            mov edi, codecs
  19. @@:
  20.            mov ebx, [edi]
  21.            test ebx, ebx
  22.            jz .unknown
  23.  
  24.            cmp eax, ebx
  25.            jne .next
  26.            mov eax, [edi+4]
  27.            mov [codec.ac_vendor_ids], eax
  28.            stdcall detect_chip, [edi+8]
  29.            ret
  30. .next:
  31.            add edi, 12
  32.            jmp @B
  33. .unknown:
  34.            mov [codec.ac_vendor_ids], ac_unknown
  35.            mov [codec.chip_ids], chip_unknown
  36.            ret
  37. endp
  38.  
  39. align 4
  40. proc detect_chip stdcall, chip_tab:dword
  41.  
  42.            mov eax, [codec.chip_id]
  43.            and eax, 0xFF
  44.  
  45.            mov edi, [chip_tab]
  46. @@:
  47.            mov ebx, [edi]
  48.            test ebx, ebx
  49.            jz .unknown
  50.  
  51.            cmp eax,ebx
  52.            jne .next
  53.            mov eax, [edi+4]
  54.            mov [codec.chip_ids], eax
  55.            ret
  56. .next:
  57.            add edi, 8
  58.            jmp @b
  59. .unknown:
  60.            mov [codec.chip_ids], chip_unknown
  61.            ret
  62. endp
  63.  
  64. align 4
  65. proc setup_codec
  66.  
  67.         xor eax, eax
  68.         stdcall codec_write, dword CODEC_AUX_VOL
  69.  
  70.         mov eax, 0x1010
  71.         stdcall codec_write, dword CODEC_MASTER_VOL_REG
  72.  
  73.         mov ax, 0x08
  74.         stdcall codec_write, dword 0x0C
  75.  
  76.         mov ax, 0x0808
  77.         stdcall codec_write, dword CODEC_PCM_OUT_REG
  78.  
  79.         mov ax, 0x0808
  80.         stdcall codec_write, dword 0x10
  81.  
  82.         mov ax, 0x0808
  83.         stdcall codec_write, dword 0x12
  84.  
  85.         mov ax, 0x0808
  86.         stdcall codec_write, dword 0x16
  87.  
  88.  
  89.         stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
  90.  
  91.         and  eax, 0FFFFh - BIT1                  ; clear DRA (BIT1)
  92.         or   eax, BIT0                           ; set VRA (BIT0)
  93.         stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
  94.  
  95.         stdcall set_sample_rate, dword 48000
  96.  
  97. .init_error:
  98.  
  99.         xor    eax, eax                           ; exit with error
  100.         ret
  101.  
  102. endp
  103.  
  104. align 4
  105. proc set_master_vol stdcall, vol:dword
  106.  
  107.            mov ebx, 63
  108.            mov ecx, 20644
  109.            mov eax, [vol]
  110.            cmp eax, 90
  111.            jna @f
  112.            mov eax, 90
  113. @@:
  114.            mul ecx
  115.            shr eax, 15
  116.            sub ebx, eax
  117.            mov ah, bl
  118.            mov al, bl
  119.            stdcall codec_write, dword CODEC_MASTER_VOL_REG
  120.            ret
  121. endp
  122.  
  123. align 4
  124. proc get_master_vol stdcall, pvol:dword
  125.  
  126.            stdcall codec_read, dword CODEC_MASTER_VOL_REG
  127.            and eax, 0x3F
  128.            mov ebx, 63
  129.            mov ecx, 20644
  130.  
  131.            xchg eax, ebx
  132.            sub eax, ebx
  133.            shl eax, 15
  134.            xor edx, edx
  135.            div ecx
  136.            mov ebx, [pvol]
  137.            mov [ebx], eax
  138.            ret
  139. endp
  140.  
  141. align 4
  142. proc set_sample_rate stdcall, rate:dword
  143.            mov eax, [rate]
  144.            stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
  145.            ret
  146. endp
  147.  
  148. align 16
  149. ac_unknown     db 'unknown manufacturer',13,10,0
  150. ac_Realtek     db 'Realtek Semiconductor',13,10,0
  151. ac_Analog      db 'Analog Devices',13,10,0
  152. ac_CMedia      db 'C-Media Electronics',13,10,0
  153. chip_unknown   db 'unknown chip', 13,10,0
  154.  
  155. CHIP_ANALOG    equ 0x41445300
  156. CHIP_REALTEK   equ 0x414C4700
  157. CHIP_CMEDIA    equ 0x434D4900
  158.  
  159. align 16
  160. codecs         dd CHIP_ANALOG, ac_Analog,  chips_Analog
  161.                dd CHIP_CMEDIA, ac_CMedia,  chips_CMedia
  162.                dd CHIP_REALTEK,ac_Realtek, chips_Realtek
  163.                dd 0
  164.  
  165. align 16
  166. chips_Analog   dd 0x03, chip_AD1819
  167.                dd 0x40, chip_AD1881
  168.                dd 0x48, chip_AD1881A
  169.                dd 0x60, chip_AD1884
  170.                dd 0x61, chip_AD1886
  171.                dd 0x62, chip_AD1887
  172.                dd 0x63, chip_AD1886A
  173.                dd 0x70, chip_AD1980
  174.                dd 0x75, chip_AD1985
  175.                dd 0
  176.  
  177. chips_Realtek  dd 0x20, chip_ALC650
  178.                dd 0x21, chip_ALC650D
  179.                dd 0x22, chip_ALC650E
  180.                dd 0x23, chip_ALC650F
  181.                dd 0x60, chip_ALC655
  182.                dd 0x80, chip_ALC658
  183.                dd 0x81, chip_ALC658D
  184.                dd 0x90, chip_ALC850
  185.                dd 0
  186.  
  187. chips_CMedia   dd 0x41, chip_CM9738
  188.                dd 0x61, chip_CM9739
  189.                dd 0x69, chip_CM9780
  190.                dd 0x78, chip_CM9761
  191.                dd 0x82, chip_CM9761
  192.                dd 0x83, chip_CM9761
  193.                dd 0
  194.  
  195. align 16
  196. ;Analog Devices
  197. chip_AD1819      db 'AD1819 ',0dh,0ah,00h
  198. chip_AD1881      db 'AD1881 ',0dh,0ah,00h
  199. chip_AD1881A     db 'AD1881A',0dh,0ah,00h
  200. chip_AD1884      db 'AD1885 ',0dh,0ah,00h
  201. chip_AD1885      db 'AD1885 ',0dh,0ah,00h
  202. chip_AD1886      db 'AD1886 ',0dh,0ah,00h
  203. chip_AD1886A     db 'AD1886A',0dh,0ah,00h
  204. chip_AD1887      db 'AD1887 ',0dh,0ah,00h
  205. chip_AD1980      db 'AD1980 ',0dh,0ah,00h
  206. chip_AD1985      db 'AD1985 ',0dh,0ah,00h
  207.  
  208. ;Realtek
  209. chip_ALC650      db 'ALC650 ',0dh,0ah,00h
  210. chip_ALC650D     db 'ALC650D',0dh,0ah,00h
  211. chip_ALC650E     db 'ALC650E',0dh,0ah,00h
  212. chip_ALC650F     db 'ALC650F',0dh,0ah,00h
  213. chip_ALC655      db 'ALC655 ',0dh,0ah,00h
  214. chip_ALC658      db 'ALC658 ',0dh,0ah,00h
  215. chip_ALC658D     db 'ALC658D',0dh,0ah,00h
  216. chip_ALC850      db 'ALC850 ',0dh,0ah,00h
  217.  
  218. ;CMedia
  219. chip_CM9738      db 'CMI9738', 0dh,0ah,0
  220. chip_CM9739      db 'CMI9739', 0dh,0ah,0
  221. chip_CM9780      db 'CMI9780', 0dh,0ah,0
  222. chip_CM9761      db 'CMI9761', 0dh,0ah,0
  223.  
  224.