版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、小知識:sudo insmod /lib/modules/2.6.22-14-generic/kernel/drivers/usb/serial/usbserial.ko vendor=0x8086 product=0xd001同時插上ttyUSB0和ttyUSB1(ch341),obm能將dkb下載下去,不過自動重起之后,就不能下載接下來的東西了,所以應(yīng)該,需要close(ttyUSB0_handle);然后進行接下來的下載,分別調(diào)用兩次不過應(yīng)該自動關(guān)閉了,所以可能還是不能同時插上ttyUSB0和ttyUSB1lsusb 顯示usb設(shè)備的vendor和product比如:b074glieth
2、ttp:$ lsusb Bus 002 Device 001: ID 0000:0000Bus 001 Device 116: ID 8086:d001 Intel Corp. Bus 001 Device 003: ID 413c:2105 Dell Computer Corp. Bus 001 Device 002: ID 0461:4d15 Primax Electronics, Ltd Bus 001 Device 001: ID 0000:0000其中Bus 001 Device 116: ID 8086:d001 Intel Corp. 就是vendor=0x8086和produc
3、t=0xd001能使用dmesg來查看具體的是ttyUSB0還是ttyUSB1了pidof hello.exepidof bash顯示進程的pid值波特率:#defineB0 /* hang up */#defineB50 #defineB75 #defineB110 #defineB134 #defineB150 #defineB200 #defineB300 #defineB600 #defineB1200 #defineB1800 #defineB2400 #defineB4800 #defineB9600 #defineB19200 #defineB38400 #define EXTA
4、 B19200#define EXTB B38400#define CSIZE #define CS5 #define CS6 #define CS7 #define CS8 #define CSTOPB #define CREAD #define PARENB #define PARODD #define HUPCL #define CLOCAL #define CBAUDEX #define BOTHER #define B57600 #define B #define B #define B /有些CDMA使用該波特率#define B #define B #define B #defi
5、neB #defineB #defineB #defineB #defineB #defineB #defineB #defineB Developing Linux Device Drivers using Libusb APIWritten by vikram_cvk - 2004-07-16 18:05IntroductionWe often come across a situation where a USB device which runsperfectly on 視窗系統(tǒng) platform does not even get detected on Linux. Lackof
6、support for USB devices is one of the reason why some people dontembrace Linux. Now there is a new API by name Libusb which helps thedevelopers to develop USB device drivers on the fly!What is LibusbLibusb is a high-level language API which conceals low-level kernelinteractions with the USB modules.
7、 It provides a set of function whichare adequate to develop a device driver for a USB device from theUserspace.Libusb is not complexFor any wannabe LinuxKernel programmers developing device driver as a Kernel module is aherculean task. Developing kernel modules requires fair degree ofproficiency in
8、C language and also good idea of kernel subsystems,data structures etc. All these are enough to put-off a developer fromventuring into Device Driver programming.Libusb has been designed toaddress this shortcoming. Simplified interface allows developers todevelop USB drivers from the userspace . Libu
9、sb library functionsprovide high level abstraction to the Kernel structures and allows thedevelopers to have access to these structures through theUSBFS(USBfilesystem).Its Cross-platformBeauty ofLibusb lies in its cross platform functionality. Driver written for oneplatform could be easily ported on
10、to another platform with little or nochanges, currently following operating systems are supported by Libusb.LinuxFreeBSDDarwinOS XThis HOWTO focuses on how Libusb can be used on Linux platform. Forinformation about other platforms gotohttp:/LIBUSB ON LINUXLinux is the most popular platform for the L
11、ibusb API,the reason beinggrowing popularity of Linux as a stable OS. On Linux Libusb makes ofthe USBFS file system. by default USBFS is automatically mounted whenthe system is booted.What is USBFSUSBFS is afilesystem specifically designed for USB devices, by default thisfilesystem gets mounted when
12、 the system is booted and it can be foundat /proc/bus/usb/. This filesystem consists of information about allthe USB devices that are connected to the computer.Libusb makes use ofthis filesystem to interact with the USB devices.Following Cprogram can be a stepping stone into the world of Libusb.This
13、 programcan be used to gather all the technical/hardware details of a USBdevice connected to the computer ,ensure that some USB device isconnected into the USB port.Details like Vendor-Id ,Product-Id ,Endpoint addresses of a USB device is of paramountimportance for a device driver developer./* testl
14、ibusb.c */#include#includevoid print_endpoint(struct usb_endpoint_descriptor *endpoint)printf( bEndpointAddress: %02xhn, endpoint-bEndpointAddress);printf( bmAttributes: %02xhn, endpoint-bmAttributes);printf( wMaxPacketSize: %dn, endpoint-wMaxPacketSize);printf( bInterval: %dn, endpoint-bInterval);p
15、rintf( bRefresh: %dn, endpoint-bRefresh);printf( bSynchAddress: %dn, endpoint-bSynchAddress);void print_altsetting(struct usb_interface_descriptor *interface)int i;printf( bInterfaceNumber: %dn, interface-bInterfaceNumber);printf( bAlternateSetting: %dn, interface-bAlternateSetting);printf( bNumEndp
16、oints: %dn, interface-bNumEndpoints);printf( bInterfaceClass: %dn, interface-bInterfaceClass);printf( bInterfaceSubClass: %dn, interface-bInterfaceSubClass);printf( bInterfaceProtocol: %dn, interface-bInterfaceProtocol);printf( iInterface: %dn, interface-iInterface);for (i = 0; i bNumEndpoints; i+)p
17、rint_endpoint(&interface-endpoint);void print_interface(struct usb_interface *interface)int i;for (i = 0; i num_altsetting; i+)print_altsetting(&interface-altsetting);void print_configuration(struct usb_config_descriptor *config)int i;printf( wTotalLength: %dn, config-wTotalLength);printf( bNumInter
18、faces: %dn, config-bNumInterfaces);printf( bConfigurationValue: %dn, config-bConfigurationValue);printf( iConfiguration: %dn, config-iConfiguration);printf( bmAttributes: %02xhn, config-bmAttributes);printf( MaxPower: %dn, config-MaxPower);for (i = 0; i bNumInterfaces; i+)print_interface(&config-int
19、erface);int main(void)struct usb_bus *bus;struct usb_device *dev;usb_init();usb_find_busses();usb_find_devices();printf(bus/device idVendor/idProductn);for (bus = usb_busses; bus; bus = bus-next) for (dev = bus-devices; dev; dev = dev-next) int ret, i;char string256;usb_dev_handle *udev;printf(%s/%s
20、 %04X/%04Xn, bus-dirname, dev-filename,dev-descriptor.idVendor, dev-descriptor.idProduct);udev = usb_open(dev);if (udev) if (dev-descriptor.iManufacturer) ret = usb_get_string_simple(udev, dev-descriptor.iManufacturer, string, sizeof(string);if (ret 0)printf(- Manufacturer : %sn, string);elseprintf(
21、- Unable to fetch manufacturer stringn);if (dev-descriptor.iProduct) ret = usb_get_string_simple(udev, dev-descriptor.iProduct, string, sizeof(string);if (ret 0)printf(- Product : %sn, string);elseprintf(- Unable to fetch product stringn);if (dev-descriptor.iSerialNumber) ret = usb_get_string_simple
22、(udev, dev-descriptor.iSerialNumber, string, sizeof(string);if (ret 0)printf(- Serial Number: %sn, string);elseprintf(- Unable to fetch serial number stringn);usb_close (udev);if (!dev-config) printf( Couldnt retrieve descriptorsn);continue;for (i = 0; i descriptor.bNumConfigurations; i+)print_confi
23、guration(&dev-config);return 0;The above program should be compiled as(root$)gcc -o usbdevice_details testlibusb.c -I/usr/local/include -L. -lnsl -lm -lc -L/usr/local/lib -lusb(root$)./usbdevice_details (enter)Following is the output of the above command ,its the listing of a USB pen drive connected
24、 to my system.The first line displays the bus-name/device-name & device-id/product-id and rest of the listing is self-descriptive.001/004 0EA0/2168- Manufacturer : USB- Product : Flash Disk- Serial Number: 4CE45C4E403EE53DwTotalLength: 39bNumInterfaces: 1bConfigurationValue: 1iConfiguration: 0bmAttr
25、ibutes: 80hMaxPower: 100bInterfaceNumber: 0bAlternateSetting: 0bNumEndpoints: 3bInterfaceClass: 8bInterfaceSubClass: 6bInterfaceProtocol: 80iInterface: 0bEndpointAddress: 81hbmAttributes: 02hwMaxPacketSize: 64bInterval: 0bRefresh: 0bSynchAddress: 0bEndpointAddress: 02hbmAttributes: 02hwMaxPacketSize
26、: 64bInterval: 0bRefresh: 0bSynchAddress: 0bEndpointAddress: 83hbmAttributes: 03hwMaxPacketSize: 2bInterval: 1bRefresh: 0bSynchAddress: 0Before executing the above program download the current version ofLibusb library from, http:/ The aboveprogram can also be found under the tests directory of Libus
27、b directory(after u install it)Now I will explain in brief some of the functions and attributes dealt in the above program.usb_init() - Used to initialize Libusb and establish connection with kernel structures .usb_find_busses() - Looks for all the USB busses on the computer.usb_find_devices() - Loo
28、ks for all the USB devices connected to the computer.usb_open(dev) - Opens the device dev which is given as argument to this function.usb_get_string_simple() - Used to extract the string descriptor of the device taken argument.Important attributes of USB devices useful in device driver codingConfigu
29、ration and Endpoints are one of the two important descriptors ofany USB device. These descriptors are defined using the ?structusb_config_descriptor? and ?struct_usb_endpoint_descriptor?respectively .dev-descriptor.idVendor ? Reveals the Vendor-Id of the USB device connected to the system.dev-descri
30、ptor.idProduct - Reveals the Product-Id of the USB device connected to the system.dev-descriptor.iManufacturer - Reveals the name of the Manufacturer USB device connected to the system.EndpointAddress:Combination of endpoint address and endpoint direction on a USB device.InterfaceNumber : One of the
31、 several interfaces that is allocated to the connected USB device.AlternateSetting:This is part of the a single interface allocated to the USB device.Prerequisites for Libusb programmingLinux system with Kernel 2.4 above series.Proficiency in C language.Good understanding of USB device internals.Ide
32、a about USBFS.Hope this HOWTO has enlightened you about Libusb API and I expect thisHOWTO will give you a head start in your device driver programmingendeavor .This HOWTO is just an introduction to Libusb ,for completedocumentation please goto http:/About MyselfMy name is Vikram C , Im a linux freak
33、 and currently working as Linuxdeveloper in the city of Hyderabad India.You can reach me atvikram_147 / vikram/=2008年03月19日 星期三10:31驅(qū)動研發(fā)向來是內(nèi)核研發(fā)中工作量最多的一塊,隨著USB設(shè)備的普及,大量的USB設(shè)備的驅(qū)動研發(fā)也成為驅(qū)動研發(fā)者手頭上做的最多的事情。本文主要介紹Linux平臺下基于libusb的驅(qū)動研發(fā),希望能夠給從事Linux驅(qū)動研發(fā)的朋友帶來些幫助,更希望能夠給其他平臺上的無驅(qū)設(shè)計帶來些幫助。文章是我在工作中使用libusb的一些總結(jié),難免有錯誤,如
34、有不當(dāng)?shù)牡胤?,還請指正。 Linux 平臺上的usb驅(qū)動研發(fā),主要有內(nèi)核驅(qū)動的研發(fā)和基于libusb的無驅(qū)設(shè)計。對于內(nèi)核驅(qū)動的大部分設(shè)備,諸如帶usb接口的hid設(shè)備,linux本身已自帶了相關(guān)的驅(qū)動,我們只要操作設(shè)備文件便能完成對設(shè)備大部分的操作,而另外一些設(shè)備,諸如自己設(shè)計的硬件產(chǎn)品,這些驅(qū)動就需要我們驅(qū)動工程師研發(fā)出相關(guān)的驅(qū)動了。內(nèi)核驅(qū)動有他的好處,然而內(nèi)核驅(qū)動在某些情況下會遇見如下的一些問題:1 當(dāng)使用我們產(chǎn)品的客戶有2.4內(nèi)核的平臺,同時也有2.6內(nèi)核的平臺,我們要設(shè)計的驅(qū)動是要兼容兩個平臺的,就連makefile 我們都要寫兩個。2當(dāng)我們要把linux移植到嵌入平臺上,你會發(fā)現(xiàn)原先
35、linux自帶的驅(qū)動移過去還挺大的,我的內(nèi)核當(dāng)然是越小越好拉,這樣有必要么。這還不是最郁悶的地方,如果嵌入平臺是客戶的,客戶要購買你的產(chǎn)品,你忽然發(fā)現(xiàn)客戶設(shè)備里的系統(tǒng)和你的環(huán)境不相同,他沒有你要的驅(qū)動了,你的程式運行不了,你會先想:“沒關(guān)系,我寫個內(nèi)核驅(qū)動加載一下不就行了“。卻發(fā)現(xiàn)客戶連insmod加載模塊的工具都沒移植,那時你就看看老天,說聲我怎么那么倒霉啊,客戶可不想你動他花了n時間移植的內(nèi)核哦3花了些功夫?qū)懥藗€新產(chǎn)品的驅(qū)動,挺有成就感啊,代碼質(zhì)量也是相當(dāng)?shù)挠兴疁?zhǔn)啊。正當(dāng)你沉醉在你的代碼中時,客服不斷的郵件來了,“客戶需要2.6.5內(nèi)核的驅(qū)動,config文件我已發(fā)你了” “客戶需要雙核的
36、 2.6.18-smp 的驅(qū)動” “客戶的平臺是自己制定的是2.6.12-xxx “你恨不得把驅(qū)動的原始碼給客戶,這樣省得編譯了。你的一部分工作時間編譯內(nèi)核,制定驅(qū)動有問題產(chǎn)生必然會有想辦法解決問題的人, libusb的出現(xiàn)給我們帶來了某些方便,即節(jié)約了我們的時間,也降低了公司的成本。 所以在一些情況下,就能考慮使用libusb的無驅(qū)設(shè)計了。 下面我們就來周詳討論一下libusb, 并以寫一個hid設(shè)備的驅(qū)動來講解怎么運用libusb,至于文章中涉及的usb協(xié)議的知識,限于篇幅,就不周詳講解了,相關(guān)的可自行查看usb相關(guān)協(xié)議。一 libusb 介紹 libusb 設(shè)計了一系列的外部API為應(yīng)用
37、程式所調(diào)用,通過這些API應(yīng)用程式能操作硬件,從libusb的原始碼能看出,這些API 調(diào)用了內(nèi)核的底層接口,和kerneldriver中所用到的函數(shù)所實現(xiàn)的功能差不多,只是libusb更加接近USB 規(guī)范。使得libusb的使用也比研發(fā)內(nèi)核驅(qū)動相對容易的多。Libusb 的編譯安裝請查看Readme,這里不做詳解二 libusb 的外部接口2.1 初始化設(shè)備接口這些接口也能稱為核心函數(shù),他們主要用來初始化并尋找相關(guān)設(shè)備。usb_init函數(shù)定義: void usb_init(void);從函數(shù)名稱能看出這個函數(shù)是用來初始化相關(guān)數(shù)據(jù)的,這個函數(shù)大家只要記住必須調(diào)用就行了,而且是一開始就要調(diào)用的
38、.usb_find_busses函數(shù)定義: int usb_find_busses(void);尋找系統(tǒng)上的usb總線,所有usb設(shè)備都通過usb總線和計算機總線通信。進而和其他設(shè)備通信。此函數(shù)返回總線數(shù)。usb_find_devices函數(shù)定義: int usb_find_devices(void);尋找總線上的usb設(shè)備,這個函數(shù)必要在調(diào)用usb_find_busses()后使用。以上的三個函數(shù)都是一開始就要用到的,此函數(shù)返回設(shè)備數(shù)量。usb_get_busses函數(shù)定義: struct usb_bus *usb_get_busses(void);這個函數(shù)返回總線的列表,在高一些的版本中已
39、用不到了,這在下面的實例中會有講解2.2 操作設(shè)備接口 usb_open函數(shù)定義: usb_dev_handle *usb_open(struct *usb_device dev);打開要使用的設(shè)備,在對硬件進行操作前必須要調(diào)用usb_open 來打開設(shè)備,這里大家看到有兩個結(jié)構(gòu)體 usb_dev_handle 和usb_device 是我們在研發(fā)中經(jīng)常碰到的,有必要把他們的結(jié)構(gòu)看一看。在libusb 中的usb.h和usbi.h中有定義。這里我們不妨理解為返回的 usb_dev_handle 指針是指向設(shè)備的句柄,而行參里輸入就是需要打開的設(shè)備。 usb_close 函數(shù)定義: int us
40、b_close(usb_dev_handle *dev); 和usb_open相對應(yīng),關(guān)閉設(shè)備,是必須調(diào)用的, 返回0成功,Libusb庫的使用使用libusb之前你的linux系統(tǒng)必須裝有usb文件系統(tǒng),這里還介紹了使用hiddev設(shè)備文件來訪問設(shè)備,目的在于不僅能比較出usb的易用性,還提供了一個轉(zhuǎn)化成libusb驅(qū)動的案例。3.1 find設(shè)備所有驅(qū)動第一步首先是尋找到要操作的設(shè)備,我們先來看看HID驅(qū)動是怎樣尋找到設(shè)備的。我們假設(shè)尋找設(shè)備的函數(shù)Device_Find(注:代碼只是為了方便解說,不確保代碼的健全)/* 我們簡單看一下使用hid驅(qū)動尋找設(shè)備的實現(xiàn),然后在看一下libusb是
41、怎么尋找設(shè)備的 */ int Device_Find() char dir_str100; /* 這個變量我們用來保存設(shè)備文件的目錄路徑 */ char hiddev100; /* 這個變量用來保存設(shè)備文件的全路徑 */DIR dir; /* 申請的字符串?dāng)?shù)組清空,這個編程習(xí)慣要養(yǎng)成 */memset (dir_str, 0 , sizeof(dir_str);memset (hiddev, 0 , sizeof(hiddev); /* hiddev 的設(shè)備描述符不在/dev/usb/hid下面,就在/dev/usb 下面 這里我們使用opendir函數(shù)來檢驗?zāi)夸浀挠行源蜷_目錄返回的值保存在
42、變量dir里,dir前面有聲明*/dir=opendir(/dev/usb/hid); if(dir) /* 程式運行到這里,說明存在 /dev/usb/hid 路徑的目錄 */ sprintf(dir_str,/dev/usb/hid/); closedir(dir); else /* 如果不存在hid目錄,那么設(shè)備文件就在/dev/usb下 */ sprintf(dir_str,/dev/usb/); /* DEVICE_MINOR 是指設(shè)備數(shù),HID一般是16個 */for(i = 0; i /* 獲得全路徑的設(shè)備文件名,一般hid設(shè)備文件名是hiddev0 到 hiddev16 */
43、sprintf(hiddev, %shiddev%d, dir_str,i); /* 打開設(shè)備文件,獲得文件句柄 */ fd = open(hiddev, O_RDWR); if(fd 0) /* 操作設(shè)備獲得設(shè)備信息 */ ioctl(fd, HIDIOCGDEVINFO, &info); /* VENDOR_ID 和 PRODUCT_ID 是標(biāo)識usb設(shè)備廠家和產(chǎn)品ID,驅(qū)動都需要這兩個參數(shù)來尋找設(shè)備,到此我們尋找到了設(shè)備 */ if(info.vendor= VENDOR_ID & duct= PRODUCT_ID) /* 這里添加設(shè)備的初始化代碼 */ device_n
44、um+; /* 找到的設(shè)備數(shù) */ close(fd); return device_num; /* 返回尋找的設(shè)備數(shù)量 */我們再來看libusb是怎么來尋找和初始化設(shè)備int Device_Find()struct usb_bus *busses; int device_num = 0; device_num = 0; /* 記錄設(shè)備數(shù)量 */ usb_init(); /* 初始化 */ usb_find_busses(); /* 尋找系統(tǒng)上的usb總線 */ usb_find_devices(); /* 尋找usb總線上的usb設(shè)備 */ /* 獲得系統(tǒng)總線鏈表的句柄 */busses
45、= usb_get_busses(); struct usb_bus *bus; /* 遍歷總線 */ for (bus = busses; bus; bus = bus-next) struct usb_device *dev; /* 遍歷總線上的設(shè)備 */ for (dev = bus-devices; dev; dev = dev-next) /* 尋找到相關(guān)設(shè)備, */if(dev-descriptor.idVendor=VENDOR_ID& dev-descriptor.idProduct = PRODUCT_ID) /* 這里添加設(shè)備的初始化代碼 */ device_num+; /
46、* 找到的設(shè)備數(shù) */ return device_num; /* 返回設(shè)備數(shù)量 */注:在新版本的libusb中,usb_get_busses就能不用了 ,這個函數(shù)是返回系統(tǒng)上的usb總線鏈表句柄 這里我們直接用usb_busses變量,這個變量在usb.h中被定義為外部變量所以能直接寫成這樣:struct usb_bus *bus; for (bus = usb_busses; bus; bus = bus-next) struct usb_device *dev; for (dev = bus-devices; dev; dev = dev-next) /* 這里添加設(shè)備的初始化代碼 *
47、/ 3.2 打開設(shè)備假設(shè)我們定義的打開設(shè)備的函數(shù)名是device_open,/* 使用hid驅(qū)動打開設(shè)備 */int Device_Open() int handle; /* 傳統(tǒng)HID驅(qū)動調(diào)用,通過open打開設(shè)備文件就可 */handle = open(“hiddev0”, O_RDONLY);/* 使用libusb打開驅(qū)動 */int Device_Open()/* LIBUSB 驅(qū)動打開設(shè)備,這里寫的是偽代碼,不確保代碼有用 */struct usb_device* udev;usb_dev_handle* device_handle;/* 當(dāng)找到設(shè)備后,通過usb_open打開設(shè)備,
48、這里的函數(shù)就相當(dāng)open 函數(shù) */device_handle = usb_open(udev);3.3 讀寫設(shè)備和操作設(shè)備假設(shè)我們的設(shè)備使用控制傳輸方式,至于批處理傳輸和中斷傳輸限于篇幅這里不介紹我們這里定義三個函數(shù),Device_Write, Device_Read, Device_ReportDevice_Report 功能發(fā)送接收函數(shù)Device_Write 功能寫數(shù)據(jù)Device_Read 功能讀數(shù)據(jù)Device_Write和Device_Read調(diào)用Device_Report發(fā)送寫的信息和讀的信息,研發(fā)者根據(jù)發(fā)送的命令協(xié)議來設(shè)計,我們這里只簡單實現(xiàn)發(fā)送數(shù)據(jù)的函數(shù)。假設(shè)我們要給設(shè)備發(fā)
49、送72字節(jié)的數(shù)據(jù),頭8個字節(jié)是報告頭,是我們定義的和設(shè)備相關(guān)的規(guī)則,后64位是數(shù)據(jù)。HID驅(qū)動的實現(xiàn)(這里只是用代碼來有助理解,代碼是偽代碼)int Device_Report(int fd, unsigned char *buffer72)int ret; /* 保存ioctl函數(shù)的返回值 */int index; unsigned char send_data72; /* 發(fā)送的數(shù)據(jù) */unsigned char recv_data72; /* 接收的數(shù)據(jù) */ struct hiddev_usage_ref uref; /* hid驅(qū)動定義的數(shù)據(jù)包 */ struct hiddev_report_info rinfo; /* hid驅(qū)動定義的 memset(send_data, 0, sizeof(send_data);memset(recv_data, 0, sizeof(recv_data); memcpy(send_data, buffer72, 72); /* 這在發(fā)送數(shù)據(jù)之前必須調(diào)用的,初始化設(shè)備 */ ret = ioctl(fd, HIDIOCINITREPORT, 0); if( ret !=0) return NOT_OPENED_DEVICE;/*
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘭州外語職業(yè)學(xué)院《五官醫(yī)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 江西科技職業(yè)學(xué)院《中國民間美術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 濟南大學(xué)《現(xiàn)代控制理論及其仿真》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南信息職業(yè)技術(shù)學(xué)院《人體形態(tài)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南工程職業(yè)技術(shù)學(xué)院《體育舞蹈摩登》2023-2024學(xué)年第一學(xué)期期末試卷
- 衡水健康科技職業(yè)學(xué)院《生物工程實訓(xùn)理論與實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶智能工程職業(yè)學(xué)院《手繪空間快速表現(xiàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶健康職業(yè)學(xué)院《信號與系統(tǒng)理論教學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中原科技學(xué)院《熱儲工程課程設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江汽車職業(yè)技術(shù)學(xué)院《土建工程基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年八年級上學(xué)期1月期末物理試題(含答案)
- 2025年國新國際投資有限公司招聘筆試參考題庫含答案解析
- 制造車間用洗地機安全操作規(guī)程
- 2025河南省建筑安全員-A證考試題庫及答案
- 油氣田智能優(yōu)化設(shè)計-洞察分析
- 陜西2020-2024年中考英語五年真題匯編學(xué)生版-專題09 閱讀七選五
- 磚混結(jié)構(gòu)基礎(chǔ)加固技術(shù)方案
- 助產(chǎn)專業(yè)的職業(yè)生涯規(guī)劃
- 新《國有企業(yè)管理人員處分條例》知識競賽考試題庫500題(含答案)
- MOOC 有機化學(xué)(上)-北京師范大學(xué) 中國大學(xué)慕課答案
- 五年級上冊脫式計算100題及答案
評論
0/150
提交評論