版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
USB總線引出兩個(gè)重要的鏈表!一個(gè)USB總線引出兩個(gè)重要的鏈表,一個(gè)為USB設(shè)備鏈表,一個(gè)為USB驅(qū)動鏈表。設(shè)備鏈表包含各種系統(tǒng)中的USB設(shè)備以及這些設(shè)備的所有接口,驅(qū)動鏈表包含USB設(shè)備驅(qū)動程序(usbdevicedriver)和USB驅(qū)動程序(usbdriver)。USB設(shè)備驅(qū)動程序(usbdevicedriver)和USB驅(qū)動程序(usbdriver)的區(qū)別是什么?USB設(shè)備驅(qū)動程序包含USB設(shè)備的一些通用特性,將與所有USB設(shè)備相匹配。在USBcore定義了:structusb_device_driverusb_generic_driver。usb_generic_driver是USB子系統(tǒng)中唯一的一個(gè)設(shè)備驅(qū)動程序?qū)ο?。而USB驅(qū)動程序則是與接口相匹配,接口是一個(gè)完成特定功能的端點(diǎn)的集合。設(shè)備是如何添加到設(shè)備鏈表上去的?在設(shè)備插入U(xiǎn)SB控制器之后,USBcore即會將設(shè)備在系統(tǒng)中注冊,添加到USB設(shè)備鏈表上去。USB設(shè)備驅(qū)動程序(usbdevicedriver)是如何添加到驅(qū)動鏈表上去的?在系統(tǒng)啟動注冊USBcore時(shí),USB設(shè)備驅(qū)動程序即將被注冊,也就添加到驅(qū)動鏈表上去了。接口是如何添加到設(shè)備鏈表上去的?在USB設(shè)備驅(qū)動程序和USB設(shè)備的匹配之后,USBcore會對設(shè)備進(jìn)行配置,分析設(shè)備的結(jié)構(gòu)之后會將設(shè)備所有接口都添加到設(shè)備鏈表上去。比如鼠標(biāo)設(shè)備中有一個(gè)接口,USBcore對鼠標(biāo)設(shè)備配置后,會將這個(gè)接口添加到設(shè)備鏈表上去。USB驅(qū)動程序(usbdriver)是如何添加到驅(qū)動鏈表上去的?在每個(gè)USB驅(qū)動程序的被注冊時(shí),USB驅(qū)動程序即會添加到驅(qū)動鏈表上去。比如鼠標(biāo)驅(qū)動程序,usb_mouse_init函數(shù)將通過usb_register(&usb_mouse_driver)將鼠標(biāo)驅(qū)動程序注冊到USBcore中,然后就添加到驅(qū)動鏈表中去了。其中usb_mouse_driver是描述鼠標(biāo)驅(qū)動程序的結(jié)構(gòu)體。已配置狀態(tài)(configuredstatus)之后話當(dāng)鼠標(biāo)的設(shè)備、接口都添加到設(shè)備鏈表,并且鼠標(biāo)驅(qū)動程序也添加到驅(qū)動鏈表上去了,系統(tǒng)就進(jìn)入一種叫做已配置(configured)的狀態(tài)。要達(dá)到已配置狀態(tài),將經(jīng)歷復(fù)雜的過程,USBcore為USB設(shè)備奉獻(xiàn)著無怨無悔。在這個(gè)過程中,系統(tǒng)將會建立起該設(shè)備的的設(shè)備、配置、接口、設(shè)置、端點(diǎn)的描述信息,它們分別被usb_device、usb_configuration、usb_interface、usb_host_interface、usb_host_endpoint結(jié)構(gòu)體描述。設(shè)備達(dá)到已配置狀態(tài)后,首先當(dāng)然就要進(jìn)行USB驅(qū)動程序和相應(yīng)接口的配對,對于鼠標(biāo)設(shè)備來說則是鼠標(biāo)驅(qū)動程序和鼠標(biāo)中的接口的配對。USBcore會調(diào)用usb_device_match函數(shù),通過比較設(shè)備中的接口信息和USB驅(qū)動程序中的id_table,來初步?jīng)Q定該USB驅(qū)動程序是不是跟相應(yīng)接口相匹配。通過這一道關(guān)卡后,USBcore會認(rèn)為這個(gè)設(shè)備應(yīng)該由這個(gè)驅(qū)動程序負(fù)責(zé)。然而,僅僅這一步是不夠的,接著,將會調(diào)用USB驅(qū)動程序中的probe函數(shù)對相應(yīng)接口進(jìn)行進(jìn)一步檢查。如果該驅(qū)動程序確實(shí)適合設(shè)備接口,對設(shè)備做一些初始化工作,分配urb準(zhǔn)備數(shù)據(jù)傳輸。當(dāng)鼠標(biāo)設(shè)備在用戶空間打開時(shí),將提交probe函數(shù)構(gòu)建的urb請求塊,urb將開始為傳送數(shù)據(jù)而忙碌了。urb請求塊就像一個(gè)裝東西的“袋子”,USB驅(qū)動程序把“空袋子”提交給USBcore,然后再交給主控制器,主控制器把數(shù)據(jù)放入這個(gè)“袋子”后再將裝滿數(shù)據(jù)的“袋子”通過USBcore交還給USB驅(qū)動程序,這樣一次數(shù)據(jù)傳輸就完成了。以下是完全注釋后的鼠標(biāo)驅(qū)動程序代碼usbmouse?c[cpp]viewplaincopy/**$Id:usbmouse.c,v1.152001/12/2710:37:41vojtechExp$TOC\o"1-5"\h\z**Copyright(c)1999-2001VojtechPavlik**USBHIDBPMousesupport*/8.#include<linux/kernel.h>#include<linux/slab.h>#include<linux/module.h>#include<linux/init.h>#include<linux/usb/input.h>
3.54.#include<linux/hid.h>/*VersionInformation*/#defineDRIVER_VERSION"v1.6"#defineDRIVER_AUTHOR"VojtechPavlik<vojtech@ucw.cz>"#defineDRIVER_DESC"USBHIDBootProtocolmousedriver"#defineDRIVER_LICENSE"GPL"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE(DRIVER_LICENSE);/**鼠標(biāo)結(jié)構(gòu)體,用于描述鼠標(biāo)設(shè)備。*/structusb_mouse{/*鼠標(biāo)設(shè)備的名稱,包括生產(chǎn)廠商、產(chǎn)品類別、產(chǎn)品等信息*/charname[128];/*設(shè)備節(jié)點(diǎn)名稱*/charphys[64];/*USB鼠標(biāo)是一種USB設(shè)備,需要內(nèi)嵌一個(gè)USB設(shè)備結(jié)構(gòu)體來描述其USB屬性*/structusb_device*usbdev;/*USB鼠標(biāo)同時(shí)又是一種輸入設(shè)備,需要內(nèi)嵌一個(gè)輸入設(shè)備結(jié)構(gòu)體來描述其輸入設(shè)備的屬性*/structinput_dev*dev;/*URB請求包結(jié)構(gòu)體,用于傳送數(shù)據(jù)*/structurb*irq;/*普通傳輸用的地址*/signedchar*data;/*dma傳輸用的地址*/dma_addr_tdata_dma;};/*urb回調(diào)函數(shù),在完成提交urb后,urb回調(diào)函數(shù)將被調(diào)用。*此函數(shù)作為usb_fill_int_urb函數(shù)的形參,為構(gòu)建的urb制定的回調(diào)函數(shù)。*/staticvoidusb_mouse_irq(structurb*urb){
/**urb中的context指針用于為USB驅(qū)動程序保存一些數(shù)據(jù)。比如在這個(gè)回調(diào)函數(shù)的形參沒有傳遞在probe*中為mouse結(jié)構(gòu)體分配的那塊內(nèi)存的地址指針,而又需要用到那塊內(nèi)存區(qū)域中的數(shù)據(jù),context指針則幫了*大忙了!*在填充urb時(shí)將context指針指向mouse結(jié)構(gòu)體數(shù)據(jù)區(qū),在這又創(chuàng)建一個(gè)局部mouse指針指向在probe*函數(shù)中為mouse申請的那塊內(nèi)存,那塊內(nèi)存保存著非常重要數(shù)據(jù)。*當(dāng)urb通過USBcore提交給he之后,如果結(jié)果正常,mouse->data指向的內(nèi)存區(qū)域?qū)⒈4嬷髽?biāo)的按鍵*和移動坐標(biāo)信息,系統(tǒng)則依靠這些信息對鼠標(biāo)的行為作出反應(yīng)。*mouse中內(nèi)嵌的dev指針,指向input_dev所屬于的內(nèi)存區(qū)域。*/structusb_mouse*mouse=urb->context;signedchar*data=mouse->data;structinput_dev*dev=mouse->dev;intstatus;69./**status值為0表示urb成功返回,直接跳出循環(huán)把鼠標(biāo)事件報(bào)告給輸入子系統(tǒng)。*ECONNRESET出錯(cuò)信息表示urb被usb_unlink_urb函數(shù)給unlink了,ENOENT出錯(cuò)信息表示urb被*usb_kill_urb函數(shù)給kill了。usb_kill_urb表示徹底結(jié)束urb的生命周期,而usb_unlink_urb貝U*是停止urb,這個(gè)函數(shù)不等urb完全終止就會返回給回調(diào)函數(shù)。這在運(yùn)行中斷處理程序時(shí)或者等待某自旋鎖*時(shí)非常有用,在這兩種情況下是不能睡眠的,而等待一個(gè)urb完全停止很可能會出現(xiàn)睡眠的情況。*ESHUTDOWN這種錯(cuò)誤表示USB主控制器驅(qū)動程序發(fā)生了嚴(yán)重的錯(cuò)誤,或者提交完urb的一瞬間設(shè)備被拔出。*遇見除了以上三種錯(cuò)誤以外的錯(cuò)誤,將申請重傳urb。TOC\o"1-5"\h\z*/switch(urb->status){case0:/*success*/break;case-ECONNRESET:/*unlink*/case-ENOENT:case-ESHUTDOWN:return;/*-EPIPE:shouldclearthehalt*/default:/*error*/
gotoresubmit;}91./**向輸入子系統(tǒng)匯報(bào)鼠標(biāo)事件情況,以便作出反應(yīng)。*data數(shù)組的第0個(gè)字節(jié):bit0、1、2、3、4分別代表左、右、中、SIDE、EXTRA鍵的按下情況;*data數(shù)組的第1個(gè)字節(jié):表示鼠標(biāo)的水平位移;*data數(shù)組的第2個(gè)字節(jié):表示鼠標(biāo)的垂直位移;*data數(shù)組的第3個(gè)字節(jié):REL_WHEEL位移。*/input_report_key(dev,BTN_LEFT,data[0]&0x01);100.inputreportkey(dev,BTNRIGHT,data[0]&0x02);101.inputreportkey(dev,BTNMIDDLE,data[0]&0x04);102.inputreportkey(dev,BTNSIDE,data[0]&0x08);103.inputreportkey(dev,BTNEXTRA,data[0]&0x10);104.inputreportrel(dev,REL_X,data[1])105.inputreportrel(dev,REL_Y,data[2])106.inputreportrel(dev,RELWHEEL,data[3])107./**這里是用于事件同步。上面幾行是一次完整的鼠標(biāo)事件,包括按鍵信息、絕對坐標(biāo)信息和滾輪信息,輸入子*系統(tǒng)正是通過這個(gè)同步信號來在多個(gè)完整事件報(bào)告中區(qū)分每一次完整事件報(bào)告。示意如下:*按鍵信息坐標(biāo)位移信息滾輪信息EV_SYC|按鍵信息坐標(biāo)位移信息滾輪信息EV_SYC...*/input_sync(dev);114./**系統(tǒng)需要周期性不斷地獲取鼠標(biāo)的事件信息,因此在urb回調(diào)函數(shù)的末尾再次提交urb請求塊,這樣又會*調(diào)用新的回調(diào)函數(shù),周而復(fù)始。*在回調(diào)函數(shù)中提交urb—定只能是GFP_ATOMIC優(yōu)先級的,因?yàn)閡rb回調(diào)函數(shù)運(yùn)行于中斷上下文中,在提*交urb過程中可能會需要申請內(nèi)存、保持信號量,這些操作或許會導(dǎo)致USBcore睡眠,一切導(dǎo)致睡眠的行*為都是不允許的。*/resubmit:status=usb_submit_urb(urb,GFP_ATOMIC);if(status)
30.期。56.157.mouse->usbdev->bus->bus_name,mouse->usbdev->devpath,status);}/**打開鼠標(biāo)設(shè)備時(shí),開始提交在probe函數(shù)中構(gòu)建的urb,進(jìn)入urb周*/staticintusb_mouse_open(structinput_dev*dev){structusb_mouse*mouse=dev->private;mouse->irq->dev=mouse->usbdev;if(usb_submit_urb(mouse->irq,GFP_KERNEL))return-EIO;return0;}/**關(guān)閉鼠標(biāo)設(shè)備時(shí),結(jié)束urb生命周期。*/staticvoidusb_mouse_close(structinput_dev*dev){structusb_mouse*mouse=dev->private;usb_kill_urb(mouse->irq);}/**驅(qū)動程序的探測函數(shù)*/staticintusb_mouse_probe(structusb_interface*intf,conststructusbdeviceid*id){/**接口結(jié)構(gòu)體包含于設(shè)備結(jié)構(gòu)體中,interface_to_usbdev是通過接口結(jié)構(gòu)體獲得它的設(shè)備結(jié)構(gòu)體。*usb_host_interface是用于描述接口設(shè)置的結(jié)構(gòu)體,內(nèi)嵌在接口結(jié)構(gòu)體usb_interface中。*usb_endpoint_descriptor是端點(diǎn)描述符結(jié)構(gòu)體,內(nèi)嵌在端點(diǎn)結(jié)構(gòu)體usb_host_endpoint中,而端點(diǎn)199.199.*163.164.*結(jié)構(gòu)體內(nèi)嵌在接口設(shè)置結(jié)構(gòu)體中。*/165.struct166.structusb_device*dev=interface_to_usbdev(intf);usbhostinterface*interface;167.struct168.structusb_endpoint_descriptor*endpoint;usbmouse*mouse;169.170.input_devintpipe,maxp;struct*input_dev;171.172.interface=intf->cur_altsetting;173.174.報(bào)錯(cuò)175.*//*if82.183.個(gè)字節(jié),96.197.data鼠標(biāo)僅有一個(gè)interrupt類型的in端點(diǎn),不滿足此要求的設(shè)備均(interface->desc.bNumEndpoints!=1)return-ENODEV;endpoint=&interface->endpoint[0].desc;(!usb_endpoint_is_int_in(endpoint))return-ENODEV;if/*返回對應(yīng)端點(diǎn)能夠傳輸?shù)淖畲蟮臄?shù)據(jù)包,鼠標(biāo)的返回的最大數(shù)據(jù)包為4數(shù)據(jù)包具體內(nèi)容在urb*回調(diào)函數(shù)中有詳細(xì)說明。*/pipemaxpusb_rcvintpipe(dev,endpoint->bEndpointAddress)usb_maxpacket(dev,pipe,usb_pipeout(pipe));/*為mouse設(shè)備結(jié)構(gòu)體分配內(nèi)存*/mouse=kzalloc(sizeof(structusbmouse),GFPKERNEL);/*input_dev*/input_dev=input_allocate_device();if(!mouse||!input_dev)gotofail1;/*申請內(nèi)存空間用于數(shù)據(jù)傳輸,data為指向該空間的地址,dma則是這塊內(nèi)存空間的dma映射,即這塊內(nèi)存空間對應(yīng)的dma地址。在使用dma傳輸?shù)那闆r下,則使指向的dma區(qū)域,否則使用data指向的普通內(nèi)存區(qū)域進(jìn)行傳輸。198.用datadma*gfp_atomic表示不等待,gfp_kernel是普通的優(yōu)先級,可以睡眠等待,由于鼠標(biāo)使用中斷傳輸方式,*不允許睡眠狀態(tài),data又是周期性獲取鼠標(biāo)事件的存儲區(qū),因此使用GFP_ATOMIC優(yōu)先級,如果不能*分配到內(nèi)存則立即返回0。*/mouse->data=usb_buffer_alloc(dev,8,GFP_ATOMIC,&mouse->datadma);205.ifuse->datadma);205.if(!mouse->data)206.209.的數(shù)量,210.充。為urb結(jié)構(gòu)體申請內(nèi)存空間,第一個(gè)參數(shù)表示等時(shí)傳輸時(shí)需要傳送包其它傳輸方式則為0。*申請的內(nèi)存將通過下面即將見到的206.209.的數(shù)量,210.充。為urb結(jié)構(gòu)體申請內(nèi)存空間,第一個(gè)參數(shù)表示等時(shí)傳輸時(shí)需要傳送包其它傳輸方式則為0。*申請的內(nèi)存將通過下面即將見到的usbfillinturb函數(shù)進(jìn)行填211.*/212.213.214.mouse->irq=usb_alloc_urb(0,if(!mouse->irq)gotofail2;GFPKERNEL);gotofaill;207./*208./*215.216./*填充usb設(shè)備結(jié)構(gòu)體和輸入設(shè)備結(jié)構(gòu)體*/216./*填充usb設(shè)備結(jié)構(gòu)體和輸入設(shè)備結(jié)構(gòu)體*/217.mouse->usbdev=dev;218.mouse->dev=input_dev;219.220.221./*if220.221./*if獲取鼠標(biāo)設(shè)備的名稱*/(dev->manufacturer)222.strlcpy(mouse->name,dev->manufacturer,sizeof(mou222.se->name));223.224.if(dev->product)224.if(dev->product)26.227.228.ame));35.225.if(dev->manufacturer)strlcat(mouse->name,"",sizeof(mouse->name))strlcat(mouse->name,dev->product,sizeof(mouse->n}if(!strlen(mouse->name))snprintf(mouse->name,sizeof(mouse->name),"USBHIDBPMouse%04x:%04x",le16_to_cpu(dev->descriptor.idVendor),le16_to_cpu(dev->descriptor.idProduct));
236.237./*238.備在239.240.*填充鼠標(biāo)設(shè)備結(jié)構(gòu)體中的節(jié)點(diǎn)名。usb_make_path用來獲取USB設(shè)Sysfs中的路徑,格式*為:usb-usb總線號-路徑名。*/241.usbmakepath(dev,mouse->phys,sizeof(mouse->phys));242.strlcat(mouse->phys,"/inputO",sizeof(mouse->phys));243./*將鼠標(biāo)設(shè)備的名稱賦給鼠標(biāo)設(shè)備內(nèi)嵌的輸入子系統(tǒng)結(jié)構(gòu)體*/input_dev->name=mouse->name;TOC\o"1-5"\h\z/*將鼠標(biāo)設(shè)備的設(shè)備節(jié)點(diǎn)名賦給鼠標(biāo)設(shè)備內(nèi)嵌的輸入子系統(tǒng)結(jié)構(gòu)體*/input_dev->phys=mouse->phys;/**input_dev中的input_id結(jié)構(gòu)體,用來存儲廠商、設(shè)備類型和設(shè)備的編號,這個(gè)函數(shù)是將設(shè)備描述符*中的編號賦給內(nèi)嵌的輸入子系統(tǒng)結(jié)構(gòu)體*/usb_to_input_id(dev,&input_dev->id);/*cdev是設(shè)備所屬類另1」(classdevice)*/input_dev->cdev.dev=&intf->dev;255./*evbit用來描述事件,EV_KEY是按鍵事件,EV_REL是相對坐標(biāo)事件*/input_dev->evbit[O]=BIT(EV_KEY)|BIT(EV_REL);/*keybit表示鍵值,包括左鍵、右鍵和中鍵*/input_dev->keybit[LONG(BTN_MOUSE)]=BIT(BTN_LEFT)|BIT(BTN_RIGHT)|BIT(BTN_MIDDLE);/*relbit用于表示相對坐標(biāo)值*/input_dev—>relbit[O]=BIT(REL_X)|BIT(REL_Y);/*有的鼠標(biāo)還有其它按鍵*/input_dev->keybit[LONG(BTN_MOUSE)]|=BIT(BTN_SIDE)|BIT(BTN_EXTRA);/*中鍵滾輪的滾動值*/input_dev->relbit[O]|=BIT(REL_WHEEL);266.267./*input_dev的private數(shù)據(jù)項(xiàng)用于表示當(dāng)前輸入設(shè)備的種類,這里將鼠標(biāo)結(jié)構(gòu)體對象賦給它*/268.inputdev->private=mouse;269.270./*填充輸入設(shè)備打開函數(shù)指針*/inputdev->open=usbmouseopen;271./*填充輸入設(shè)備關(guān)閉函數(shù)指針*/
input_dev->close=usb_mouse_close;273./**填充構(gòu)建urb,將剛才填充好的mouse結(jié)構(gòu)體的數(shù)據(jù)填充進(jìn)urb結(jié)構(gòu)體中,在open中遞交urb。276.*當(dāng)urb包含一個(gè)即將傳輸?shù)腄MA緩沖區(qū)時(shí)應(yīng)該設(shè)置URB_NO_TRANSFER_DMA_MAP。USB核心使用*transfer_dma變量所指向的緩沖區(qū),而不是transfer_buffer變量所指向的?!?URB_NO_SETUP_DMA_MAP用于Setup包,URB_NO_TRANSFER_DMA_MAP用于所有Data包。*/usb_fill_int_urb(mouse->irq,dev,pipe,mouse->data,(maxp>8?8:maxp),usb_mouse_irq,mouse,endpoint->bInterval);mouse->irq->transfer_dma=mouse->data_dma;mouse->irq->transfer_flags|=URB_NO_TRANSFER_DMA_MAP;285./*向系統(tǒng)注冊輸入設(shè)備*/input_register_device(mouse->dev);288./**一般在probe函數(shù)中,都需要將設(shè)備相關(guān)信息保存在一個(gè)usb_interface結(jié)構(gòu)體中,以便以后通過*usb_get_intfdata獲取使用。這里鼠標(biāo)設(shè)備結(jié)構(gòu)體信息將保存在intf接口結(jié)構(gòu)體內(nèi)嵌的設(shè)備結(jié)構(gòu)體中*的driver_data數(shù)據(jù)成員中,即intf->dev->dirverdata=mouse。*/usb_set_intfdata(intf,mouse);return0;296.mouse->datadfail2:usb_buffer_free(dev,8,mouse->data,mouse->datadma);298.299.300.298.299.300.301.302.303.304.305.kfree(mouse);return-ENOMEM;}/**鼠標(biāo)設(shè)備拔出時(shí)的處理函數(shù)*/
staticvoidusb_mouse_disconnect(structusb_interface*intf){/*獲取鼠標(biāo)設(shè)備結(jié)構(gòu)體*/structusb_mouse*mouse=usb_get_intfdata(intf);310./*intf->dev->dirver_data=NULL,將接口結(jié)構(gòu)體中的鼠標(biāo)設(shè)備扌旨針置空。*/usb_set_intfdata(intf,NULL);if(mouse){/*結(jié)束urb生命周期*/usb_kill_urb(mouse->irq);/*將鼠標(biāo)設(shè)備從輸入子系統(tǒng)中注銷*/input_unregister_device(mouse->dev);/*釋放urb存儲空間*/usb_free_urb(mouse->irq);/*釋放存放鼠標(biāo)事件的data存儲空間*/usb_buffer_free(interface_to_usbdev(intf),8,mouse->data,mouse->data_dma);/*釋放存放鼠標(biāo)結(jié)構(gòu)體的存儲空間*/kfree(mouse);TOC\o"1-5"\h\z}}327./**usb_device_id結(jié)構(gòu)體用于表示該驅(qū)動程序所支持的設(shè)備,USB_INTERFACE_INFO可以用來匹配特定類型的接口,*這個(gè)宏的參數(shù)意思為(類別,子類別,協(xié)議)。*USB_INTERFACE_CLASS_HID表示是一種HID(
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保打印紙與復(fù)印機(jī)一體化解決方案銷售合同3篇
- 2024年度商標(biāo)許可使用合同標(biāo)的協(xié)議2篇
- 2024年生態(tài)農(nóng)業(yè)木工班組分包合作合同協(xié)議書3篇
- 2024年度塔吊司機(jī)承包高空作業(yè)勞務(wù)合同3篇
- 2024年度砼泵車租賃與建筑廢棄物處理合同3篇
- 2024年軌道交通建設(shè)BOT特許經(jīng)營合同書2篇
- 2024年度酒店預(yù)訂平臺客戶信息錄入與維護(hù)協(xié)議3篇
- 2024年度生物制藥三方股份轉(zhuǎn)讓及臨床試驗(yàn)合同3篇
- 2024年度2人合伙開設(shè)健身器材連鎖店合作協(xié)議書3篇
- 2024年度外墻保溫工程竣工驗(yàn)收與結(jié)算承包合同3篇
- 中軟統(tǒng)一終端安全管理平臺v90使用手冊
- 護(hù)理質(zhì)量管理PPT通用課件
- 氨水崗位應(yīng)知應(yīng)會手冊.docx
- AQ-C1-19 安全教育記錄表(三級)
- 廣東飼料項(xiàng)目建議書(參考范文)
- 鋁單板、玻璃幕墻建筑施工完整方案
- 六年級數(shù)學(xué)簡便計(jì)算易錯(cuò)題
- 工程造價(jià)咨詢公司質(zhì)量控制制度
- 《常用醫(yī)學(xué)檢查》PPT課件.ppt
- 《發(fā)展經(jīng)濟(jì)學(xué)派》PPT課件.ppt
- 雙層罐技術(shù)要求內(nèi)容
評論
0/150
提交評論