字符設(shè)備驅(qū)動程序_第1頁
字符設(shè)備驅(qū)動程序_第2頁
字符設(shè)備驅(qū)動程序_第3頁
字符設(shè)備驅(qū)動程序_第4頁
字符設(shè)備驅(qū)動程序_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Linux字符設(shè)備驅(qū)動程序Linux驅(qū)動程序的分類字符設(shè)備驅(qū)動:用于驅(qū)動能夠像字節(jié)流(文件)一樣被訪問的設(shè)備。應(yīng)用程序通??梢岳胦pen、close、read、write等系統(tǒng)調(diào)用訪問字符設(shè)備驅(qū)動。塊設(shè)備驅(qū)動:塊設(shè)備和字符設(shè)備只在系統(tǒng)內(nèi)核內(nèi)部的管理上有所區(qū)別。應(yīng)用程序?qū)τ谧址O(shè)備的每一個I/O操作都會被內(nèi)核直接傳遞給對應(yīng)的驅(qū)動程序;而應(yīng)用程序?qū)τ趬K設(shè)備的操作要經(jīng)過虛擬文件系統(tǒng)(VFS)和緩沖區(qū)管理系統(tǒng)間接地傳遞給驅(qū)動程序處理。網(wǎng)絡(luò)設(shè)備驅(qū)動:應(yīng)用程序必須利用套接字(socket)接口訪問網(wǎng)絡(luò)設(shè)備。網(wǎng)絡(luò)設(shè)備驅(qū)動程序字符設(shè)備驅(qū)動程序基本結(jié)構(gòu)字符設(shè)備開發(fā)的基本步驟確定主設(shè)備號和次設(shè)備號實現(xiàn)字符驅(qū)動程序?qū)崿F(xiàn)file_operations結(jié)構(gòu)體構(gòu)造字符設(shè)備結(jié)構(gòu)體cdev在模塊加載函數(shù)中注冊字符設(shè)備在模塊卸載函數(shù)中注銷字符設(shè)備創(chuàng)建設(shè)備文件節(jié)點設(shè)備文件與設(shè)備號為了體現(xiàn)“一切都是文件”的設(shè)計思想,linux將每個已安裝的設(shè)備都表示為一個設(shè)備文件。設(shè)備文件通常位于/dev子目錄。對于字符設(shè)備,應(yīng)用程序可以利用open、close、read、write等系統(tǒng)調(diào)用訪問其設(shè)備文件,這些I/O操作都被直接傳遞給該設(shè)備文件所對應(yīng)的設(shè)備。每個設(shè)備文件中都存儲了該設(shè)備的“主設(shè)備號”和“次設(shè)備號”。一般由同一個內(nèi)核模塊管理的多個設(shè)備占用同一個主設(shè)備號,具體設(shè)備用次設(shè)備號標(biāo)識。用mknodfilenamecmajorminor命令創(chuàng)建設(shè)備文件用rmfilename命令刪除設(shè)備文件。注意刪除設(shè)備文件并不會影響驅(qū)動模塊。應(yīng)用程序如何訪問設(shè)備fd1=open(“/dev/ttyS1”,O_RDWR);//阻塞fd2=open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK);//非阻塞intread(intfd,constvoid*buf,size_tlength);intwrite(intfd,constvoid*buf,size_tlength);intlseek(intfd,offset_toffset,intwhence);intioctl(intfd,intcmd,void*arg);intclose(intfd);設(shè)備號的內(nèi)部表達設(shè)備編號的內(nèi)部表達dev_t類型(32位):用來保存設(shè)備編號(包括主設(shè)備號(12位)和次設(shè)備號(20位))從dev_t獲得主設(shè)備號和次設(shè)備號:MAJOR(dev_t);MINOR(dev_t);將主設(shè)備號和次設(shè)備號轉(zhuǎn)換成dev_t類型:MKDEV(intmajor,intminor);

主設(shè)備號與次設(shè)備號分配主設(shè)備號手工分配主設(shè)備號:找一個內(nèi)核沒有使用的主設(shè)備號來使用。#include<linux/fs.h>intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name);要分配的設(shè)備編號范圍的起始值,次設(shè)備號經(jīng)常為0所請求的連續(xù)設(shè)備編號的個數(shù)和該編號范圍關(guān)聯(lián)的設(shè)備名稱主設(shè)設(shè)備備號號與與次次設(shè)設(shè)備備號號動態(tài)態(tài)分分配配主主設(shè)設(shè)備備號號::#include<linux/fs.h>intalloc_chrdev_resion(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name);輸出出的的設(shè)設(shè)備備號號要使使用用的的被被請請求求的的第第一一個個次次設(shè)設(shè)備備號號主設(shè)設(shè)備備號號與與次次設(shè)設(shè)備備號號釋放放設(shè)設(shè)備備號號voidunregister_chrdev_region(dev_tfirst,unsignedintcount);通常常在在模模塊塊的的清清除除函函數(shù)數(shù)中中調(diào)調(diào)用用。。記錄錄字字符符設(shè)設(shè)備備的的結(jié)結(jié)構(gòu)構(gòu)體體cdev實現(xiàn)現(xiàn)字字符符驅(qū)驅(qū)動動程程序序cdev結(jié)構(gòu)構(gòu)體體structcdev{structkobjectkobj;/*內(nèi)嵌的kobject對象*/structmodule*owner;/*所屬模塊塊*/structfile_operations*ops;/*文件操作作結(jié)構(gòu)體體*/structlist_headlist;dev_tdev;/*設(shè)備號*/unsignedintcount;};cdev的kobj、list、count字段不用用我們關(guān)關(guān)系和維維護(內(nèi)內(nèi)核代勞勞),我我們只需需將其ops字段指向向為我們們自己的的fileoperations結(jié)構(gòu)。對cdev結(jié)構(gòu)體的的操作操作cdev的函數(shù)voidcdev_init(structcdev*,structfile_operations*);structcdev*cdev_alloc(void);intcdev_add(structcdev*,dev_t,unsigned);voidcdev_del(structcdev*);用于初始始化cdev的成員,,并建立立cdev和file_operations之間的連連接分別向系系統(tǒng)刪除除一個cdev,完成字字符設(shè)備備的注銷銷,通常常在模塊塊的卸載載函數(shù)中中調(diào)用分別向系系統(tǒng)添加加一個cdev,完成字字符設(shè)備備的注冊冊,通常在模模塊加載載函數(shù)中中調(diào)用函數(shù)用于于動態(tài)申申請一個個cdev內(nèi)存file_operations結(jié)構(gòu)體file_operations結(jié)構(gòu)體字符驅(qū)動動和內(nèi)核核的接口口:在include/linux/fs.h定義字符驅(qū)動動只要實實現(xiàn)一個個file_operations結(jié)構(gòu)體并并注冊到到內(nèi)核中中,內(nèi)核核就有了了操作此此設(shè)備的的能力。。structfile_operations{structmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*open)(structinode*,structfile*);int(*flush)(structfile*,fl_owner_tid);int(*release)(structinode*,structfile*);//……………………………};file_operations結(jié)構(gòu)體file_operations的主要成員員:structmodule*owner:指向模塊自自身open:打開設(shè)備release:關(guān)閉設(shè)備read:從設(shè)備上讀讀數(shù)據(jù)write:向設(shè)備上寫寫數(shù)據(jù)ioctl:I/O控制函數(shù)llseek:定位讀寫指指針mmap:映射設(shè)備空空間到進程程的地址空空間fileoperations的初始化structfile_operationsmy_fops={.owner=THIS_MODULE,.llseek=my_llseek,.read=my_read,.write=my_write,.ioctl=my_ioctl,.open=my_open,.release=my_release,};file結(jié)構(gòu)體file結(jié)構(gòu)代表一一個打開的的文件,它它由內(nèi)核在在應(yīng)用程序序open時創(chuàng)建,并并將該文件件所對應(yīng)的的fileoperations記錄在file結(jié)構(gòu)中。在應(yīng)用程序序調(diào)用close函數(shù),內(nèi)核核會釋放該該數(shù)據(jù)結(jié)構(gòu)構(gòu)。structfile{structfile_operations *f_op;unsignedintf_flags;fmode_tf_mode;loff_tf_pos;struct dentry *f_dentryvoid*private_data;};file結(jié)構(gòu)體file結(jié)構(gòu)體file結(jié)構(gòu):file_operations結(jié)構(gòu)相關(guān)的的一個結(jié)構(gòu)構(gòu)體。描述一個正正在打開的的設(shè)備文件件。成員:loff_tf_pos:當(dāng)前讀/寫位置unsignedintf_flags標(biāo)識文件打打開時,是是否可讀或或可寫O_RDONLYO_NONBLOCKO_SYNCstructfile_operations*f_op文件相關(guān)的的操作,指指向所實現(xiàn)現(xiàn)的structfile_operationsvoid*private_data:私有數(shù)據(jù)指指針。驅(qū)動動程序可以以將這個字字段用于任任何目的或或者忽略這個個字段。inode結(jié)構(gòu)體內(nèi)核用inode結(jié)構(gòu)在內(nèi)部部表示文件件,用于存存儲文件訪訪問權(quán)限、、屬主、組組、大小、、生產(chǎn)時間間等VFS關(guān)心的信息息。其字段中我我們只關(guān)心心i_rdev(設(shè)備號),和i_cdev(和該文件件所對應(yīng)的的cdev結(jié)構(gòu))我們在創(chuàng)建建設(shè)備文件件時,內(nèi)核核會自動創(chuàng)創(chuàng)建一個對對應(yīng)的inode結(jié)構(gòu)體,并并將其i_cdev字段指向?qū)?yīng)的字符符設(shè)備結(jié)構(gòu)構(gòu)體cdev(事先已經(jīng)在在內(nèi)核中注注冊過)。Inode與file的區(qū)別:file表示打開的的文件描述述符,多個個file結(jié)構(gòu),可以指指向單個inode結(jié)構(gòu)。structinode{dev_ti_rdev;structcdev*i_cdev;//……………………………};Inode結(jié)構(gòu)體Inode結(jié)構(gòu)中的兩個個主要字段::dev_ti_rdev;對表示設(shè)備文文件的inode結(jié)構(gòu),該字段段包含了真正正的設(shè)備編號號。structcdev*i_cdev;structcdev是表示字符設(shè)設(shè)備的內(nèi)核的的內(nèi)部結(jié)構(gòu)。。當(dāng)inode指向一個字符符設(shè)備文件時時,該字段包包含了指向structcdev結(jié)構(gòu)的指針從一個inode中獲得主設(shè)備備號和次設(shè)備備號:unsignedintiminor(structinode*inode);unsignedintimajor(structinode*inode);字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)注冊設(shè)備,在模塊或驅(qū)動動初始化時調(diào)調(diào)用Linux-2.4及之前Linux-2.6intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops)如何操作字符符設(shè)備的接口口voidcdev_init(structcdev*,structfile_operations*);intcdev_add(structcdev*,dev_t,unsigned);字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)注銷設(shè)備:在模塊卸載時時調(diào)用Linux-2.4及之前Linux-2.6intunregister_chrdev(unsignedintmajor,constchar*name);voidcdev_del(structcdev*);字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)//設(shè)備驅(qū)動模塊塊加載函數(shù)staticint__initxxx_init(void){...cdev_init(&xxx_dev.cdev,&xxx_fops);//初始化cdevxxx_dev.cdev.owner=THIS_MODULE;//獲取字符設(shè)備備號if(xxx_major){register_chrdev_region(xxx_dev_no,1,DEV_NAME);}else{alloc_chrdev_region(&xxx_dev_no,0,1,DEV_NAME);}ret=cdev_add(&xxx_dev.cdev,xxx_dev_no,1);//注冊設(shè)備...}字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)/*設(shè)備驅(qū)動模塊塊卸載函數(shù)*/staticvoid__exitxxx_exit(void){unregister_chrdev_region(xxx_dev_no,1);//釋放占用的設(shè)設(shè)備號cdev_del(&xxx_dev.cdev);//注銷設(shè)備...}字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)打開模塊使用計數(shù)數(shù)加1識別次設(shè)備號號硬件操作:檢查設(shè)備相關(guān)關(guān)錯誤(諸如如設(shè)備未就緒緒或類似的硬硬件問題);;如果設(shè)備是首首次打開,則則對其初始化化;如果有中斷操操作,申請中中斷處理程序序;intopen(structinode*inode,structfile*filp);字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)關(guān)閉模塊使用計數(shù)數(shù)減1釋放由open分配的,保存存在filp>private_data里的所有內(nèi)容容。硬件操作:如果申請了中中斷,則釋放放中斷處理程程序。在最后一次關(guān)關(guān)閉操作時關(guān)關(guān)閉設(shè)備。intrelease(structinode*inode,structfile*filp);字符設(shè)備驅(qū)動動程序基本結(jié)結(jié)構(gòu)read/writessize_tread(structfile*filp,char__user*buff,size_tcount,loff_t*offp);ssize_twrite(structfile*filp,constchar__user*buff,size_tcount,loff_t*offp);指向用戶空間間的緩沖區(qū),,這個緩沖區(qū)區(qū)或者保存將將寫入的數(shù)據(jù)據(jù),或者是一一個存放新讀讀入數(shù)據(jù)的空空緩沖區(qū)。用戶在在文件件中存存取操操作的的位置置字符設(shè)設(shè)備驅(qū)驅(qū)動程程序基基本結(jié)結(jié)構(gòu)用戶空空間和和內(nèi)核核空間間之間間的數(shù)數(shù)據(jù)拷拷貝過過程,,不能簡簡單的的用指指針操操作或或者memcpy來進行行數(shù)據(jù)據(jù)拷貝貝用戶空空間的的數(shù)據(jù)據(jù)是可可以被被換出出的,,會產(chǎn)產(chǎn)生一一個頁頁面失失效異異常。。用戶空空間的的地址址無法法在內(nèi)內(nèi)核空空間中中使用用。用戶空空間和和內(nèi)核核空間間之間間進行行數(shù)據(jù)據(jù)拷貝貝的函函數(shù)::如果要要復(fù)制制的內(nèi)內(nèi)存是是簡單單類型型,如如char、int、long等,put_user()和get_user()unsignedlongcopy_from_user(void*to,constvoid__user*from,unsignedlongcount);unsignedlongcopy_to_user(void__user*to,constvoid*from,unsignedlongcount);字符符設(shè)設(shè)備備驅(qū)驅(qū)動動程程序序基基本本結(jié)結(jié)構(gòu)構(gòu)讀設(shè)設(shè)備備模模板板ssize_txxx_read(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos){...copy_to_user(buf,...,...);...}寫設(shè)設(shè)備備模模板板ssize_txxx_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos){...copy_from_user(...,buf,...);...}字符符設(shè)設(shè)備備驅(qū)驅(qū)動動程程序序基基本本結(jié)結(jié)構(gòu)構(gòu)ioctl函數(shù)數(shù)為設(shè)設(shè)備備驅(qū)驅(qū)動動程程序序執(zhí)執(zhí)行行““命命令令””提提供供了了一一個個特特有有的的入入口口點點用來來設(shè)設(shè)置置或或者者讀讀取取設(shè)設(shè)備備的的屬屬性性信信息息。。intioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg);事先先定定義義的的IO控制制命命令令代碼碼arg為對對應(yīng)應(yīng)于于cmd命令令的的參參數(shù)數(shù)字符符設(shè)設(shè)備備驅(qū)驅(qū)動動程程序序基基本本結(jié)結(jié)構(gòu)構(gòu)cmd參數(shù)數(shù)的的定定義義不推推薦薦用用0x1,0x2,0x3之類類的的值值Linux對ioctl()的cmd參數(shù)數(shù)有有特特殊殊的的定定義義構(gòu)造造命命令令編編號號的的宏宏::_IO(type,nr)用于于構(gòu)構(gòu)造造無無參參數(shù)數(shù)的的命命令令編編號號;;_IOR(type,nr,datatype)用于于構(gòu)構(gòu)造造從從驅(qū)驅(qū)動動程程序序中中讀讀取取數(shù)數(shù)據(jù)據(jù)的的命命令令編編號號;;_IOW(type,nr,datatype)用于于寫寫入入數(shù)數(shù)據(jù)據(jù)的的命命令令;;_IOWR(type,nr,datatype)用于于雙雙向向傳傳輸輸。。type和number位字字段段通通過過參參數(shù)數(shù)傳傳入入,,而而size位字段通通過對datatype參數(shù)取sizeof獲得。設(shè)備類型(type)

序列號(number)方向(direction)

數(shù)據(jù)尺寸(size)

8bit

8bit

2bit13/14bit字符設(shè)備備驅(qū)動程程序基本本結(jié)構(gòu)Ioctl函數(shù)模板板intxxx_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg){...switch(cmd){caseXXX_CMD1:...break;caseXXX_CMD2:...break;default:///*不能支持持的命令令*/return-ENOTTY;}return0;}階段總結(jié)結(jié)階段總結(jié)結(jié)添加驅(qū)動動程序到到內(nèi)核配置內(nèi)核核編譯內(nèi)核核添加驅(qū)動動程序到到內(nèi)核中中添加驅(qū)動動程序到到內(nèi)核配置內(nèi)核核配置命令令包括:makeconfigmakemenuconfigmakexconfigmakegconfig可通過““上”、、“下””、“左左”、““右”鍵鍵移動菜菜單,選選擇某項項按“Y”,取消選擇按““N”,如果選選擇某項項編譯為為模塊按按“M”,進入子菜菜單按““Enter”,返回上一級菜菜單按““Esc””使用makeconfig、makemenuconfig等命令后后,會生生成一個個.config配置文件件(是隱身文件件,通過過ls––a才能看到到)添加驅(qū)動動程序到到內(nèi)核編譯內(nèi)核核可用如下下命令編編譯內(nèi)核核:makeARC=armCROSS_COMPILE=arm-linux-zImage源代碼根根目錄的的Makefile中將ARCH和CROSS_COMPILE直接指定定為arm和arm-linux-,如:這樣就沒沒有必要要每次編編譯的時時候都指指定體系系結(jié)構(gòu)和和交叉編編譯器了了,只須使用用下面命命令就可可以了::makezImageARCH?=armCROSS_COMPILE ?=arm-linux-添加驅(qū)動動程序到到內(nèi)核添加驅(qū)動動程序到到內(nèi)核Linux2.6內(nèi)核的配配置系統(tǒng)統(tǒng)由以下下3個部分組組成。Makefile:分布在Linux內(nèi)核源代代碼中的的Makefite定義Linux內(nèi)核的編編譯規(guī)則則配置文件件(Kconfig):給用戶戶提供配配置選擇擇的功能能。配置工具具:包括配置置命令解解釋器(對配置腳腳本中使使用的配配置命令令進行解解釋)配置用戶戶界面(提供字符符界面和和圖形界界面)。這些配置置工具都都是使用用腳本語語言編寫寫的,如如Tcl/TK、Perl等。在Linux內(nèi)核中中增加加程序序需要要完成成以下下3項工作作。將編寫寫的源源代碼碼復(fù)制制到Linux內(nèi)核源源代碼碼的相相應(yīng)目目錄。。在目錄錄的Kconfig文件中中增加加新源源代碼碼對應(yīng)應(yīng)項目目的編編譯配配置選選項。。在目錄錄的Makefile文件中中增加加對新新源代代碼的的編譯譯條目目。添加驅(qū)驅(qū)動程程序到到內(nèi)核核實例::在內(nèi)核核源代代碼drivers目錄下下為ARM體系結(jié)結(jié)構(gòu)新新增testdrivertestdriver的樹形形目錄錄:步驟::1、拷貝貝test到drivers路徑下下2、為新新增目目錄創(chuàng)創(chuàng)建Kconfig和Makefile3、修改改新增增目錄錄父目目錄的的Kconfig和Makefile,以便便新增增的Kconfig和Makefile能夠被被引用用4、在arch/arm/Kconfig里增加加source““drivers/test/Kconfig””添加驅(qū)驅(qū)動程程序到到內(nèi)核核步驟::1、拷貝貝test到drivers路徑下下cp––frtestlinux_kernel_path/drivers2、為新新增目目錄創(chuàng)創(chuàng)建Kconfig和Makefile添加驅(qū)驅(qū)動程程序到到內(nèi)核核修改新新增目目錄的的父目目錄的的Kconfig和Makefile在drivers/Kconig中加入入:source"drivers/test/Kconfig““在drivers/Makefile中加入入:obj-$(CONFIG_TEST)+=test/在arch/arm/Kconfig里加入入:source““drivers/test/Kconfig””增加了了Kconfig和Makefile文件之之后的的新的的test樹型目目錄如如下所所示::用戶空空間調(diào)調(diào)用設(shè)設(shè)備驅(qū)驅(qū)動程程序創(chuàng)建設(shè)設(shè)備節(jié)節(jié)點$mknod/dev/node_namecmajorminor示例代代碼intmain(void){intdev_fd;charread_buf[10];dev_fd=open("/dev/node_name",O_RDWR|O_NONBLOCK);if(dev_fd==-1){printf("Cann'topenfile/dev/node_name\n");exit(1);}read(dev_fd,read_buf,5);ioctl(dev_fd,XXX_IOCTL_CMD,0);close(dev_fd);return0;}9、靜夜四無鄰鄰,荒居舊業(yè)業(yè)貧。。12月-2212月-22Thursday,December29,202210、雨中黃黃葉樹,,燈下白白頭人。。。12:29:0812:29:0812:2912/29/202212:29:08PM11、以我獨沈沈久,愧君君相見頻。。。12月-2212:29:0812:29Dec-2229-Dec-2212、故人江海別別,幾度隔山山川。。12:29:0812:29:0812:29Thursday,December29,202213、乍乍見見翻翻疑疑夢夢,,相相悲悲各各問問年年。。。。12月月-2212月月-2212:29:0812:29:08December29,202214、他鄉(xiāng)生生白發(fā),,舊國見見青山。。。29十十二月202212:29:08下下午12:29:0812月-2215、比比不不了了得得就就不不比比,,得得不不到到的的就就不不要要。。。。。十二二月月2212:29下下午午12月月-2212:29December29,202216、行動出成果果,工作出財財富。。2022/12/2912:29:0812:29:0829December202217、做前前,能能夠環(huán)環(huán)視四四周;;做時時,你你只能能或者者最好好沿著著以腳腳為起起點的的射線線向前前。。。12:29:08下下午午12:29下下午12:29:0812月月-229、沒有失失敗,只只有暫時時停止成成功!。。12月-2212月-22Thursday,December29,202210、很多事情情努力了未未必有結(jié)果果,但是不不努力卻什什么改變也也沒有。。。12:29:0912:29:0912:2912/29/202212:29:09PM11、成功就是日日復(fù)一日那一一點點小小努努力的積累。。。12月-2212:29:0912:29Dec-2229-Dec-2212、世間間成事事,不不求其其絕對對圓滿滿,留留一份份不足足,可可得無無限完完美。。。12:29:0912:29:0912:29Thursday,December29,202213、不知香香積寺,,數(shù)里入入云峰。。。12月-2212月-2212:29:0912:29:09December29,202214、意志堅堅強的人人能把世世界放在在手中像

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論