Subversion Repositories Kolibri OS

Rev

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