Subversion Repositories Kolibri OS

Rev

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

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