UDA1341TS声卡驱动程序往2611内核的移植总结.doc_第1页
UDA1341TS声卡驱动程序往2611内核的移植总结.doc_第2页
UDA1341TS声卡驱动程序往2611内核的移植总结.doc_第3页
UDA1341TS声卡驱动程序往2611内核的移植总结.doc_第4页
UDA1341TS声卡驱动程序往2611内核的移植总结.doc_第5页
免费预览已结束,剩余35页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UDA1341TS声卡驱动程序往2.6.11内核的移植总结关键词: UDA1341 linux 驱动移植 注:这个驱动的移植主要是是将原来的2.4.18内核中的1341驱动程序直接往2.6.11上移植的,没有采用ALSA。移植过程中也曾经参考过一些资料,具体是哪位大虾的资料忘记了,在此感谢文中所参考的资料的大虾们硬件环境:SBC-2410X开发板(CPU:S3C2410X)内核版本:运行环境:Debian2.6.8交叉编译环境:gcc-3.3.4-glibc-2.3.3第一部分声卡UDA1341TS驱动程序播放部分的移植一、从网上将Linux内核源代码下载到本机上,并将其解压:#tar jxf linux-.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_IISCONS3C2410_IISREG(0X00)#define S3C2410_SBC_IISMODS3C2410_IISREG(0x04)#define S3C2410_SBC_IISPSRS3C2410_IISREG(0x08)#define S3C2410_SBC_IISFCONS3C2410_IISREG(0x0c)#define S3C2410_SBC_IISFIFOS3C2410_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 menuconfigSound -Open Sound System -* S3C2410 UDA1341 driver (SBC2410)将刚才添加的声卡驱动程序静态添加到内核当中。最后进行内核编译。#make然后将镜像下载到开发板中去,启动信息如下:VIVI version 0.1.4 (rootembed4) (gcc version 2.95.3 20010315 (release) #0.1.4 ?. 3. 29 17:27:26 CST 2005GDLCMMU table base address = 0x33DFC000Succeed 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 viviCopy linux kernel from 0x00030000 to 0x30008000, size = 0x00100000 . donezImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: console=ttySAC0 root=/dev/nfs nfsroot=:/friendly-arm/root ip=9::192MACH_TYPE = 193NOW, Booting Linux.Uncompressing Linux. done, booting the kernel.Linux version (rootembed4) (gcc version 3.3.4) #172 Tue Apr 26 17:56:38 CST 2005CPU: ARM920Tid(wb) 41129200 revision 0 (ARMv4T)CPU0: D VIVT write-back cacheCPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsCPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsMachine: SMDK2410ATAG_INITRD is deprecated; please update your bootloader.Memory policy: ECC disabled, Data cache writebackCPU S3C2410A (id 0x32410002)S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHzS3C2410 Clock control, (c) 2004 Simtec ElectronicsBuilt 1 zonelistsKernel command line: console=ttySAC0 root=/dev/nfs nfsroot=:/friendly-arm/root ip=9::192.16firq: clearing subpending status 00000002PID hash table entries: 512 (order: 9, 8192 bytes)timer tcon=00000000, tcnt a2c1, tcfg 00000200,00000000, usec 00001eb8Console: colour dummy device 80x30Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)Memory: 64MB = 64MB totalMemory: 62976KB available (1483K code, 269K data, 96K init)Mount-cache hash table entries: 512 (order: 0, 4096 bytes)CPU: Testing write buffer coherency: okNET: Registered protocol family 16S3C2410: Initialising architectureS3C2410 DMA Driver, (c) 2003-2004 Simtec ElectronicsDMA channel 0 at c4800000, irq 33DMA channel 1 at c4800040, irq 34DMA channel 2 at c4800080, irq 35DMA channel 3 at c48000c0, irq 36devfs: 2004-01-31 Richard Gooch (rgoochatnf.csiro.au)devfs: devfs_debug: 0x0devfs: boot_options: 0x1leds initializeds3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410io scheduler noop registeredio scheduler anticipatory registeredio scheduler deadline registeredio scheduler cfq registeredRAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksizeCirrus Logic CS8900A driver for Linux (Modified for SMDK2410)eth0: CS8900A rev E at 0xe0000300 irq=53, no eeprom , addr: 08: 0:3E:26:0A:5BS3C2410 NAND Driver, (c) 2004 Simtec Electronicss3c2410-nand: mapped registers at c488000080 ns is too big for current clock rate 10000000080 ns is too big for current clock rate 10000000080 ns is too big for current clock rate 100000000s3c2410-nand: timing: Tacls 419ns, Twrph0 419ns, Twrph1 419nsNAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)Scanning device for bad blocksmice: PS/2 mouse device common for all miceUDA1341 audio driver initializedNET: Registered protocol family 2IP: routing cache hash table of 512 buckets, 4KbytesTCP 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 1IP-Config: Complete: device=eth0, addr=9, mask=, gw=, host=matrix4, domain=, nis-domain=, bootserver=, rootserver=, rootpath=Looking up port of RPC 100003/2 on Looking up port of RPC 100005/1 on VFS: Mounted root (nfs filesystem).Mounted devfs on /devFreeing init memory: 96Kinit started: BusyBox v0.60.5 (2003.09.05-09:25+0000) multi-call binarymount: Mounting none on /root failed: Invalid argumentmount: Mounting none on /tmp failed: Invalid argumentmount: Mounting none on /var failed: Invalid argument01/Jan/1970:00:00:05 +0000 boa: server version Boa/0.94.1301/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 80Please press Enter to activate this console.可以看到UDA1341 audio driver initialized的信息,说明声卡已经初始化。进入终端之后,查看设备文件名:rootfa /# ls -al /dev/sound/*crw- 1 root root 14, 3 Jan 1 00:00 /dev/sound/dspcrw- 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)中的对应位定义,DCON126:24应为010(I2SSDI)、而原来设置为000(UART1)2、测试:(1)、从网上http:/www.eca.cx/ecasound/download.php下载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 ecasoundstart, t - Processing is started (play)stop, s - Stops processingrewind time-in-seconds, rw time-in-seconds - Rewindforward time-in-seconds, fw time-in-seconds - Forwardsetpos time-in-seconds - Sets the current position to time-in-seconds seconds from the beginning.engine-launch - Initialize and start engineengine-status - Engine statuscs-status, st - Chainsetup statusc-status, cs - Chain statuscop-status, es - Chain operator statusctrl-status - Controller statusaio-status, fs - Audio input/output status- see ecasound-iam(1) manual page for more info -输入startecasound (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 doesnt support SNDCTL_DSP_GETCAPS.(audioio-oss) WARNING: OSS-device doesnt 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 ff3cfccfpgd = c0004000ff3cfccf *pgd=00000000Internal error: Oops: 803 #1Modules linked in: s3c2410_uda1341CPU: 0PC is at free_block+0x58/0x120LR is at drain_array_locked+0x84/0xa8pc : lr : Tainted: Psp : c0323f08 ip : c0323f2c fp : c0323f28r10: c023e524 r9 : 00000000 r8 : c02fc970r7 : 00000000 r6 : 0000000b r5 : c02f8ec0 r4 : c2cda020r3 : ff38fcd0 r2 : ff3cfccf r1 : c02fc970 r0 : c2cda070Flags: Nzcv IRQs off FIQs on Mode SVC_32 Segment kernelControl: 717F Table: 330A8000 DAC: 00000017Process events/0 (pid: 3, stack limit = 0xc0322194)Stack: (0xc0323f08 to 0xc0324000)3f00: 0000000b c02fc960 c02fc970 c02f8f30 c023e514 c0323f443f20: c0323f2c c005abf0 c005a528 c02f8ec0 00000000 00000001 c0323f70 c0323f483f40: c005aca0 c005ab7c c02ed910 c023e534 80000013 c02ed908 00000000 c02ed9003f60: c005ac14 c0323fc8 c0323f74 c0047884 c005ac24 ffffffff ffffffff 000000013f80: 00000000 c0034b50 00010000 00000000 00000000 c02eb7c0 c0034b50 001001003fa0: 00200200 c0322000 c0309f2c c02ed900 c00476bc fffffffc 00000000 c0323ff43fc0: c0323fcc c004bcc8 c00476cc ffffffff ffffffff 00000000 00000000 000000003fe0: 00000000 00000000 00000000 c0323ff8 c003a240 c004bc54 c0121508 c0121524Backtrace: (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 = 00000000Code: e2433606 e593401c e5942004 e5943000 (e5823000) dma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d00f20, id=c3cfa4c0, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d00ba0 (0x32cca000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa4c0, data=32cc8000, size=0s3c2410_dma_enqueue: new buffer c3d00f20dma1: s3c2410_dma_enqueue: buffer c3d00f20 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d00220, c3d00ee0 c3d00f20dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d00220, id=c3cfa4e0, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d00ee0 (0x32ccb000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa4e0, data=32cc9000, size=0s3c2410_dma_enqueue: new buffer c3d00220dma1: s3c2410_dma_enqueue: buffer c3d00220 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ba0, c3d00a20 c3d00220dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d00ba0, id=c3cfa500, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d00a20 (0x32ccc000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa500, data=32cca000, size=0s3c2410_dma_enqueue: new buffer c3d00ba0dma1: s3c2410_dma_enqueue: buffer c3d00ba0 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d00ee0, c3d009c0 c3d00ba0dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d00ee0, id=c3cfa520, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d009c0 (0x32ccd000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa520, data=32ccb000, size=0s3c2410_dma_enqueue: new buffer c3d00ee0dma1: s3c2410_dma_enqueue: buffer c3d00ee0 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d00a20, c02ff960 c3d00ee0dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d00a20, id=c3cfa540, size=0, result=0s3c2410_chan_loadbuffer: loading buff c02ff960 (0x32cce000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa540, data=32ccc000, size=0s3c2410_dma_enqueue: new buffer c3d00a20dma1: s3c2410_dma_enqueue: buffer c3d00a20 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d009c0, c3d00260 c3d00a20dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d009c0, id=c3cfa560, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d00260 (0x32ccf000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa560, data=32ccd000, size=0s3c2410_dma_enqueue: new buffer c3d009c0dma1: s3c2410_dma_enqueue: buffer c3d009c0 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c02ff960, c3d00f20 c3d009c0dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c02ff960, id=c3cfa580, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d00f20 (0x32cc8000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa580, data=32cce000, size=0s3c2410_dma_enqueue: new buffer c02ff960dma1: s3c2410_dma_enqueue: buffer c02ff960 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d00260, c3d00220 c02ff960dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback_fn=bf000414, buf=c3d00260, id=c3cfa5a0, size=0, result=0s3c2410_chan_loadbuffer: loading buff c3d00220 (0x32cc9000,0x000000)load_state is 2 = autoreloads3c2410_dma_enqueue: id=c3cfa5a0, data=32ccf000, size=0s3c2410_dma_enqueue: new buffer c3d00260dma1: s3c2410_dma_enqueue: buffer c3d00260 queued onto non-empty channeldma1: s3c2410_dma_irq:567: ls=3, cur=c3d00f20, c3d00ba0 c3d00260dma1: s3c2410_dma_irq:567: DCSRC=55000010, DISRC=55000010, DSTAT=00000000 DMT=02, DCON=a2900000callback

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论