Chinaunix首页 | 论坛 | 博客
  • 博客访问: 525321
  • 博文数量: 87
  • 博客积分: 4086
  • 博客等级: 上校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 15:55
文章分类

全部博文(87)

文章存档

2012年(3)

2010年(13)

2009年(7)

2008年(64)

我的朋友

分类: LINUX

2008-05-27 21:30:24

 

UDA1341TS声卡驱动程序往2.6.11内核的移植总结
关键词: UDA1341    linux2.6.11.1    驱动移植                                          

注:这个驱动的移植主要是是将原来的2..4.18内核中的1341驱动程序直接往2.6.11上移植的,没有采用ALSA。移植过程中也曾经参考过一些资

料,具体是哪位大虾的资料忘记了,在此感谢文中所参考的资料的大虾们

硬件环境:SBC-2410X开发板(CPU:S3C2410X)
内核版本:2.6.11.1
运行环境:Debian2.6.8
交叉编译环境:gcc-3.3.4-glibc-2.3.3

第一部分     声卡UDA1341TS驱动程序播放部分的移植

一、从网上将Linux内核源代码下载到本机上,并将其解压:
#tar jxf linux-2.6.11.1.tar.bz2
二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。

(1)指定目标平台。
    移植前:

  ARCH                                 ?= $(SUBARCH)
    移植后:
     ARCH            :=arm
(2)指定交叉编译器。

  移植前:
     CROSS_COMPILE  ?=
    移植后:
     CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu-

注:这里假设编译器就放在本机的那个目录下。

三、添加并修改驱动程序源代码,这涉及到以下几个方面。

(1)、将开发板配带的声卡驱动程序s3c2410-uda1341.c源程序放到sound/oss/目录下。

#cp s3c2410-uda1341.c ./sound/oss

(2)、在s3c2410-uda1341.c驱动程序里面添加所用到的头文件:

#include

#include

#include

#include

注:因为在修改驱动程序里需要用到有关的寄存器,而以上几个头文件中定义了相关的寄存器。


添加:

static struct s3c2410_dma_client s3c2410_dma_client_out ={
       .name ="I2SSDO",
};


static struct s3c2410_dma_client s3c2410_dma_client_in={
       .name ="I2SSDI",
};

static void audio_dmaout_done_callback(s3c2410_dma_chan_t  *r_value,void *buf_id, int size,s3c2410_dma_buffresult_t result);

static void audio_dmain_done_callback(s3c2410_dma_chan_t  *r_value,void *buf_id, int size,s3c2410_dma_buffresult_t result);

注:在2.6.11的内核接口函数中(s3c2410_dma_request(),s3c2410_dma_set_buffdone_fn()),需要用到以上结构以及函数作为入口参数。

添加:sbc_gpio_con_set()、sbc_gpio_pullup_set()、sbc_gpio_function_set()的声明以及实现代码用以替代2.4.18代码中的

write_gpio_bit()、set_gpio_ctrl()函数,因为在2.4.18中这两个函数都是用指针的方式对CPU寄存器进行设置,而在2.6.11的驱动程序里面

用了__raw_writel()的方式对寄存器设置进行了封装。


由于在2.6.11内核中dma接口函数的修改,在驱动程序移植过程中用了2.6.11的许多函数对2.4.18中的函数进行了替换,主要有:


用dma_free_coherent()替代了consistent_free(),用s3c2410_dma_ctrl(s->dma_ch,S3C2410_DMAOP_FLUSH)替代了s3c2410_dma_flush_all(s

->dma_ch),用dma_alloc_coherent()替代了consistent_alloc(),用s3c2410_dma_enqueue()替代了s3c2410_dma_queue_buffer(),用

s3c2410_dma_request()替代了s3c2410_request_dma()。


移植代码过程中还对许多函数进行了修改,主要修改的函数有:


audio_set_dsp_speed(),init_s3c2410_iis_bus_rx(),init_s3c2410_iis_bus_tx():用__raw_writel()函数对CPU寄存器进行了设置;

audio_init_dma():采用以下函数对系统的DMA通道进行初始化设置,用s3c2410_dma_devconfig()设置CPU中的DISRC、DISRCC、DIDST、DIDSTC

寄存器,用s3c2410_dma_config()设置CPU的DCON寄存器,用s3c2410_dma_set_buffdone_fn()设置DMA回调函数(注意回调函数的修改)、用

s3c2410_dma_setflags()设置DMA的flags。

注:具体修改详见驱动程序。


(3)、在include/asm/arch-s3c2410/regs-iis.h文件中添加如下宏定义:

#define S3C2410_IISREG(x) ((x)+S3C2410_VA_IIS)

#define S3C2410_SBC_IISCON S3C2410_IISREG(0X00)

#define S3C2410_SBC_IISMOD      S3C2410_IISREG(0x04)

#define S3C2410_SBC_IISPSR  S3C2410_IISREG(0x08)

#define S3C2410_SBC_IISFCON          S3C2410_IISREG(0x0c)

#define S3C2410_SBC_IISFIFO S3C2410_IISREG(0x10)

注:以上所定义的宏,都被驱动程序所用到。

(4)、修改arch/arm/mach-s3c2410/s3c2410.c,在s3c2410_iodesc结构中添加:IODESC_ENT(IIS),
IODESC_ENT(GPIO)

注:由于网卡的硬件连接上用到了系统的IIS总线,以上添加的语句就是为了将CPU的IIS寄存器的物理地址映射到所指向的虚拟地址上去,上面

的结构还定义了网卡虚拟地址所占用的区间,并指定了该区间所指向的域(的属性)。

(5)、修改sound/oss/目录下的Kconfig文件,在最后添加如下内容:
config SBC2410_SND_UDA1341
       tristate "S3C2410 UDA1341 driver (SBC2410)"
       depends on SOUND_PRIME!=n &&  SOUND && ARM && ARCH_SMDK2410
       help
        Say Y here if you have an SMDK2410 and want to use its Philips
         UDA1341 audio chip.

(6)、修改sound/oss/目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_SBC2410_SND_UDA1341) +=s3c2410-uda1341.o

四、配置、编译内核。在内核顶层目录当中键入:

           #make smdk2410_defconfig

由于2.6的内核默认就支持了S3C2410,所以就有一个默认的内核配置文件。里面只是包括了一个简单的配置,要使声卡编译进内核,还要进行

手工配置。

#make menuconfig
         Sound  --->
                       Open Sound System  --->
                                    
  • S3C2410 UDA1341 driver (SBC2410)

    将刚才添加的声卡驱动程序静态添加到内核当中。

    最后进行内核编译。
    #make

    然后将镜像下载到开发板中去,启动信息如下:

    VIVI version 0.1.4 (root@embed4) (gcc version 2.95.3 20010315 (release)) #0.1.4 ?. 3.. 29 17:27:26 CST 2005GDLC

    MMU table base address = 0x33DFC000

    Succeed memory mapping.

    NAND device: Manufacture ID: 0xec, Chip ID: 0x76 (Samsung K9D1208V0M)

    Could not found stored vivi parameters. Use default vivi parameters.

    Press Return to start the LINUX now, any other key for vivi

    Copy linux kernel from 0x00030000 to 0x30008000, size = 0x00100000 ... done

    zImage magic = 0x016f2818

    Setup linux parameters at 0x30000100

    linux command line is: "console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.1:/friendly-arm/root

    ip=192.168.0.69:192.168.0.1:192"MACH_TYPE = 193

    NOW, Booting Linux......

    Uncompressing Linux........................................................... done, booting the kernel.

    Linux version 2.6.11.1 (root@embed4) (gcc version 3.3.4) #172 Tue Apr 26 17:56:38 CST 2005

    CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)

    CPU0: D VIVT write-back cache

    CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

    CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

    Machine: SMDK2410

    ATAG_INITRD is deprecated; please update your bootloader.

    Memory policy: ECC disabled, Data cache writeback

    CPU S3C2410A (id 0x32410002)

    S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz

    S3C2410 Clock control, (c) 2004 Simtec Electronics

    Built 1 zonelists

    Kernel command line: console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.1:/friendly-arm/root

    ip=192.168.0.69:192.168.0.1:192.16firq: clearing subpending status 00000002

    PID hash table entries: 512 (order: 9, 8192 bytes)

    timer tcon=00000000, tcnt a2c1, tcfg 00000200,00000000, usec 00001eb8

    Console: colour dummy device 80x30

    Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)

    Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)

    Memory: 64MB = 64MB total

    Memory: 62976KB available (1483K code, 269K data, 96K init)

    Mount-cache hash table entries: 512 (order: 0, 4096 bytes)

    CPU: Testing write buffer coherency: ok

    NET: Registered protocol family 16

    S3C2410: Initialising architecture

    S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics

    DMA channel 0 at c4800000, irq 33

    DMA channel 1 at c4800040, irq 34

    DMA channel 2 at c4800080, irq 35

    DMA channel 3 at c48000c0, irq 36

    devfs: 2004-01-31 Richard Gooch ()

    devfs: devfs_debug: 0x0

    devfs: boot_options: 0x1

    leds initialized

    s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410

    s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410

    s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410

    io scheduler noop registered

    io scheduler anticipatory registered

    io scheduler deadline registered

    io scheduler cfq registered

    RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize

    Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)

    eth0: CS8900A rev E at 0xe0000300 irq=53, no eeprom , addr: 08: 0:3E:26:0A:5B

    S3C2410 NAND Driver, (c) 2004 Simtec Electronics

    s3c2410-nand: mapped registers at c4880000

    80 ns is too big for current clock rate 100000000

    80 ns is too big for current clock rate 100000000

    80 ns is too big for current clock rate 100000000

    s3c2410-nand: timing: Tacls 419ns, Twrph0 419ns, Twrph1 419ns

    NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)

    Scanning device for bad blocks

    mice: PS/2 mouse device common for all mice

    UDA1341 audio driver initialized


    NET: Registered protocol family 2

    IP: routing cache hash table of 512 buckets, 4Kbytes

    TCP established hash table entries: 4096 (order: 3, 32768 bytes)

    TCP bind hash table entries: 4096 (order: 2, 16384 bytes)

    TCP: Hash tables configured (established 4096 bind 4096)

    NET: Registered protocol family 1

    IP-Config: Complete:

          device=eth0, addr=192.168.0.69, mask=255.255.255.0, gw=192.168.0.1,

         host=matrix4, domain=, nis-domain=arm9.net,

         bootserver=192.168.0.1, rootserver=192.168.0.1, rootpath=

    Looking up port of RPC 100003/2 on 192.168.0.1

    Looking up port of RPC 100005/1 on 192.168.0.1

    VFS: Mounted root (nfs filesystem).

    Mounted devfs on /dev

    Freeing init memory: 96K

    init started:  BusyBox v0.60.5 (2003.09.05-09:25+0000) multi-call binary

    mount: Mounting none on /root failed: Invalid argument

    mount: Mounting none on /tmp failed: Invalid argument

    mount: Mounting none on /var failed: Invalid argument

    [01/Jan/1970:00:00:05 +0000] boa: server version Boa/0.94.13

    [01/Jan/1970:00:00:05 +0000] boa: server built Feb 28 2004 at 21:47:23.

    [01/Jan/1970:00:00:05 +0000] boa: starting server pid=28, port 80

    Please press Enter to activate this console.

    可以看到UDA1341 audio driver initialized的信息,说明声卡已经初始化。进入终端之后,查看设备文件名:

    [root@fa /]# ls -al /dev/sound/*
    crw-------    1 root     root      14,   3 Jan  1 00:00 /dev/sound/dsp

    crw-------    1 root     root      14,   0 Jan  1 00:00 /dev/sound/mixer

    由此可见,声卡已经成功驱动,要测试驱动程序可以用cat 命令(如:cat  ALSNDMGR.WAV > dev/sound/dsp),也可以用madplay播放mp3文件




    第二部分     声卡UDA1341TS驱动程序播放部分的移植

        1、UDA1341TS录音调试记录
    修改sound/oss/s3c2410-uda1341.c 文件中的audio_init_dam函数
    对应于dma_ch=1的情况
    s3c2410_dma_config(s->dma_ch,2,0xa2900000);原来为0xa0900000(设置DCON寄存器,对应位[26:24]),查看S3C2410数据手册(8-10)中的

    对应位定义,DCON1[26:24]应为010(I2SSDI)、而原来设置为000(UART1)

    2、测试:
    (1)、从网上下载ecasound-2.4.3.tar.gz
    (2)、tar zxf ecasound-2.4.3.tar.gz
    (3)、cd ecasound-2.4.3
    (4)、配置:
    CC=/opt/crosstool/gcc-3.3.4-glibc-2.3.3/arm-s3c2410-linux-gnu/bin/arm-s3c2410-linux-gnu-gcc CXX=/opt/crosstool/gcc-3.3.4-

    glibc-2.3.3/arm-s3c2410-linux-gnu/bin/arm-s3c2410-linux-gnu-g++ ./configure --enable-all-static --disable-ncurses --host=arm

    -s3c2410-linux-gnu  --target=arm-s3c2410-linux-gnu --prefix=/friendly-arm/rootfs_netserv/usr/local
    (5)、编译
    make
    (6)、安装
    sudo make install
    (7)、cd /friemdly-arm/rootfs_netserv/usr/local/bin
    (8)、./ecasound -i:/dev/sound/dsp -o /tmp/somefile.wav -c
    ********************************************************************************
    *        ecasound v2.4.3 (C) 1997-2005 Kai Vehmanen and others
    ********************************************************************************
    (eca-resources) WARNING: Global resource file '/friendly-arm/rootfs_netserv/usr/local/share/ecasound/ecasoundrc' not

    availab![* Session created *]
    [* Chainsetup created (cmdline) *]
    (eca-resources) WARNING: Global resource file '/friendly-arm/rootfs_netserv/usr/local/share/ecasound/ecasoundrc' not

    availab!(eca-chainsetup) WARNING: Unable to read global resources. May result in incorrect behaviour.
    ecasound ('h' for help)> h
    (eca-iamode-parser)
    -------------------------------------------------------------------
    ecasound interactive-mode - command reference
    -------------------------------------------------------------------
    'q' - Quits ecasound
    'start', 't' - Processing is started (play)
    'stop', 's' - Stops processing
    'rewind time-in-seconds', 'rw time-in-seconds' - Rewind
    'forward time-in-seconds', 'fw time-in-seconds' - Forward
    'setpos time-in-seconds' - Sets the current position to 'time-in-seconds' seconds from the beginning.
    'engine-launch' - Initialize and start engine
    'engine-status' - Engine status
    'cs-status', 'st' - Chainsetup status
    'c-status', 'cs' - Chain status
    'cop-status', 'es' - Chain operator status
    'ctrl-status' - Controller status
    'aio-status', 'fs' - Audio input/output status
    --- see ecasound-iam(1) manual page for more info -----------------
    输入start
    ecasound ('h' for help)> start
    控制台终端反馈如下信息:
    (eca-control) WARNING: No chainsetup connected. Trying to connect currently selected chainsetup.
    [* Connecting chainsetup *]
    (eca-chainsetup) 'rt' buffering mode selected.
    (audioio-oss) (audioio-oss) WARNING: OSS-device doesn't support SNDCTL_DSP_GETCAPS.
    (audioio-oss) WARNING: OSS-device doesn't support SNDCTL_DSP_SETTRIGGER!
    (eca-chainsetup) Audio object "/dev/sound/dsp", mode "read".
    (audio-io) Format: s16_le, channels 2, srate 44100, interleaved.
    (eca-chainsetup) Audio object "some1.wav", mode "read/write".
    (audio-io) Format: s16_le, channels 2, srate 44100, interleaved.
    [* Chainsetup connected *]
    (eca-control-objects) Connected chainsetup:  "command-line-setup".
    [* Controller/Processing started *]
    ecasound ('h' for help)> [* Engine init - Driver start *]
    (eca-engine) Using realtime-scheduling (SCHED_FIFO:50).
    Unable to handle kernel paging request at virtual address ff3cfccf
    pgd = c0004000
    [ff3cfccf] *pgd=00000000
    Internal error: Oops: 803 [#1]
    Modules linked in: s3c2410_uda1341
    CPU: 0
    PC is at free_block+0x58/0x120
    LR is at drain_array_locked+0x84/0xa8
    pc : []    lr : []    Tainted: P
    sp : c0323f08  ip : c0323f2c  fp : c0323f28
    r10: c023e524  r9 : 00000000  r8 : c02fc970
    r7 : 00000000  r6 : 0000000b  r5 : c02f8ec0  r4 : c2cda020
    r3 : ff38fcd0  r2 : ff3cfccf  r1 : c02fc970  r0 : c2cda070
    Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32  Segment kernel
    Control: 717F  Table: 330A8000  DAC: 00000017
    Process events/0 (pid: 3, stack limit = 0xc0322194)
    Stack: (0xc0323f08 to 0xc0324000)
    3f00:                   0000000b c02fc960 c02fc970 c02f8f30 c023e514 c0323f44
    3f20: c0323f2c c005abf0 c005a528 c02f8ec0 00000000 00000001 c0323f70 c0323f48
    3f40: c005aca0 c005ab7c c02ed910 c023e534 80000013 c02ed908 00000000 c02ed900
    3f60: c005ac14 c0323fc8 c0323f74 c0047884 c005ac24 ffffffff ffffffff 00000001
    3f80: 00000000 c0034b50 00010000 00000000 00000000 c02eb7c0 c0034b50 00100100
    3fa0: 00200200 c0322000 c0309f2c c02ed900 c00476bc fffffffc 00000000 c0323ff4
    3fc0: c0323fcc c004bcc8 c00476cc ffffffff ffffffff 00000000 00000000 00000000
    3fe0: 00000000 00000000 00000000 c0323ff8 c003a240 c004bc54 c0121508 c0121524
    Backtrace:
    [] (free_block+0x0/0x120) from [] (drain_array_locked+0x84/0xa8)
    r8 = C023E514  r7 = C02F8F30  r6 = C02FC970  r5 = C02FC960
    r4 = 0000000B
    [] (drain_array_locked+0x0/0xa8) from [] (cache_reap+0x8c/0x1e8)
    r6 = 00000001  r5 = 00000000  r4 = C02F8EC0
    [] (cache_reap+0x0/0x1e8) from [] (worker_thread+0x1c8/0x258)
    [] (worker_thread+0x0/0x258) from [] (kthread+0x84/0xb0)
    [] (kthread+0x0/0xb0) from [] (do_exit+0x0/0x33c)
    r8 = 00000000  r7 = 00000000  r6 = 00000000  r5 = 00000000
    r4 = 00000000
    Code: e2433606 e593401c e5942004 e5943000 (e5823000)
    <7>dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ba0
    dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0
    s3c2410_dma_enqueue: new buffer c3d00ee0
    dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0
    s3c2410_dma_enqueue: new buffer c3d00a20
    dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0
    s3c2410_dma_enqueue: new buffer c3d009c0
    dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0
    s3c2410_dma_enqueue: new buffer c02ff960
    dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0
    s3c2410_dma_enqueue: new buffer c3d00260
    dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0
    s3c2410_dma_enqueue: new buffer c3d00f20
    dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channel
    dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20
    dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000
    callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0
    s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)
    load_state is 2 => autoreload
    s3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0
    s3c2410_dma_enqueue: new buffer c3d00220
    dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channel

    用麦克风说话,可以从耳机里面听到声音,但是/tmp/somefile.wav文件则为0字节;此时按下Ctrl+C没无法中止录音,而控制台依然打印信息


    用cat命令去测试
    cat /tmp/somefile.wav > /dev/sound/dsp
    也无法听到声音,说明没有写进该文件里面去。

    通过阅读代码,发现在smdk2410_audio_read()函数中,传递给s3c2410_dma_enqueue()函数的参数b->size为零(可以参看 message.txt文件)


    在调用该函数之前,给该参数赋值,则会死机。

    通过修改该参数为s-fragsize,也就是说在smdk2410_audio_read函数中调用s3c2410_dma_enqueue函数时第四个入口参数应该改为s-fragsize

    (两次调用的参数都必须改)
    用cat命令去测试:
    cat /dev/sound/dsp > /tmp/some.wav
    cat /tmp/some.wav > /dev/sound/dsp
    可以成功录音、放音!

    2、解决Full-Duplex
    Full-Duplex就是能够同时放音和录音
    原来的驱动,打开设备时,要先O_RDONLY然后才O_WRONLY,顺序反过来的话,O_RDONLY会出现device busy的错误信息
    追查驱动程序代码发现:用O_RDONLY打开设备,会检查设备是否用了O_WRONLY打开过,这里需要修正。
    好不容易把两个device都打开了,结果只能read(),不能write(),追踪代码发现原来是I2S bus被设置成了receive only模式。
    uda1341是支持Full-Duplex的,因为它的IC输入和输出引脚是分开的,I2S的data sheet上说,它支持同时transmit/receive
    而这个block还各有64kbyte FIFO buffer可用,针对声音输入输出有两条分开的线,是支持Full-Duplex的。
    I2S传输模式支持TX only /Rx only /TXRX mode(手册上写的),但是MIZI的驱动程序没写完整,虽然针对TX RX都用DMA传输,但是驱动

    里面没有这么设计同时使用。
    在驱动程序里面查找iis,可以找到两个名称类似的函数,这两个函数负责对i2s bus做初始化,它的初始化都是设定I2S bus 为TX only或Rx

    only。
    具体修改如下:
    修改audio_open函数
    static int smdk2410_audio_open(struct inode *inode, struct file *file)
    {

            int cold = !audio_active;
            DPRINTK("audio_open\n");
            if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
            //GDLC  if (audio_rd_refcount || audio_wr_refcount)
                    if (audio_rd_refcount)
                            return -EBUSY;
                    audio_rd_refcount++;
            } else if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
                    if (audio_wr_refcount)
                            return -EBUSY;
                    audio_wr_refcount++;
            } else if ((file->f_flags & O_ACCMODE) == O_RDWR) {
                    if (audio_rd_refcount || audio_wr_refcount)
                            return -EBUSY;
                    audio_rd_refcount++;
                   audio_wr_refcount++;
            } else
                    return -EINVAL;

            if (cold) {
                    audio_rate = AUDIO_RATE_DEFAULT;
                    audio_channels = AUDIO_CHANNELS_DEFAULT;
                    audio_fragsize = AUDIO_FRAGSIZE_DEFAULT;
                    audio_nbfrags = AUDIO_NBFRAGS_DEFAULT;
                    init_s3c2410_iis_bus_txrx();//GDLC
                    if ((file->f_mode & FMODE_WRITE)){
                    //GDLC          init_s3c2410_iis_bus_tx();
                                    audio_clear_buf(&output_stream);
                    }
                    if ((file->f_mode & FMODE_READ)){
                    //GDLC          init_s3c2410_iis_bus_rx();
                                    audio_clear_buf(&input_stream);
                    }
            }


            return 0;
    }
    添加init_s3c2410_iis_bus_txrx函数:
    static void init_s3c2410_iis_bus_txrx(void)
    {
            unsigned long tmp_read;
            __raw_writel(0,S3C2410_SBC_IISCON);
            __raw_writel(0,S3C2410_SBC_IISMOD);
            __raw_writel(0,S3C2410_SBC_IISFCON);

            /* 8 kHZ, 384fs */
            __raw_writel((IISPSR_A(iispsr_value(S_CLOCK_FREQ, 8000))
                       | IISPSR_B(iispsr_value(S_CLOCK_FREQ, 8000)))
                       ,S3C2410_SBC_IISPSR);

            __raw_writel(S3C2410_IISCON_RXDMAEN              /* (1 << 4):Receive DMA service request */
                       | S3C2410_IISCON_TXDMAEN              /* (1 << 5):Transmit DMA service request */
                       | (1<<1)                              /* (1 << 1):IIS Prescaler Enable */
                       ,S3C2410_SBC_IISCON);

            __raw_writel((0<<8)                             /* (0 << 8):Master mode */
                       | S3C2410_IISMOD_RXMODE              /* (1 << 6):Receive mode */
                       |  S3C2410_IISMOD_TXMODE             /* (2 << 6):Transmit mode */
                       | S3C2410_IISMOD_LR_LLOW             /* (0 << 5)ow for left channel */
                       | S3C2410_IISMOD_MSB                 /* (1 << 4):MSB-justified format */
                       | S3C2410_IISMOD_16BIT               /* (1 << 3):Serial data bit/channel is 16 bit */
                       | (1<<2)                             /* (1 << 2):Master clock freq = 384 fs */
                       | S3C2410_IISMOD_32FS                /* (1 << 0):32 fs */
                       ,S3C2410_SBC_IISMOD);

            __raw_writel(S3C2410_IISFCON_TXDMA              /* (1 << 15):Transmit FIFO access modeMA */
                       | S3C2410_IISFCON_RXDMA              /* (1 << 14):Receive FIFO access modeMA */
                       | S3C2410_IISFCON_TXENABLE           /* (1 << 13):Transmit FIFO enable */
                       | S3C2410_IISFCON_RXENABLE           /* (1 << 12):Receive FIFO access enable */
                       ,S3C2410_SBC_IISFCON);

            tmp_read=__raw_readl(S3C2410_SBC_IISCON);
            tmp_read=tmp_read | S3C2410_IISCON_IISEN;       /* IIS enable(start) */
            __raw_writel(tmp_read,S3C2410_SBC_IISCON);
    }
    另外有一个简单的mixer,可以调整audio-in/audio-out的音量
    代码如下:
    #include
    #include
    #include
    #include

    #define ARM

    int main(int argc,char *argv[])
    {
            int volume_read,volume_write,mixerfd;

            if (argc != 3)
            {
                    printf("usage:%s volume_write volume_read\n",argv[0]);

                    printf("example:%s 30 50\n",argv[0]);
                    exit(-1);
            }
            volume_write = atoi(argv[1]);
            volume_read = atoi(argv[2]);
            if (volume_write < 0 || volume_write > 100)
                    volume_write = 30;
            if (volume_read <0 || volume_read > 100)
                    volume_read = 30;
    #ifdef ARM
            mixerfd = open("/dev/sound/mixer",O_RDWR);
    #else
            mixerfd = open("/dev/mixer",O_RDWR);
    #endif
            if (mixerfd < 0)
            {
                    perror("Mixer open error!");
                    exit(-1);
            }

            ioctl(mixerfd,SOUND_MIXER_WRITE_VOLUME,&volume_write);
            ioctl(mixerfd,SOUND_MIXER_READ_VOLUME,&volume_read);

            close(mixerfd);

            return 0;
    }
    编译:
    #/opt/crosstool/gcc-3.3.4-glibc-2.3.3/arm-s3c2410-linux-gnu/bin/arm-s3c2410-linux-gnu-gcc simple_mixer.c -o simple_mixer
    #./simple_mixer 60 0
    使得audio-out音量为60,audio-in的音量为0。

    第三部分     问题解析
    在声卡驱动程序移植的过程中,出现的问题主要就是由于寄存器设置以及虚拟地址的映射不正确而造成的问题。
    在对驱动程序进行了函数替代以及改写了一些函数之后,将驱动程序编译进内核里,内核可以正确的编译连接并生成镜像文件,把镜像文件下

    载到开发板上,可以看到/dev/sound目录下看到系统注册的两个设备文件,但是当用cat命令向dev/sound/dsp设备文件输入wav格式文件的时候

    ,系统总是出现无法向虚拟地址0x00000000写入数据的kernel panic错误,经过在smdk2410_audio_write()函数中加入调试信息才发现,原来

    造成这个错误的原因主要就是由于系统还没有进行正确的地址影射。在arch/arm/mach-s3c2410/s3c2410.c文件中的s3c2410_iodesc[]结构数组
    中加入:
    IODESC_ENT(IIS),
            IODESC_ENT(GPIO)
    这两条语句之后,该错误就不会出现。

    注:IODESC_ENT这个宏定义可以在arch/arm/mach-s3c2410/cpu.h文件中找到,实际上就是展开成四个符号,而这四个符号所定义的常量符号的

    值可以在/include/asm-arm/arch-s3c2410/regs-iis.h文件中找到。

           在将上述问题解决之后,再次用cat命令进行测试的时候,系统还是无法发声,并且出现:dma2: loadbuffer:timeout loading buffer

    的错误,而且一直处于循环当中。仔细跟踪流程,发现这个信息是在系统调用smdk2410_audio_write()->s3c2410_dma_enqueue()中打印出来的

    信息。看其代码发现是s3c2410_dma_waitforload一直在等待dma总的数据,而系统没有数据导致了该错误。又经过多次的阅读校对驱动程序代

    码,发现这个错误主要是因为对dma通道的初始化不正确而造成的。在2.4.18的驱动程序当中,对这个dma通道的初始化是通过以下函数流程进

    行的:s3c2410_uda1341_init-> audio_init_dma-> s3c2410_request_dma-> fill_dma_source。对dma通道的初始化工作最终就是在

    fill_dma_source函数中完成的。在2.4.18的内核中有个dma_types这样的全局数组变量,它是dma_type_t类型的数组,这个数据类型定义了DMA

    读/写的源地址寄存器(DISRC)、目的地址寄存器(DIDST)、源地址控制寄存器(DISRCC)、目的地址控制寄存器(DIDSTC)以及DMA的控制

    寄存器(DCON)的内容,而dma_types这个全局数组变量就定义了系统总所有的DMA的通道用户,因此往这个结构变量里面赋值就可以反映到CPU中

    的相应的硬件寄存器中去。在声卡驱动程序中用到的是1和2这两个dma通道。通道1对应与录音,通道2对应于放音。查看S3C2410芯片的数据手

    册可以看到,对于通道2,DMA request source选择的是I2SSDO。在2.4.18的内核当中,对所有通道的寄存器的设置都是通过对dma_types的静

    态赋值给予确定。查阅2.4.18驱动程序中的arch/arm/mach-s3c2410/dma.h文件,可以看到对该结构变量的赋值。对于声卡驱动程序的放音部分

    程序来说,其对DMA2的初始化也是在那里进行的。仔细核对对“I2SSDO”的初始化发现,在2.4.18中,对DMA2的初始化时,其中的DCON寄存器

    设置成了0xa0d00000,对照CPU芯片数据手册,发现DCON寄存器的第23位(RELOAD位)被设置成1,也就是在每次传完一个缓冲区的内容就将DMA

    通道关闭,这样如果要进行所有数据的传输每次传输一个缓冲区之前都要将DMA通道打开,而2.6.11的DMA驱动程序中,是直到传输完所有的缓

    冲区数据之后才将DMA通道关闭,所以在2.6.11的驱动程序当中寄存器的这一位不能设置为1,而应该设置成0。将DCON的初始值设置成

    0xa09000000,传递给s3c2410_dma_config()函数。再次编译内核,将其下载到开发板上,并用cat命令以及madplay对驱动程序进行测试,声卡

    均可以正常工作发声。这样声卡的放音部分的驱动就完成了。

  • 阅读(1920) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~