Linux驅(qū)動(dòng)之i2c用戶態(tài)調(diào)用_第1頁
Linux驅(qū)動(dòng)之i2c用戶態(tài)調(diào)用_第2頁
Linux驅(qū)動(dòng)之i2c用戶態(tài)調(diào)用_第3頁
Linux驅(qū)動(dòng)之i2c用戶態(tài)調(diào)用_第4頁
Linux驅(qū)動(dòng)之i2c用戶態(tài)調(diào)用_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一、概述I2C只有兩條線,一條串行數(shù)據(jù)線:SDA,一條是時(shí)鐘線SCL.正因?yàn)檫@樣,它方便了工程人員的布線.二、用戶態(tài)實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)在Linux內(nèi)核代碼文件i2c-dev.c中實(shí)現(xiàn)了I2C適配器設(shè)備文件的功能,針對(duì)每個(gè)適配器生成一個(gè)主設(shè)備號(hào)為89的設(shè)備節(jié)點(diǎn)(次設(shè)備號(hào)為0-255),I2c-dev.c并沒有針對(duì)特定的設(shè)備而設(shè)計(jì),只是提供了通用的read(),write(),和ioctl()等文件操作接口,在用戶空間的應(yīng)用層就可以借用這些接口訪問掛接在適配器上的I2C設(shè)備的存儲(chǔ)空間或寄存器,并控制I2C設(shè)備的工作方式。i2c適配器的設(shè)備節(jié)點(diǎn)是/dev/i2c-x,其中x是數(shù)字。由于適配器編號(hào)是動(dòng)態(tài)分配

2、的(和注冊(cè)次序有關(guān)),所以想了解哪一個(gè)適配器對(duì)應(yīng)什么編號(hào),可以查看/sys/class/i2c-dev/目錄下的文件內(nèi)容。三、用戶態(tài)調(diào)用i2c-dev用戶空間操作i2c,需要包含以下頭文件。#include#include打開適配器對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)inti2c_open()(fd=open(H/dev/i2c-1,O_RDWR);if(fdadapter;/獲取adapter信息structi2c_msgmsg;/定義一個(gè)臨時(shí)的數(shù)據(jù)包intret;msg.addr=client-addr;/將從機(jī)地址寫入數(shù)據(jù)包msg.flags=client-flags&I2C_M_TEN;/將從機(jī)標(biāo)志并入數(shù)據(jù)

3、包msg.flags|=I2C_M_RD;/將此次通信的標(biāo)志并入數(shù)據(jù)包msg.len=count;/將此次接收的數(shù)據(jù)字節(jié)數(shù)寫入數(shù)據(jù)包msg.buf=buf;ret=i2c_transfer(adap,&msg,1);/調(diào)用平臺(tái)接口接收數(shù)據(jù)/*Ifeverythingwentok(i.e.1msgtransmitted),return#bytestransmitted,elseerrorcode.*/return(ret=1)?count:ret;/如果接收成功就返回字節(jié)數(shù)EXPORT_SYMBOL(i2c_master_recv);參考驅(qū)動(dòng)i2c_master_recv()函數(shù)封裝屬于自己用戶

4、態(tài)的接受函數(shù)。用戶態(tài)是通過ioctl(handle-fd,I2C_RDWR,&data)函數(shù)與i2c從設(shè)備進(jìn)行數(shù)據(jù)交互。主要有2個(gè)步驟:首先是寫入需要讀取的寄存器的地址,然后從寄存器中讀取數(shù)據(jù)。需要2個(gè)數(shù)據(jù)包。如下:inti2c_readCintunsignedcharaddr,unsignedcharegunsignedchar*val)intret;structi2c_dw_t0i:tl_d+tadata;structt2c_Fsgmessages2;messagesmessagesmessagesnessogesmessagesmessagesmessagesMessages1111ad

5、dr=messagesmessagesmessagesnessogesmessagesmessagesmessagesMessages1111flags-*/writeflags*len=sizeof(reg5ibuf=/registeraddress.addr=add;/device己dd電匕主.flags=I2C_M_RD;/readflags,len=sV2eof(val);.buf=vali/recivedatadatm,msgs=messages;data,nnsgs=2;IZCRONR,adapter;/獲取adapter信息structi2c_msgmsg;/定義一個(gè)臨時(shí)的數(shù)據(jù)包

6、msg.addr=client-addr;/將從機(jī)地址寫入數(shù)據(jù)包msg.flags=client-flags&I2C_M_TEN;/將從機(jī)標(biāo)志并入數(shù)據(jù)包msg.len=count;/將此次發(fā)送的數(shù)據(jù)字節(jié)數(shù)寫入數(shù)據(jù)包msg.buf=(char*)buf;/將發(fā)送數(shù)據(jù)寫入數(shù)據(jù)包ret=i2c_transfer(adap,&msg,1);/調(diào)用平臺(tái)接口發(fā)送數(shù)據(jù)/*Ifeverythingwentok(i.e.1msgtransmitted),return#bytestransmitted,elseerrorcode.*/return(ret=1)?count:ret;/如果發(fā)送成功就返回字節(jié)數(shù)EXP

7、ORT_SYMBOL(i2c_master_send);參考驅(qū)動(dòng)i2c_master_send()函數(shù)封裝屬于自己用戶態(tài)的接受函數(shù)。用戶態(tài)是通過ioctl(handle-fd,I2C_RDWR,&data)函數(shù)與i2c從設(shè)備進(jìn)行數(shù)據(jù)交互。每次要寫入兩個(gè)字節(jié)數(shù)據(jù)主要包括寫入的寄存器地址和要寫入的數(shù)據(jù)。只需發(fā)送一次數(shù)據(jù)包。如下:inttiewrite(intfd.unsignedchardevaddunsignedcharregadd.unsignedcharvmL)(intret;unsignedcharbuf2;structrdirtQctldatadata;structi2c._nsgmes

8、sages;buf0=r&g_addr;/registerdatabuf|1=val;/senddatamessages.addr-dev_addr;/deviceaddressmessages.flags=0;/writeflagsmessages.len=2;messages.buf=buf;data.msgs=Kmessages;ddta.nnsgs=1;if(toctl(fdfIZC_RDWRj&data)0)printf(rwriteioctlerrffi11);return1;)usleepf1600);看#include#include#include#include#inclu

9、de#includetLln1;#include#include#include#include#include#include使用案例#include#include#include#defineI2C_FILE_NAME/dev/i2c-1#defineI2C_ADDR0 x40intfd;inti2c_open()fd=open(I2C_FILE_NAME,O_RDWR);if(fd0)perror(Unabletoopeni2ccontrolfile);return1;TOC o 1-5 h zinti2c_write(intfd,unsignedchardev_addr,unsign

10、edcharreg_addr,unsignedcharval)intret;unsignedcharbuf2;structi2c_rdwr_ioctl_datadata;structi2c_msgmessages;buf0=reg_addr;buf1=val;messages.addr=dev_addr;/deviceaddressmessages.flags=0;/writemessages.len=2;messages.buf=buf;/dataaddressdata.msgs=&messages;data.nmsgs=1;if(ioctl(fd,I2C_RDWR,&data)0)prin

11、tf(writeioctlerrn);return1;usleep(1000);return1;inti2c_read(intfd,unsignedcharaddr,unsignedcharreg,unsignedchar*val)一intret;structi2c_rdwr_ioctl_datadata;structi2c_msgmessages2;messages0.addr=addr;/deviceaddressmessages0.flags=0;/writemessages0.len=sizeof(reg);messages0.buf=/dataaddressmessages1.add

12、r=addr;/deviceaddressmessages1.flags=I2C_M_RD;/readmessages1.len=sizeof(val);messages1.buf=val;data.msgs=messages;data.nmsgs=2;if(ioctl(fd,I2C_RDWR,&data)0)printf(readioctlerrn);return1;return0;intmain()inti;unsignedcharbuf4;unsignedcharval=0 x04,0 x05,0 x06,0 x07;i2c_open();for(i=0;i4;i+)i2c_write(fd,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論