軟件-android10twi模塊使用說明書_第1頁
軟件-android10twi模塊使用說明書_第2頁
軟件-android10twi模塊使用說明書_第3頁
軟件-android10twi模塊使用說明書_第4頁
軟件-android10twi模塊使用說明書_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1.1...........................................11.2......1.1...........................................11.2...........................................11.3適用........................................................ ........ .....................12模塊功能介.........................................2相關(guān)術(shù)語介.........................................222.2.1硬件術(shù)語......................................... 2.2.2術(shù)語......................................... 模塊配置介紹......................................... devicetree默認(rèn)配置................................... board.dts板級配置.................................... ....... .. config配置.................................... ..源碼模塊結(jié)構(gòu)..... .......

.....

..... 驅(qū)動框架介紹......................................... 模塊接口說 i2c_smbus_write_block_data()............................................ i2c用戶態(tài)調(diào)用接 模塊使用范 ..... 利用i2c-core接口讀寫..... TWI設(shè)備.....

.....

...... 調(diào)試節(jié) 調(diào)試工 常見問 TWI數(shù)據(jù)未完全發(fā) TWI起始信號無法發(fā) TWI終止信號無法發(fā) TWI傳送超 概編寫目介紹A133平臺上TWI驅(qū)動接口與調(diào)試方法,為TWI模塊開發(fā)提供參使用范適用于A133/A100平臺的linux-4.9內(nèi)核平臺 1.3適 模塊內(nèi)核層以及應(yīng)用層的開發(fā) 模塊介模塊功能介1:TWI400Kbps。其中CPUX域的TWI控制器時鐘源來自于APB2,CPUS域的R-TWI時鐘源來自于APBS。TWI傳輸數(shù)據(jù)的方式包括包傳輸和DMA。A100平臺支持6TWI,包含4TWI2S_TWI,其中S_TWI0作為與PMU通信使用,該TWI不建議復(fù)用為其他功能。相關(guān)術(shù)語介相關(guān)術(shù)語解釋說明 TwoWireInterface,全志平臺兼I2C標(biāo)準(zhǔn)協(xié)議的總線相關(guān)術(shù) 解釋說 全志科技linux開發(fā)平 linux內(nèi)核中I2C總線適配器的抽象定義.IIC總線的控制器,在物理上連接若干個I2C設(shè)備 linux內(nèi)核中I2C總線通信的抽象定義。描述I2C總線適配器與I2C設(shè)備之間的通信方法I2CClient linux內(nèi)核中I2C設(shè)備的抽象定義I2C linux內(nèi)核I2C設(shè)備驅(qū)動的抽象定義模塊配置介紹Sunxi硬件平臺中,TWITWI控制器來說,模塊配置類似,本小節(jié)展示A100平臺上的TWI0控制器配置(其他TWI控制器配置類似。devicetree設(shè)備樹中存在的是該類所有平臺的模塊配置,設(shè)備樹文件的路徑為:kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1.dtsi,TWI總線的設(shè)備樹配置如下所示:twi@0x05002000{#address-cells=<1>?#size-cells=compatible="allwinner,sun50i- //device_type= //設(shè)備節(jié)點名稱,用于sys_config.fexreg0x00x050020000x0 //TWI0總線寄存器配interrupts=<GIC_SPI7 //TWI0clocks //設(shè)備使用的時clock-frequency400000>?//TWI0控制器的時鐘 //TWI0控制器使用的Pin腳名稱,其中default為正常通信時的引腳配置,sleep為睡眠時的引腳配pinctrl-0=<&twi0_pins_a>?//TWI0控制器default時使用的pin腳配置pinctrl-1=<&twi0_pins_b>?//TWI0控制器sleep時使用的pin腳配置twi_drv_used=<1>? status= //TWI0控制器是否使clk_twi0:{#clock-cellscompatible="allwinner,periph-clk_twi0:{#clock-cellscompatible="allwinner,periph-=""?aliasesaliasessoc_twi0=&twi0?soc_twi1=&twi1?soc_twi2=&twi2?soc_twi3=別名形式為字符串“twi”加連 的數(shù)字,在TWI總線驅(qū)動程序中可以通過函數(shù)獲取對應(yīng)TWI控制器的數(shù) ,從而區(qū)別每一個TWI控制器twi0_pins_a,twi0_pins_b的配置文件路徑為kernel/linux-4.9/arch/arm64/boot/dtssunxi/sun50iw10p1-pinctrl.dtsi,具體配置如下所示:twi0_pins_a2:twi0_pins_a2:twi0@0allwinner,pins="PD14",//TWI控制器使用的引allwinner,pname="twi0_scl","twi0_sda"?//TWI控制器的引腳功allwinner,function="twi0"?allwinner,muxsel=<4>?allwinner,drive=allwinner,pull=//引腳功能描//引腳復(fù)用功能配//io驅(qū)動電阻狀twi0_pins_b:{allwinner,pins="PD14","PD15"?allwinner,function="io_disabled"?allwinner,muxsel=allwinner,drive=clk_twi0kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1-clk.dtsi,ls=<1>?#size-cells=eeprom@50compatible="atmel,24c16"?//reg //board.dtstwi0_pins_a:{allwinner,pins="PH0","PH1"?allwinner,pname="twi0_scl","twi0_sda"?allwinner,function="twi0"?allwinner,muxsel=<2>?allwinner,drive=allwinner,pull=twi0_pins_b:{allwinner,pins="PH0","PH1"?allwinner,function="io_disabled"?allwinner,muxsel=<7>?allwinnertwi0_pins_a:{allwinner,pins="PH0","PH1"?allwinner,pname="twi0_scl","twi0_sda"?allwinner,function="twi0"?allwinner,muxsel=<2>?allwinner,drive=allwinner,pull=twi0_pins_b:{allwinner,pins="PH0","PH1"?allwinner,function="io_disabled"?allwinner,muxsel=<7>?allwinner,drive=allwinner,pull=twi0:clock-frequency=<400000>?//i2c時鐘頻率為pinctrl-0=<&twi0_pins_a>?pinctrl-1=<&twi0_pins_b>?status="okay"? TWIDeviceTreeTWI控制器的子節(jié)點。TWI() config (/kernel/linux-4.9,執(zhí)行makeARCH=arm64 首先,選擇DeviceDrivers2:Device?然后,選擇I2Csupport選項,進入下一級配置,如下圖所示? 3:I2CI2C接口,選I2Cdeviceinterface,如下圖所4:I2Cdevice隨后,選I2CHardWareBussupport 5:2CHardWareBus選擇SUNXII2Ccontroller選項,可選擇直接編譯進內(nèi)核,也可編譯成模塊。如下6:SUNXII2C源碼模塊結(jié)I2C總線驅(qū)動的源代碼位于內(nèi)核在 下kernel/kernel/linux-├──│├──i2c- //Sunxi平臺的I2C│├──i2c- //為Sunxi平臺的I2C│├──i2c-sunxi-test.cSunxi平臺的i2c設(shè)備測試代├──i2c-├──i2c-//I2C子系文件, I2C驅(qū)動框架介7:TWILinux中I2C體系結(jié)構(gòu)上圖所示,圖中用分割線分成了三個層用戶空間,包括所有使用I2C設(shè)備的應(yīng)用程硬件,指實際物理設(shè)備,包括了I2C控制器和I2C其中,Linux內(nèi)核中的I2C驅(qū)動程序從邏輯上又可以分為6個部分I2Cframework提供一種 I2Cslavedevices”的方法。由于這些slavedevices由I2C 控制,因而主要由I2Ccontroller驅(qū)動實現(xiàn)這I2CframeworkI2C總線的技術(shù)細(xì)節(jié),只需要調(diào)用系統(tǒng)的接口,就可以與外部設(shè)備進行通信。正常情況下,外部設(shè)備是位于內(nèi)核態(tài)的其它driver(如觸摸屏,攝像頭等等。I2Cframework也通過字符設(shè)備向用戶空間提供類似的接口,用戶空間程序可以通過該接口從設(shè)備信息。在I2Cframework,有I2Ccore、I2Cbusses、I2Calgos和I2Cmuxes四個模塊I2CcoreI2CadapterI2CalgorithmI2CcontrollerI2CclientI2CdriverI2Cslavedevice的功能(對應(yīng)設(shè)備模型中的device和devicedriver。另外,基I2Csmbus模塊實現(xiàn)SMBus(SystemManagementBus,系統(tǒng)管理總線)的功能。 6.I2Calgos包含了一些通用的I2Calgorithm,所謂的algorithm,是指I2C協(xié)議的通信方法,用于實現(xiàn)I2C的read/write指令,一般情況下,都是由硬件實現(xiàn),不需要特別關(guān)注該 模塊接口說頭文頭文 :i2c-源碼位置:i2c-函數(shù)原型:inti2c_transfer(structi2c_adapter*adap,structi2c_msg*msgs,int功能描述:完成I2C總線和I2C設(shè)備之間的一定數(shù)目的 message交互參數(shù)說明:adap,指向所屬的I2C總線控制器;msgs,i2c_msg類型的指針;num,表示一次需要處理幾個 返>0,已經(jīng)處理的msg個數(shù);<0頭文頭文 :i2c-源碼位置:i2c-函數(shù)原型:inti2c_master_recv(conststructi2c_client*client,char*buf,int功能描述:通過封裝i2c_transfer()完成一次I2c接收操作參數(shù)說明:client,指向當(dāng)前I2C設(shè)備的實例;buf,用于保存接收到的數(shù)據(jù)緩存;count,數(shù)據(jù)緩存buf的長度返回值:>0,成功接收的字節(jié)數(shù);<0,失敗頭頭文 :i2c-源碼位置:i2c-函數(shù)原型:inti2c_master_send(conststructi2c_client*client,constchar*buf,int功能描述:通過封裝i2c_transfer()完成一次I2c發(fā)送操作參數(shù)說明:client,指向當(dāng)前I2C從設(shè)備的實例;buf,要發(fā)送的數(shù)據(jù);count,要發(fā)送的數(shù)據(jù)長度返回值:>0,成功發(fā)送的字節(jié)數(shù);<0,失敗頭頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32i2c_smbus_read_byte(conststructi2c_client功能描述:從I2C總線 一個字節(jié)。( 是通過i2c_transfer()實現(xiàn),以下幾個接口同。)參數(shù)說明:client,指向當(dāng)前的I2C從設(shè)備返回值 到的數(shù)據(jù);<0,失 頭頭文 :i2c-源碼位置:i2c-,功能描述:從I2C總線寫入一個字節(jié)參數(shù)說明:cn2Cve回值:0,成功;<0,失敗頭文頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32 onststructi2c_client*client,u8功能描述:從I2C設(shè)備指定偏移 一個字節(jié)參數(shù)說明:client,指向當(dāng)前的I2C從設(shè)備,command,I2C協(xié)議數(shù)據(jù)的第0字節(jié)命令碼(即偏移值)返回值:>0, 到的數(shù)據(jù);<0,失敗頭頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32 onststructi2c_client*client,u8command,u8功能描述:從I2C設(shè)備指定偏參數(shù)說明:client,指向當(dāng)前的I2C從設(shè)備;command,I2C協(xié)議數(shù)據(jù)的第0字節(jié)命令碼(即偏移值);value,要寫入的數(shù)值返回值:0,成功;<0,失敗 頭頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32 onststructi2c_client*client,u8功能描述:從I2C設(shè)備指定偏移處 一個wod數(shù)據(jù)(兩個字節(jié),適用于I2C設(shè)備寄存器是16位的情況)。參數(shù)說明:client,指向當(dāng)前的I2C從設(shè)備;command,I2C協(xié)議數(shù)據(jù)的第0字節(jié)命令碼(即偏移值)返回值 到的數(shù)據(jù);<0,失頭文頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32 onststructi2c_client*client,u8command,u16功能描述:從I2C設(shè)備指定偏移處寫入一個word數(shù)據(jù)(兩個字節(jié))參數(shù)說明:client,指向當(dāng)前的I2C從設(shè)備,command,I2C協(xié)議數(shù)據(jù)的第0字節(jié)命令碼(即偏移值),value,要寫入的數(shù)值返回值:0,成功;<0,失敗頭頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32 onststructi2c_client*client,u8command,u8功能描述:從I2C設(shè)備指定偏移 一塊數(shù)據(jù) 返回值:>0, i2c_smbus_write_block_data()頭頭文 :i2c-源碼位置:i2c-函數(shù)原型:s32 onststructi2c_client*client,u8command,u8length,constu8功能描述:從I2C設(shè)備指定偏移處寫入一塊數(shù)據(jù)(長度最大32字節(jié))參數(shù)說明:client,指向當(dāng)前的I2C從設(shè)備;command,I2C協(xié)議數(shù)據(jù)的第0字節(jié)命令碼(即偏移值);lengh,要寫入的數(shù)據(jù)長度;values,要寫入的數(shù)據(jù)返回值:0,成功;<0,失敗i2c用戶態(tài)調(diào)用接i2c的操作在內(nèi)核中是當(dāng)做字符設(shè)備來操作的,可以通過利用文件讀寫接口(open,write,read,ioctrl)等操作內(nèi)核中的/dev/i2c-*文件來條用相關(guān)的接口,i2c相關(guān)的操作定義在i2c-dev.c里面,函函數(shù)原型:staticinti2cdev_open(structinode*inode,structfile功能描述:程序(C語言等)使用open(file)時調(diào)用的函數(shù)。打開一個i2c設(shè)備,可以像文件讀寫的方式往i2c設(shè)備中讀寫數(shù)據(jù)參數(shù)說明:inode:inode節(jié)點;file:file結(jié)構(gòu)體返回值:文件描述函函數(shù)原型:staticssize_ti2cdev_read(structfile*filecharuser*bufsize_tcount,loff_t功能描述:程序(C語言等)調(diào)用read()時調(diào)用的函數(shù)。像往文件里面讀數(shù)據(jù)一樣從i2c設(shè)備中讀數(shù)據(jù)。底層調(diào)用i2c_xfer傳輸數(shù)據(jù)參數(shù)說明:file,file結(jié)構(gòu)體;buf,寫數(shù)據(jù)buf;ofset,文件偏移。返回值:成功返 的字節(jié)數(shù),失敗返回負(fù).3函數(shù)原型:staticssize_ti2cdev_write(structfile*fileconstcharuser*buf,size_tcountloff_t功能描述:程序(C語言等)調(diào)用write()時調(diào)用的函數(shù)。像往文件里面寫數(shù)據(jù)一樣往i2c設(shè)備中寫數(shù)據(jù)。底層調(diào)用i2c_xfer傳輸數(shù)據(jù)參數(shù)說明:file,file結(jié)構(gòu)體;buf,讀數(shù)據(jù)buf;ofset,文件偏移。返回值:成功返回0,失敗返回負(fù)3.2.4函數(shù)函數(shù)原型:staticlongi2cdev_ioctl(structfile*file,unsignedintcmd,unsignedlong功能描述:程序(C語言等)調(diào)用ioctl()時調(diào)用的函數(shù)。像對文件管理i/o一樣對i2c設(shè)備管理。該功能比較強大,可以修改i2c設(shè)備的地址,往i2設(shè)備里面讀寫數(shù)據(jù),使用smbus等等,詳細(xì)的可以查閱該函數(shù)。參數(shù)說明:fe,femdrg,失敗返回負(fù)數(shù)模塊使用范下面是一個EEPROM的I2C設(shè)備驅(qū)動,該設(shè)備只為了驗證I2C總線驅(qū)動,所以其中通過#define #define .attr={.name=#_name,.mode=0444},.show= }structi2c_clientstaticconststructi2c_device_idat24_ids[]={"24c16",0{/*ENDOFLIST*/MODULE_DEVICE_TABLE(i2c,staticint har*rxdata,int{intstructi2c_msgmsgs[]={.addr=this_client-.flags=.len=.buf={.addr=this_client-.flags=.len=.buf=ret=i2c_transfer(this_client->adapter,msgs,if(ret<pr_info("%si2creadeepromerror:%d\n",func,return}staticint har*txdata,int{intstructi2c_msgmsg[]={.addr=this_client-.flags=.len=.buf=ret=i2c_transfer(this_client->adapter,msg,if(ret<pr_err("%si2cwriteeepromerror:%d\n",func,return}staticssize_tread_show(structkobject*kobj,structkobj_attributechar{intu8rxdata[4]?rxdata[0]=0x1?eeprom_i2c_rxdata(rxdata,printk("rxdata[%d]:0x%x\n",i,}char{intstaticu8txdata[4]={0x1,0xAA,0xBB,printk("txdata[%d]:0x%x\n",i,txdata[i])?}staticstructkobj_attributeread=staticstructkobj_attributewrite=staticconststructattribute*test_attrs[]{&read.attr,staticintat24_probe(structi2c_client*client,conststructi2c_device_id{intthis_client=client?err=sysfs_create_files(&client->dev.kobj,test_attrs)?printk("2..at24_probe\n")?printk("sysfs_create_files}printk("3..at24_probereturn}staticintat24_remove(structi2c_client{return}staticstructi2c_driverat24_driver=.driver=.name=.owner=.probe=.remove=.id_table=staticintinit{printk("%s%d\n",func LINEreturn}staticvoidexit{printkprintk("%s()%d-\n",func,LINE}i2cdevicesinterfaceI2C /dev/i2c-*來讀寫i2cdevicesinterfaceI2C /dev/i2c-*來讀寫i2c設(shè)備#include<sys/ioctl.h>#include<fcntl.h>#include<linux/i2c-dev.h>#include<linux/i2c.h>#defineCHIP"/dev/i2c-1"intmain(){unsignedcharunsignedcharrdaddr[2]={0,0}?/*將要 中的偏移量*/unsignedcharwrbuf[3]={0,0,0x3c}?/*要寫的數(shù)據(jù),頭兩字節(jié)為偏移量*/ o,thisisi2ctester\n")?intfd=open(CHIP,if(fd<{printf("opengoto}if(ioctl(fd,I2C_SLAVE_FORCE,CHIP_ADDR)<{/*設(shè) 地址printf("oictl:setslaveaddressgoto}printf("inputacharyouwanttowritetoE2PROM\n")?wrbuf[2]=getchar()?printf("writereturn:%d,writedata:%x\n",write(fd,wrbuf,3),printf("writeaddressreturn:%d\n",write(fd,rdaddr,2))?/*printf("readdatareturn:%d\n",read(fd,&rddata,1))?printf("rddata:%c\n",rddata)?return之前首先設(shè)的偏移量}}調(diào)試節(jié)此節(jié)點文件的功能是打開某個TWI 通道通信過程的調(diào)試信息。缺省值是-1,不會打印任何通道的打開通道x通信過程調(diào)試信息的方法 echoechox>關(guān)閉通信過程調(diào)試信息的方法:echoecho-1>此節(jié)點此節(jié)點文件可以打印出當(dāng)前TWI通道的一些硬件資源信cat此節(jié)點文件可以打印出當(dāng)前 通道的一些運行狀態(tài)信息,包括控制器的各寄存器值catcat調(diào)試工i2c-tools是一個開源工具,專門用來調(diào)I2C設(shè)備。可以i2c-tools來獲i2c設(shè)備的相關(guān)信息(默認(rèn)集成在內(nèi)核里面i2c設(shè)備的數(shù)據(jù)。i2c-tools主要是通過讀寫/dev/i2c-*文件獲I2C設(shè)備,所以需要kernel/linux-4.9的configI2Cdeviceinterface節(jié)點打開,具體的i2c-tools使用方法如下i2cdetecti2cdetect-l//獲取i2c設(shè)備信i2cget-yi2cset-umberi2c-reg//把相關(guān)的i2c設(shè)備數(shù)據(jù)dump出來,如i2cdumpy1umberi2c-regdata_regei2c設(shè)備某個地址的數(shù)據(jù),如i2cget-y10x50umberi2c-regdata_regedata//往i2c設(shè)備某個地址寫數(shù)據(jù),如i2cset-y10x501常見問TWI數(shù)據(jù)未完全發(fā) 問題現(xiàn)象 pletexfer。具體的log如下所示[[1658.926643]sunxi_i2c_do_xfer()1936-[1658.926643]sunxi_i2c_do_xfer()1936-pletexfer(status:0x20,devaddr:pletexfer(status:0x48,devaddr:問題分析:此錯誤表示主控已經(jīng)發(fā)送了數(shù)據(jù)(status0x20時,表示發(fā)SLAVEADDR+READ備無響應(yīng),應(yīng)該檢查是否未接設(shè)備、接觸不良、設(shè)備損壞和上電時序不正確導(dǎo)致的設(shè)備未就緒等問題。問題排查步驟1:通過設(shè)備樹里面的配置信息,核對引腳配置是否正確。每組TWI2:更換TWI總線下的設(shè)備為at24c16,用i2ctools讀寫at24c16看看是否成功,成功則表明步驟3:排查設(shè)備是否可以正常工作以及設(shè)備與I2C步驟4:詳細(xì)了解當(dāng)前需要操作的設(shè)備的初始化方法,工作時序,使用方法,排查因初始化設(shè)備不步驟5:用示波器檢查TWI引腳輸出波形,查看波形是TWI起始信號無法發(fā) 問題現(xiàn)象:STARTcan’dout!。具體的log如下所示sunxi_i2c_do_xfersunxi_i2c_do_xfer()1865-[i2c1]START TWITWI總線的引腳配置以及時鐘配置有問題排查?步驟1:重新啟動內(nèi)核,通過查看log,分析TWI是否成功初始化,如若存在引腳配置問題,應(yīng)核?2TWI-SCKTWI-SDA3.3v電壓3SDASCL3.3V附近(TWI控制器所有;步驟4:核查引腳配置以及clk5:測PINPIN功能直接設(shè)INPUTys/class/unxi_dump/write狀態(tài)(echo[reg,reg]>/sys/class/sunxi_dump/dump?catdump),看是否匹配。6:測CLKTWI的CLKgating等打開(echo/y/clas/sunxi_dump/write據(jù)(echo[reg],[len]>/sys/class/sunxi_dump/dump),查看寄存器數(shù)據(jù)是否正常。TWI問題現(xiàn)象:STOPcan’dout。具體的log如下所示twi_stop()511-[twi_stop()511-[i2c4]STOPcan' sunxi_i2c_core_process()1726-[i2c4]STOPfailed!問題分析:此錯誤表示TWI無法發(fā)送終止信號,一般跟TWI總線的引腳配置。應(yīng)該檢查引腳配問題排查1TWI-SCKTWI-SDA3.3v電壓步驟2:用萬用表量SDA與SCL初始電壓,看電壓是否在3.3V附近(斷開此TWI控制器所有;3:測PINPIN功能直接設(shè)INPUTys/class/unxi_dump/write狀態(tài)(echo[reg,reg]>/sys/class/sunxi_dump/dump?catd

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論