Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. align 4
  9. proc detect_codec
  10.            locals
  11.              codec_id dd ?
  12.            endl
  13.  
  14.            stdcall codec_read, dword 0x7C
  15.            shl eax, 16
  16.            mov [codec_id], eax
  17.  
  18.            stdcall codec_read, dword 0x7E
  19.            or eax, [codec_id]
  20.  
  21.            mov [codec.chip_id], eax
  22.            and eax, 0xFFFFFF00
  23.  
  24.            mov edi, codecs
  25. @@:
  26.            mov ebx, [edi]
  27.            test ebx, ebx
  28.            jz .unknown
  29.  
  30.            cmp eax, ebx
  31.            jne .next
  32.            mov eax, [edi+4]
  33.            mov [codec.ac_vendor_ids], eax
  34.            mov esi, eax
  35.            call SysMsgBoardStr
  36.            stdcall detect_chip, [edi+8]
  37.  
  38.            ret
  39. .next:
  40.            add edi, 12
  41.            jmp @B
  42. .unknown:
  43.            mov [codec.ac_vendor_ids], ac_unknown
  44.            mov [codec.chip_ids], chip_unknown
  45.  
  46.            mov esi, chip_unknown
  47.            call SysMsgBoardStr
  48.            mov eax, [codec.chip_id]
  49.            call dword2str
  50.            call SysMsgBoardStr
  51.            ret
  52. endp
  53.  
  54. align 4
  55. proc detect_chip stdcall, chip_tab:dword
  56.  
  57.            mov eax, [codec.chip_id]
  58.            and eax, 0xFF
  59.  
  60.            mov edi, [chip_tab]
  61. @@:
  62.            mov ebx, [edi]
  63.            cmp ebx, 0xFF
  64.            je .unknown
  65.  
  66.            cmp eax,ebx
  67.            jne .next
  68.            mov eax, [edi+4]
  69.            mov [codec.chip_ids], eax
  70.            mov esi, eax
  71.            call SysMsgBoardStr
  72.            ret
  73. .next:
  74.            add edi, 8
  75.            jmp @b
  76. .unknown:
  77.            mov [codec.chip_ids], chip_unknown
  78.            mov esi, chip_unknown
  79.            call SysMsgBoardStr
  80.            mov eax, [codec.chip_id]
  81.            call dword2str
  82.            call SysMsgBoardStr
  83.            ret
  84. endp
  85.  
  86. align 4
  87. proc setup_codec
  88.  
  89.            xor eax, eax
  90.            stdcall codec_write, dword CODEC_AUX_VOL
  91.  
  92.            mov eax, 0x0B0B
  93.            stdcall codec_write, dword CODEC_MASTER_VOL_REG
  94.  
  95.            mov ax, 0x08
  96.            stdcall codec_write, dword 0x0C
  97.  
  98.            mov ax, 0x0808
  99.            stdcall codec_write, dword CODEC_PCM_OUT_REG
  100.  
  101.            mov ax, 0x0808
  102.            stdcall codec_write, dword 0x10
  103.  
  104.            mov ax, 0x0808
  105.            stdcall codec_write, dword 0x12
  106.  
  107.            mov ax, 0x0808
  108.            stdcall codec_write, dword 0x16
  109.  
  110.  
  111.            stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
  112.            and eax, 0FFFFh - BIT1                  ; clear DRA (BIT1)
  113.            or eax, BIT0                           ; set VRA (BIT0)
  114.            stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
  115.  
  116.            stdcall set_sample_rate, dword 48000
  117.  
  118. .init_error:
  119.            xor    eax, eax                           ; exit with error
  120.            ret
  121. endp
  122.  
  123.  
  124. ; param
  125. ;  eax= volume  -10000 - 0 for both channels
  126.  
  127. align 4
  128. set_master_vol:
  129.            cmp eax, 0
  130.            jl @F
  131.            xor eax, eax
  132.            jmp .set
  133. @@:
  134.            cmp eax, -9450
  135.            jg .set
  136.            mov eax, -9450     ;clamp into 6 bits
  137. .set:
  138.            cdq
  139.            mov ebx, -150
  140.            idiv ebx
  141.            mov ah, al
  142.            stdcall codec_write, dword CODEC_MASTER_VOL_REG
  143.            xor eax, eax
  144.            ret
  145.  
  146. align 4
  147. proc get_master_vol stdcall, pvol:dword
  148.  
  149.            stdcall codec_read, dword CODEC_MASTER_VOL_REG
  150.            and eax, 0x3F
  151.            imul eax, -150
  152.            mov ebx, [pvol]
  153.            mov [ebx], eax
  154.            xor eax, eax
  155.            ret
  156. endp
  157.  
  158. align 4
  159. proc set_sample_rate stdcall, rate:dword
  160.            mov eax, [rate]
  161.            stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
  162.            ret
  163. endp
  164.  
  165. align 16
  166. ac_unknown     db 'unknown manufacturer',13,10,0
  167. ac_Realtek     db 'Realtek Semiconductor',13,10,0
  168. ac_Analog      db 'Analog Devices',13,10,0
  169. ac_CMedia      db 'C-Media Electronics',13,10,0
  170. ac_Cirrus      db 'Cirrus Logic',13,10,0
  171.  
  172. chip_unknown   db 'unknown codec id ', 0
  173.  
  174. CHIP_ANALOG    equ 0x41445300
  175. CHIP_REALTEK   equ 0x414C4700
  176. CHIP_CMEDIA    equ 0x434D4900
  177. CHIP_CIRRUS    equ 0x43525900
  178.  
  179. align 16
  180. codecs         dd CHIP_ANALOG, ac_Analog,  chips_Analog
  181.                dd CHIP_CMEDIA, ac_CMedia,  chips_CMedia
  182.                dd CHIP_REALTEK,ac_Realtek, chips_Realtek
  183.                dd CHIP_CIRRUS, ac_Cirrus,  chips_Cirrus
  184.                dd 0
  185.  
  186. align 16
  187. chips_Analog   dd 0x03, chip_AD1819
  188.                dd 0x40, chip_AD1881
  189.                dd 0x48, chip_AD1881A
  190.                dd 0x60, chip_AD1884
  191.                dd 0x61, chip_AD1886
  192.                dd 0x62, chip_AD1887
  193.                dd 0x63, chip_AD1886A
  194.                dd 0x70, chip_AD1980
  195.                dd 0x75, chip_AD1985
  196.                dd 0xFF
  197.  
  198. chips_Realtek:
  199.                dd 0x20, chip_ALC650
  200.                dd 0x21, chip_ALC650D
  201.                dd 0x22, chip_ALC650E
  202.                dd 0x23, chip_ALC650F
  203.                dd 0x60, chip_ALC655
  204.                dd 0x80, chip_ALC658
  205.                dd 0x81, chip_ALC658D
  206.                dd 0x90, chip_ALC850
  207.                dd 0xFF
  208.  
  209. chips_CMedia   dd 0x41, chip_CM9738
  210.                dd 0x61, chip_CM9739
  211.                dd 0x69, chip_CM9780
  212.                dd 0x78, chip_CM9761
  213.                dd 0x82, chip_CM9761
  214.                dd 0x83, chip_CM9761
  215.                dd 0xFF
  216.  
  217. chips_Cirrus   dd 0x00, chip_CS4297
  218.                dd 0x10, chip_CS4297A
  219.                dd 0x20, chip_CS4298
  220.                dd 0x28, chip_CS4294
  221.                dd 0x30, chip_CS4299
  222.                dd 0x34, chip_CS4299D
  223.                dd 0x48, chip_CS4201
  224.                dd 0x58, chip_CS4205
  225.                dd 0x60, chip_CS4291
  226.                dd 0x70, chip_CS4202
  227.                dd 0xFF
  228.  
  229.  
  230. align 16
  231. ;Analog Devices
  232. chip_AD1819      db 'AD1819 ',0dh,0ah,00h
  233. chip_AD1881      db 'AD1881 ',0dh,0ah,00h
  234. chip_AD1881A     db 'AD1881A',0dh,0ah,00h
  235. chip_AD1884      db 'AD1885 ',0dh,0ah,00h
  236. chip_AD1885      db 'AD1885 ',0dh,0ah,00h
  237. chip_AD1886      db 'AD1886 ',0dh,0ah,00h
  238. chip_AD1886A     db 'AD1886A',0dh,0ah,00h
  239. chip_AD1887      db 'AD1887 ',0dh,0ah,00h
  240. chip_AD1980      db 'AD1980 ',0dh,0ah,00h
  241. chip_AD1985      db 'AD1985 ',0dh,0ah,00h
  242.  
  243. ;Realtek
  244. chip_ALC650      db 'ALC650 ',0dh,0ah,00h
  245. chip_ALC650D     db 'ALC650D',0dh,0ah,00h
  246. chip_ALC650E     db 'ALC650E',0dh,0ah,00h
  247. chip_ALC650F     db 'ALC650F',0dh,0ah,00h
  248. chip_ALC655      db 'ALC655 ',0dh,0ah,00h
  249. chip_ALC658      db 'ALC658 ',0dh,0ah,00h
  250. chip_ALC658D     db 'ALC658D',0dh,0ah,00h
  251. chip_ALC850      db 'ALC850 ',0dh,0ah,00h
  252.  
  253. ;CMedia
  254. chip_CM9738      db 'CMI9738', 0dh,0ah,0
  255. chip_CM9739      db 'CMI9739', 0dh,0ah,0
  256. chip_CM9780      db 'CMI9780', 0dh,0ah,0
  257. chip_CM9761      db 'CMI9761', 0dh,0ah,0
  258.  
  259. ;Cirrus
  260. chip_CS4297      db 'CS4297',13,10,0
  261. chip_CS4297A     db 'CS4297A',13,10,0
  262. chip_CS4298      db 'CS4298',13,10,0
  263. chip_CS4294      db 'CS4294',13,10,0
  264. chip_CS4299      db 'CS4299',13,10,0
  265. chip_CS4299D     db 'CS4299D',13,10,0
  266. chip_CS4201      db 'CS4201',13,10,0
  267. chip_CS4205      db 'CS4205',13,10,0
  268. chip_CS4291      db 'CS4291',13,10,0
  269. chip_CS4202      db 'CS4202',13,10,0
  270.  
  271.  
  272.