




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Linux TAPI的實(shí)現(xiàn)作者:韓大衛(wèi)吉林師范大學(xué)驅(qū)動(dòng)工程師工作內(nèi)容之一就是向上層應(yīng)用端提供API,這個(gè)API完成并封裝了全部的與硬件芯片的I/O操作。本問簡單的說明了一個(gè)實(shí)現(xiàn)API函數(shù)的全部過程。總體上看分為:1, 用戶API2, 用戶中間層(與底層通信)3, 底層中間層(尋找對(duì)應(yīng)的驅(qū)動(dòng)函數(shù))4, 驅(qū)動(dòng)函數(shù)5, CPU 讀寫 I/O端口。我們主要的工作就是這個(gè)驅(qū)動(dòng)部分這個(gè)驅(qū)動(dòng)函數(shù)功能是:將數(shù)據(jù)包裝成kernel中可操作的結(jié)構(gòu)體,按既有的通信方式發(fā)送給CPU,這種通信方式就是通過總線了。可以是I2C等等。最后,CPU返回執(zhí)行結(jié)構(gòu),驅(qū)動(dòng)函數(shù)再返回給用戶層。再將這些API包裝成庫,這樣,用戶層的程
2、序就可以直接引用了。下面的API功能是是:統(tǒng)計(jì)交換芯片的接口速率。TesVmain.c是一個(gè)測試程序,API和API的底層驅(qū)動(dòng)的實(shí)現(xiàn)文件和頭文件都在下面的代碼中,另外,用戶層與底層之間的通信,使用的是socket ,這是相比與共享內(nèi)存等最合適最高效的方式。路徑如下:用戶層A P I中間層(socket) -|驅(qū)動(dòng)中間層(socket)(驅(qū)動(dòng)函數(shù))這不是完整的程序,只是程序中的骨干部分。如果需要全部的程序,請(qǐng)聯(lián)系作者h(yuǎn)andawei* *轉(zhuǎn)載請(qǐng)務(wù)必表明岀處。* *在 test/main.c 中:#include inc/jas.h#include vjas_sw_cmd_apih#include
3、 vjascrrij_clilpih#include 在 inc/cmd_api/j8s_sw_cmd_api.h 中:int jas sw intf cntr rate cal(int dev id, int intf id, jas intf eth rate t *cntr);這就是用戶層使用的A PI/libjascmd/jas_cmd_cli_apih 中:int jas_cmd_cli_dpi_send_msg(struct jas_cmd_api_cmd_msg tmsg);int jas_cmd_cli_api_ecv_msg(void *data, uint32_t size
4、);在 Main.c 中的 jas swjntf cntr rate cal ()定義在: jas_api/switch/sw_cmd_api.c 中:int jas sw intf cntr rate cal(int dev id, int intf id, jas intf eth rate t +data) int ret = JASSUCCESS;一一 - 一if(data = NULL) return JASNV_ARG;ret = jas cmd sw api intf cntr rate cal(dev id, intf id, data); if (ret v 0)return
5、 ret;return ret; j a s_c m d_s w_a p i_i n tf_c n tr_ra te c a I這個(gè)函數(shù)是一個(gè)中間層,介于用戶層和驅(qū)動(dòng)層之間,它的聲明是在:libjascmd/jas_cmd_sw_8pih 中:int jas_cmd_sw_apintf_cntr_rate_cal(uint83 devjd, uint8_t intfjd, jasjntf_eth_rate_t *jas_cntr _data);定義是在 ibj8scmd/jas_cmd_sw_api.c 中:int jas cmd sw apintf cntr_rate caI(uint8_t
6、 dev id, uint8_t intfjd, jas intf eth rate t *jas_cntr _data)一 int ret = JAS_SUCCESS;struct jas_cmd_api_cmd_msg msg;msg.devjd = devjd;fjd = intfjd;msg.cmd = SWMTF_CNTR_RATE_CAL;msg.devtype = JASjCMDSWITCH;ret = jas cmd cli api send msg(msg);if (ret v 0) 一 一 一 一return JAS_SET_ERROR;ret = jas_c
7、md_cli_api_ecv_msg(jds_cntr data. (uint32_t)sizeof(jasntf eth rate t);if (ret socket7,Connected!,l 10); return JASSUCCESS; if(length != sizeof(struct jas_cmd_api_cmd_msg) | (strncmp(bufff ”#: 8) != 0) sys_err(M%sr %df Get Error Buffer: %sf length: %d(%d)nl,f _func_f _LINE_, buff, length, sizeof(stru
8、ctjds_cmd_api_cmd_msg);return JASFAILURE; jas cmd cli servun_cmd(streamPf buff);return 0;進(jìn)入 jascmdcliservruncmdint jds_cmd_cli_serv_run_cmd(cmdStredmPTR streamP, char *buff) struct jas cmd api cmd rnsg cmsg;struct jascmdclijmsg msg; socketStreamPTR stream = (socketStreamPTR)streamP;memcpy(&cmsgr buf
9、f, sizeof(cmsg);memset(&msg, 0, sizeof(struct jas cmd cli msg); memcpy(msg.flag, # 8);msg. ret = JASSUCCESS;msg.len = sizeof(struct jas cmd clijnsg) - 8;switch(cmsg.devjype)case JAS_CMD_FRAMER:as_cmd_api_run_fim_cmd(cmsg, &msg);break;case JAS_CMD_SWITCH:Jas cmd api run_sw cmd(cmsg, &msg);break;defau
10、lt:sys_err(H%sr %df Unknow Dev Type, buff: %s, cmsg.cmd: %d. cmsg.devjd: %d.rY: _func_f _LINE_# buff, cmsg.cmd, cmsg.devjd);break;write(stream-socketF &msg, sizeof(struct jas cmd cli msg); return 0;這樣就清楚了.通過msg中的變量類型.逬入_jas_cmd_api_rwrm_cmd(cmsg, &msg);或者_(dá)Jas_cmd_api_run_sw_cmd(cmsg, &msg);處理 msg,最后
11、將處理后的 msg 通過 write(stream-socket, &msg, sizeof(struct jas_cmd_cli_msg) 發(fā)送出去.這樣就實(shí)現(xiàn)了用中間層的通信。進(jìn)入 static int _ as_cmd_api_un_sw_cmd ()看一下.static int _jas_cmd_api_run_sw_cmd(struct jas_cmd_8pi_cmd_msg cmsg, struct jas_cmd_cli_ms g *msg) -switch(cmsg.cmd)case SW_HW_REG_SET:- 一 一jas reg t *preg = (jas reg t
12、 *)cmsg.data;msg-ret = jas_sw_drvjiw_reg_set(cmsg.devd. preg-regaddrf preg-value); 一一 - -break;case SWNTF_CNTR_RATE_CAL: 一 一 一 jasjntf eth cntr t *cntr;cntr = (jasjntf eth cntr t *)msgdata;msg= jas_sw_drvntf cntrratecaKcmsg.devd. f_id, cntr); 一 break;return 0; 這個(gè)jas_sw_drvJntf_cntr_rate caI
13、()就是驅(qū)動(dòng)層的相應(yīng)功能實(shí)現(xiàn)函數(shù)。 j a s_s w_d rv J n tf_c n t r_ra tec a I ()的定于是在:libsw/sw_drv_apicint jas_sw_drvn tfc n t r_ra tec a I (u i nt8_t devjd, uint8J intfjd, jasn tfethratet *jas_cntr_dat a) _jas intf eth cntr t sw status in fol;jasjntf eth cntr t sw_statusjnfo2;int32_t result;一uint64_t *data;time t Itj
14、tl,lt2;struct tm* ptrl;struct tm* ptr2;memset(&sw_st3tus_infol, 0, sizeof(sw_statusnfol);memset(&sw_status_info2, 0, sizeof(sw statusjnfo2);jas sw drvntf cntr_clear_on_read_set(devjdf intf id, JAS FALSE);jasswdrvintfcntrget(dev Tdf intf id, &sW status infolj?Itl: tirne(NULL); -_sleep(l);jas sw drv i
15、ntf cntr clear on read set(dev idjntf id, JAS FALSE);jas sw drv intf cntr get(dev id, intf id, &sw status info2);It2: tirne(NULL); It = It2 - Itl;ptrl = localtime(<l);ptr2 = localtime(<2);result = device_port_rate_cal(sw_statusjnfo2.good_pkts.rx * 8fsw statusJnfo 1.goodpkts.rx * 8,& (jascntrjjat
16、a-good_pkts.rx)rIt);-result = device_port_rate_cal(sw_statusnfo2.good_pktstx * 8, sw_statusjnfol.good_pkts.tx * 8,& (jas_c ntr_datago6j_pktstx).It); result = device_port_rate_cal(sw_statusjnfo2.good_bytes.rx 8, swstatusjnfol.goodjbytes.rx * & (jas_cntrjjata-good_bytes.rx),It);-result = device_port_r
17、ate_cal(sw_statusjnfo2.good_bytes.tx * 8rsw statusjnfol.good_bytes.tx 8,& (jas_cntrjjata-good_bytes.tx)fIt); return 0;現(xiàn)在有一個(gè)問題:j a s_s w_d rv J n tf_c n t r_ra tec a I ()只是在swdrvapi.c中有定義.沒有在任何h文件中有聲明那么在 libjascmd/jas_cmd_cli_apic 中的case SWNTF_CNTR_RATE_CAL: jas intf eth cntr t *cntr;cntr = (jasjintf
18、 eth cntr t *)msg-data;msg-ret = jasswdrvjiitf cntr rate calCcmsg.devjd, cmsgntfjd, cntr); 一 一一一 一 一 一 一 break;jas_sw_drvntf_cntT_rate_cal ()的聲明是在在 inc/cmd_api/jas_sw_cmd_apih 中#include vjes_sw_cmd_apih 進(jìn)而使用了這個(gè)函數(shù)。這樣就完成了A PI的實(shí)現(xiàn)路徑如下:用戶層API中間層(socket)| 驅(qū)動(dòng)中間層(socket)(驅(qū)動(dòng)函數(shù)) 詳細(xì)說明如下:用戶層A PI :jas sw intf cn
19、tr rate cal ()API 的聲明(頭文件): inc/cmd_api/jas_sw_cmd_api.h int jas sw intf cntr rate cal(int dev id, int intf id, jas intf eth rate t *cntr);API的定義(實(shí)現(xiàn)):jas_api/switch/sw_cmd_api.cint jas sw intf cntr rate cal(int dev id, int intf id, jas intf eth rate t *data) int ret = JASSUCCESS;一一 一一一 一if(data = NU
20、LL)return JASN VARG;ret = jas cmd sw api intf cntr rate cal(dev idf intf idf data); if (ret 0)return ret;return ret; 用戶中間層的函數(shù):jas_cmd_sw_api_intf_cntr_ate_cal ()聲明(頭文件):libjascmd/jas cmd sw api.h定義:libjascmd/jascmdswapi.c int jas_cmd_sw_8pi_intf_cntr_rate_cdl(uint8_t devjd, uint8_t intfjd, jasjntf e
21、th rate t *jas_cntr _data)一 int ret = JAS_SUCCESS;struct jas_cmd_apLcmd_msg msg;msg.devjd = devjd;fjd = intfjd;msg.cmd = SWMtF_CNTR_RATE_CAL;msg.dev_type = JASjCMD_SWITCH;ret = jas cmd cli api send msg(msg);if (ret v 0) 一 一 一 一return JAS_SET_ERROR; ret = jas_cmd_cli_api_ecv_msg(jas_cntr data.
22、 (ulnt32_t)sizeof(jasjntf_eth_rate_t); if (ret data;msg-ret = jas sw drvJntf cntr rate caKcmsg.devjd, fjd, cntr); 一一 一一一 一 一 一 break;驅(qū)動(dòng)函數(shù):jas_sw_drv_intf_cntr_rate_cal ()聲明: inc/drv/sw_drv_api.h定義: libsw/sw_drv_apic int jasswdrvn tf_c n trra tec a I (u i nt8_t devjd, uin t8J intfjd, jasintfe
23、thratet *jas_c ntrdat a)jas intf eth cntr t sw status infol;jasjntf eth cntr t swstatusJnfo2; int32_t result;uint64J *data;struct tm* ptrl;struct tm* ptr2;memset(&sw_statusnfol, 0, sizeof(sw_statusnfol);memset(&sw_status_info2. 0, sizeof(sw_statusnfo2);jas_sw_drv_intf_cntr_clear_on_read_set(dev_ict
24、intf id. JAS FALSE); jassw drvintfcntrget(dev Tdf intf id, &sw status infol)?Itl: time(NULL); 一一 一 一 一* *2012.7.3014:00遇到一個(gè)錯(cuò)誤:jascmd/jascmdcliapi.clibjascmd/jas cmd cli api.c: In function l_jas_cmd_api_runJ2c_cmd,: libjascmd/jas_cmd_cli_api.c:335: error: I2CTF2C_TMP_GET undeclared (first use in this
25、 fun ction)libjascmd/jas_cmd_cli_api.c:335: error: (Each undeclared identifier is reported only once libjascmd/jas_cmd_cli_api.c:335: error: for each function it appears in.)在jascmd/jas cmd cli api.c 中明明有:#include jascmdic api.h在 jascmd/jas_cmd2c_api.h 也有typedef enum I2CJNTF2C_TMP_GET = 0,I2CJNTFJ2C
26、ZRTCZGELI2CJNTF I2CEEPROM GET,I2CJNTFJ2C2SW_XFPJ3ET,12 CJ NTFJ2 CS WS F PG E j a s_c m dp i_c m d_ty pet;但為什么說沒有定義呢?結(jié)果是:# if def _|AS_CMD2C_API_H應(yīng)改為:#ifndef JAS CMD I2C API H下午17: 00./libjascmd.so: undefined reference to、jas_i2c_drv_intf_i2c_tmp_get ./libjascmd.so: undefined reference to xjasJ2c drv
27、JntfJ2c_sw_xfp get ./libjascmd.so: undefined reference to jas2c_dn/Jntf iZc sw sfp get1./libjascmd.so: undefined reference to sjasJ2cdrvJntfJ2crtcget7 ./libjascmd.so: undefined reference to xjasJ2c_drvJntfJ2c_eeprom_get,在Makefile也添加了 Iibi2c的信息. 為什么還是找不到? 原來是在test中的Makefile沒有添加Ii2c*int jas_cmd_frm_ap
28、ijntf_status_get(int devjdf int inttjdf jas frmntf_status_t *status) int ret = JASSUCCESS; 一一struct jas cmd api cmdjnsg msg;JAS_NULL_PTR_CHECK(status);msg.devid = devjd;fjd = intfjd;msg.cmd = FRMNTF_STATUS_GET; msg.devtype =j ASC M D_F RAM ER;ret = jas_cmd_cli_api_sen d_msg(msg);if (ret 0) re
29、turn JAS_SET_ERROR; ret = jas cmd cli api recv msg(statusf (uint32 t)sizeof(jas frm intf status t); if (ret id-sockfd)sys_err(Hsocket %d break off.rT; ghandlectrl-id-sockfd); close(ghandlectrl-id-sockfd);ghandlectrl-ld-sockfd = 0;iff_reconnect(ctrl-id) != 0) sys_err(MFailed to reconnect server.nH);
30、return JAS_SOCK_ERROR;return write(ctrl-sockfdr &cmsg. sizeof(struct jas_cmd_api_cmd_msg); strcut jas cmd cli api handle_t 的定義是: typedef struct jas cmd api handleint id;int sockfd;char 水ip addr;uint32_t port;jas_cmd_cli_api_handle_t;_sock_check()定義如下:static int _sock_check(int sockfd) fd set fds;inf
31、ret;struct timeval tv sei;if(sockfd = 0)sys_err(%sr %df error, %s.nr _tunc_f _LINE_SOCK FD is 0); return JAS_FAILURE;tv_seltv_sec = 0;tvsel.tvusec = 0;ret = select(sockfd + 19 &fds. NULL, NULLf &tv sel);if (ret != 0)一if (ret v 0)sys err(%sf %dr error, %s.n func , LINE r strerror(errno); /*else lf(FD
32、JSSET(sockfd, &fds) len = read(sockfd, buf, 100); if(len = 0) sys_err(Msockfd %d break off.nr sockfd); return -1; sysjnfo(_sock check buff: %snuf buf); 一 一*/return 0;ret = select(sockfd + lf &fds, NULL, NULL, &tv_sel);sockfd +1 :是指集合中所有文件描述符的范圍,即所有文件描述符的最大值加1.fds是一個(gè)文件描述符的集合,監(jiān)視這些文件描述符的讀變化的第一個(gè)NULL表示不關(guān)
33、心任何文件的寫變化第二個(gè)NULL表示不用監(jiān)視文件錯(cuò)誤異常。時(shí)間值為0秒0毫秒.即將selectO函數(shù)設(shè)置成一個(gè)純粹的非阻塞函數(shù),不管文件描述符是否有變化.都立 刻返回繼續(xù)執(zhí)行.文件無變化返回0.有變化返回一個(gè)正值;* *return write(ctrl-sockfd, &cmsg. sizeof(struct jas cmd_api_cmd_msg); 向 ctr- sockfd 發(fā)送 cmsg,大小為 sizeof(struct jas cmd apicmdjnsg);* *jas_cmd_cli_api_recv_msg()函數(shù)定義是: int jas_cmd_cli_api_recv_
34、msg(void *data, uint32_t size)jas_cmd_cli_apijiandle_t *ctrl = (jas cmd cli api handle t *)handle; struct jas cmd cli msg *msg = NULL;int len = CMDjMAX_MSG;int i, readjen, mlen=0;struct timeval timeout;JAS NULL PTR CHECK(handle);timeout tvsec = 900; timeout.tvusec = 0; mien = len;readjen = _sock_rea
35、d_data(ctrl-sockfd, buf rd, &timeout, &mien);if(read_len len)sys err(H%sr %df Read buffer error: “s. len %d(%ld).nMf func , LINE f buf rd, rea djen. len);一 return JAS_FAILURE;/get the right msg length*/sys_debug(%sf %d# read buffer: ”sS len %d(%ld).n,/ _func_, _LINE_f buf rd, readjen, len); 一_for(i = 0; i len. msg-ret);if(m
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際合作與市場拓展-全面剖析
- 智能紡織品研發(fā)趨勢-全面剖析
- 智能家電的發(fā)展趨勢-全面剖析
- 智能紡織生產(chǎn)管理系統(tǒng)-全面剖析
- 創(chuàng)新創(chuàng)業(yè)金融支持體系-全面剖析
- 智能化視聽設(shè)備研發(fā)-全面剖析
- 智能織物在傷口護(hù)理和康復(fù)中的作用-全面剖析
- 聲音交互界面設(shè)計(jì)-全面剖析
- 3D打印技術(shù)在牙槽突炎治療中的應(yīng)用-全面剖析
- 智能家居中的隱私保護(hù)策略-全面剖析
- 2025年浙江寧波奉化區(qū)農(nóng)商發(fā)展集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 2025年《宏觀經(jīng)濟(jì)政策與發(fā)展規(guī)劃》核心備考題庫(含典型題、重點(diǎn)題)
- 【百強(qiáng)校】【黑吉遼卷】黑龍江省哈爾濱市第三中學(xué)2025年高三學(xué)年第一次模擬考試(哈三中一模)語文試卷
- 2025年高考物理一輪總復(fù)習(xí):牛頓運(yùn)動(dòng)定律(原卷版)
- 全國計(jì)算機(jī)等級(jí)考試一級(jí)試題及答案(5套)
- 公司安全事故隱患內(nèi)部舉報(bào)、報(bào)告獎(jiǎng)勵(lì)制度
- 外周灌注指數(shù)PI
- 《光伏發(fā)電工程預(yù)可行性研究報(bào)告編制規(guī)程》(NB/T32044-2018)中文版
- 小學(xué)生競選班干部ppt
- 公務(wù)員事業(yè)單位考試寫作練習(xí)紙
- 建筑施工現(xiàn)場總平面布置圖
評(píng)論
0/150
提交評(píng)論