廖建尚
(廣東交通職業(yè)技術學院 計算機工程學院,廣州 510650)
廖建尚
(廣東交通職業(yè)技術學院 計算機工程學院,廣州 510650)
本文分析了I2C的工作原理和Linux的I2C總線驅(qū)動程序,構建了高速公路視頻監(jiān)控系統(tǒng)下基于I2C云臺電機控制系統(tǒng),完成了基于ARM和Linux的I2C驅(qū)動程序、I2C應用程序和云臺電機控制應用程序設計,實現(xiàn)了應用程序控制云臺電機,并應用于高速公路視頻監(jiān)控系統(tǒng)中,達到全方位的高速公路視頻監(jiān)控,具有良好的效果和較高的應用價值。
視頻監(jiān)控;云臺電機;I2C驅(qū)動;Linux
本文研究詳細分析了I2C總線的工作原理、通信協(xié)議和Linux的I2C總線驅(qū)動程序,并設計一個應用在高速公路視頻監(jiān)控中的基于I2C總線的云臺電機驅(qū)動系統(tǒng),為高速公路的全方位視頻監(jiān)控提供一個設計方案。
高速公路高清視頻監(jiān)控系統(tǒng)采用TI公司的TMS320DM368(以下簡稱DM368),DM368是一款面向多媒體技術應用的高性能芯片,功能強大,集成了ARM926EJ-S內(nèi)核、硬件編碼協(xié)處理引擎( HDVICP)、圖像處理子系統(tǒng)( VPSS)。DM368頻率高達 432 MHz,支持多格式解碼、多速率以及高清多通道功能,最高可以支持H.264編碼 1080P格式30 fps的速度,而且還可提供多種獨立式音頻、語音以及高清視頻編解碼器(H.264)。該處理器有I2C總線等外圍接口,其中ARM9可運行開源、性能穩(wěn)定、安全的Linux嵌入式操作系統(tǒng)。[2-3]
視頻監(jiān)控系統(tǒng)中云臺電機控制的設計采用DM368的I2C總線接口,設計基于ARM9的I2C總線云臺電機,完成驅(qū)動程序設計和應用程序設計,以及應用程序控制電機轉動。其應用于視頻監(jiān)控系統(tǒng)中,可達到全方位的高速公路視頻監(jiān)控。
I2C總線是由雙向數(shù)據(jù)線和時鐘線構成的二線制串行總線,總線采用主從雙向通信,即總線上在某一時刻只有一個主設備,總線上的其他設備都作為從設備。任何能夠進行發(fā)送和接收的設備都可以成為主設備,但是在同一時間內(nèi)只能有一個設備作為主設備,通常為微處理器,其他器件作為從設備與主設備進行通信,采用唯一的I2C總線地址識別。[4]
圖1為I2C的工作時序圖。I2C總線在傳送數(shù)據(jù)過程中使用了3種信號:
① 開始信號。SCL為高電平時,SDA由高電平向低電平跳變,表示將要開始傳送數(shù)據(jù)。
② 應答信號。從設備在接收到1個字節(jié)數(shù)據(jù)后向主設備發(fā)出一個低電平脈沖應答信號,表示已收到數(shù)據(jù),主設備根據(jù)從設備的應答信號作出是否繼續(xù)傳輸數(shù)據(jù)的操作(I2C總線每次數(shù)據(jù)傳輸時字節(jié)數(shù)不限制,但是每次發(fā)送都要有一個應答信號)。
③ 結束信號。為低電平時由低電平向高電平跳變,表示數(shù)據(jù)傳送結束。[5-6]
圖1 I2C工作時序
圖2 I2C驅(qū)動架構圖
總線具體的通信工作原理為:主設備首先發(fā)出開始信號,接著發(fā)送1個字節(jié)的數(shù)據(jù),其由高7位地址碼和最低1位方向位組成(方向位表明主設備與從設備間數(shù)據(jù)的傳送方向)。系統(tǒng)中所有從設備將自己的地址與主設備發(fā)送到總線上的地址進行比較,如果從設備地址與總線上的地址相同,該設備就是與主設備進行數(shù)據(jù)傳輸?shù)脑O備。接著進行數(shù)據(jù)傳輸,根據(jù)方向位,主設備接收從設備數(shù)據(jù)或發(fā)送數(shù)據(jù)到從設備。當數(shù)據(jù)傳送完成后,主設備發(fā)出一個停止信號,釋放I2C總線,然后所有從設備等待下一個開始信號的到來。[5-6]
3.1 Linux2.6.32的I2C總線驅(qū)動分析[6-8]
I2C總線驅(qū)動由主設備和從設備構成,通信上通過識別i2C地址進行通信,即可以存在多個i2C_adapter適配器和多個外設i2C_device,Linux的I2C驅(qū)動采用分層設計思想,層與層之間不存在耦合,增加adapter和device不會影響其他驅(qū)動,具體分層如下。
第一層:提供i2C_adapter的硬件驅(qū)動,探測、初始化i2C_adapter(如申請I2C地址和中斷號),驅(qū)動處理器控制的i2C_adapter在硬件上產(chǎn)生信號(start、stop、ack)以及處理I2C總線中斷,涉及到圖2中的硬件實現(xiàn)控制層。
第二層:提供i2C_adapter的算法,用具體適配器的xxx_xfer()函數(shù)來填充i2C_algorithm的master_xfer函數(shù)指針,并把賦值后的i2C_algorithm,再賦值給i2C_adapter的成員指針,主要涉及圖2中的訪問抽象層、I2C核心層。
第三層:實現(xiàn)I2C總線設備驅(qū)動中的i2C_driver接口,用具體的i2C_device設備的i2C_add_driver ()、i2C_del_driver ()方法賦值給i2C_driver的成員函數(shù)指針,采用Probe探尋方式實現(xiàn)設備device與總線的掛接,涉及圖2中的驅(qū)動層,此層是本文實現(xiàn)的驅(qū)動部分。
第四層:實現(xiàn)I2C總線設備所對應的具體device的驅(qū)動,i2C_driver只是實現(xiàn)設備與總線的掛接,掛接在總線上的設備千差萬別,所以要實現(xiàn)具體設備device的write()、 read()、ioctl()等方法,賦值給file_operations,然后注冊字符設備,涉及圖2中的驅(qū)動層,此層是本文實現(xiàn)的驅(qū)動部分。
第一層和第二層又叫I2C總線驅(qū)動(bus driver),第三層和第四層屬于I2C總線設備驅(qū)動(device driver)。在Linux驅(qū)動架構中,不需要再開發(fā)總線驅(qū)動,因為Linux內(nèi)核幾乎集成所有總線驅(qū)動,驅(qū)動設計主要是實現(xiàn)第三層和第四層的設備驅(qū)動。
3.2 云臺電機驅(qū)動設計[8-11]
根據(jù)Linux2.6.32的驅(qū)動分層設計,驅(qū)動的第一層和第二層在Linux-2.6.32中以及集成了成熟驅(qū)動,分別位于Linux源代碼目錄下的driversi2Ci2C-core.c 和driversI2Cussesdavinci.c中,本文重點講述第三層和第四層驅(qū)動程序的設計。
驅(qū)動設計采用字符設備方式來實現(xiàn),motor_I2C_devInit()和motor_I2C_devExit()實現(xiàn)驅(qū)動的初始化以及退出,初始化最后調(diào)用cdev_add()實現(xiàn)字符設備的添加,添加過程中通過完善file_operations的結構體,填充了.open = I2C_devOpen、.release = I2C_devRelease、.ioctl = I2C_devIoctl三個結構體變量。這3個用戶空間接口驅(qū)動函數(shù)完成注冊后,用戶空間可以采用文件讀寫的方式來操作I2C設備,I2C_devOpen函數(shù)實現(xiàn)打開字符設備,I2C_devRelease函數(shù)實現(xiàn)關閉字符設備,I2C_devIoctl是和硬件設備實現(xiàn)數(shù)據(jù)傳輸?shù)闹匾瘮?shù),主要實現(xiàn)設備加載、數(shù)據(jù)讀取和數(shù)據(jù)寫入,從而完成用戶空間和驅(qū)動程序以及硬件設備的數(shù)據(jù)交換,具體實現(xiàn)如圖3所示。
圖3 I2C電機驅(qū)動設計圖
下面通過I2C_devIoctl介紹這3個函數(shù)的實現(xiàn)過程。命令I2C_CMD_SET_DEV_ADDR實現(xiàn)地址設置,I2C_CMD_READ實現(xiàn)數(shù)據(jù)讀取,I2C_CMD_WRITE實現(xiàn)數(shù)據(jù)寫入,最終被分別調(diào)用,其中,I2C_create實現(xiàn)I2C設備加載,I2C_read實現(xiàn)I2C設備數(shù)據(jù)讀取,I2C_write實現(xiàn)I2C設備數(shù)據(jù)寫入。其中I2C_create利用i2c_add_driver調(diào)用i2c_probe,最終調(diào)用i2c_set_clientdata加載I2C從設備,i2c_read和I2C_write利用i2c_transfer函數(shù)調(diào)用master_xfer實現(xiàn)數(shù)據(jù)的讀取和寫入,其中I2C_devIoctl實現(xiàn)部分代碼略——編者注。
根據(jù)I2C驅(qū)動程序設計,要正確調(diào)用驅(qū)動程序,需要實現(xiàn)驅(qū)動的用戶空間調(diào)用函數(shù),主要是實現(xiàn)open和ioctl等調(diào)用函數(shù),因此在應用層的接口函數(shù)中也需要實現(xiàn)此函數(shù)。
i2c_Init()函數(shù)實現(xiàn)open函數(shù),調(diào)用驅(qū)動函數(shù)打開該設備驅(qū)動,定義一個數(shù)據(jù)結構體為:
typedef struct {
unsigned char dataSize;
unsigned char count;
unsigned char *reg;
void *value;
} I2C_Data;
該結構體主要用來實現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)交換,dataSize代表數(shù)據(jù)的大小,value是傳輸?shù)臄?shù)值,reg是傳輸命令參數(shù),函數(shù)I2c_Read8()是向內(nèi)核讀入一個字節(jié)數(shù)據(jù),I2c_Write8()是向內(nèi)核寫入一個字節(jié)數(shù)據(jù),I2c_Read16()是向內(nèi)核寫入2個字節(jié)數(shù)據(jù),I2c_Write16()是向內(nèi)核寫入2個字節(jié)數(shù)據(jù),下面列舉一個函數(shù)說明具體的實現(xiàn)過程:
I2c_Write8(int fd unsigned char *reg, unsigned char *value, unsigned char count){
I2C_Data ptr; unsigned int cmd; int status;
ptr.dataSize = 1;
ptr.reg = reg; ptr.count = count; ptr.value = value;
cmd = CMD_WRITE;
status = ioctl(fd, cmd, & ptr);
if (status !=0)
printf("ioctl I2C_CMD_WRITE error!");
return status;}
函數(shù)最終通過調(diào)用ioctl函數(shù)實現(xiàn)對驅(qū)動的調(diào)用,參數(shù)fd是設備句柄,cmd讀寫控制是命令。其中,宏定義I2C_CMD_SET_DEV_ADDR為地址設置命令,I2C_CMD_READ向內(nèi)核讀取數(shù)據(jù)命令,I2C_CMD_WRITE向內(nèi)核寫入數(shù)據(jù)命令。
其他3個讀寫函數(shù)實現(xiàn)過程類似,這幾個函數(shù)是數(shù)據(jù)寫入讀出的函數(shù)接口,方便應用層實現(xiàn)調(diào)用。
云臺的重要部分是電機轉動控制采用圖像界面實現(xiàn)人機交互,其中界面設計采用QT圖形界面,可以在界面操作中實現(xiàn)電機的水平轉動、垂直轉動、逆時針轉動和順時針轉動,從而帶動視頻監(jiān)控的攝像頭朝不同方位轉動以及定位。根據(jù)協(xié)議,圖4所示應用程序設計主要實現(xiàn)以下操作:
① 獲取當前的垂直位置,函數(shù)接口為get_motor_curVertical_ptr (),返回垂直位置值。
② 獲取當前的水平位置,函數(shù)接口為get_motor_curHorizontal_ptr (),返回水平位置值。
③ 設置垂直運行的停止位置,函數(shù)接口為set_motor_vertical_ptr (unsigned short ptr),參數(shù)ptr為設置的垂直停止位置值。
④ 設置水平運行的停止位置,函數(shù)接口為set_motor_horizontal_ptr (unsigned short ptr)參數(shù)ptr為設置的水平停止位置值。
⑤ 水平操作和垂直操作的啟動操作,接口函數(shù)為set_motor_opt(bool bVertical, bool bHorizontal),參數(shù)bVertical表示是否啟動垂直操作,bHorizontal表示是否啟動水平操作。
⑥ 設置運行速度,函數(shù)接口為set_motor_speed(unsigned char vertical_speed, unsigned char horizontal_speed),參數(shù)vertical_speed控制垂直方向速度值,horizontal_speed控制水平方向速度值。
⑦ 設置電機運行方向,接口函數(shù)set_motor_direction(bool bVertical, bool bHorizontal),設置運行方向為順時針或者逆時針,參數(shù)bVertical為真表示垂直方向向上運動,為假表示向下運動;bHorizontal為真表示水平方向逆時針。其中,否則為順時針。
圖4 云臺電機控制應用程序設計圖
下面通過運動速度的接口函數(shù)set_motor_speed(),詳細介紹云臺控制接口函數(shù)的實現(xiàn)過程,電機轉動速度函數(shù)設置為set_motor_speed()。其中,函數(shù)參數(shù)vertical_speed為垂直方向運動速度,horizontal_speed為水平方向運動速度,局部變量reg用于制定控制類型,value設計為16位,其中高8位存放垂直轉動速度數(shù)值命令,低8位存放水平轉動速度數(shù)值,參數(shù)設置完后調(diào)用I2C_Write16()函數(shù),從而調(diào)用ioctl函數(shù)實現(xiàn)對驅(qū)動的調(diào)用,最終通過I2C總線控制電機,達到電機快速轉動、定位準確。
通過實現(xiàn)人機交互操作程序,實現(xiàn)電機的向上轉動、向下轉動、逆時針轉動和順時針轉動,通過調(diào)用各種操作的接口函數(shù),實現(xiàn)對I2C應用程序的調(diào)用,最后通過ioctl函數(shù)實現(xiàn)對電機的控制,從而帶動視頻監(jiān)控的攝像頭朝不同方位轉動以及定位。
本系統(tǒng)實現(xiàn)了一款基于TMS320DM368的高清視頻監(jiān)控系統(tǒng)中的云臺電機控制設計,完成了I2C驅(qū)動程序的分析,并且完成了I2C總線應用程序和云臺電機控制應用程序設計,達到了應用目的,取得了良好效果。
[1] 張志.高速公路高清視頻監(jiān)控系統(tǒng)的構建[D].北京:中國交通信息化,2011(4).
[2] 鄧旻熙.基于DM365的智能視頻分析系統(tǒng)的設計與實現(xiàn)[D].成都:電子科技大學,2011.
[3] Texas Instruments. TMS320DM368 Digital Media Sys-tem-on-Chip( DMSoC),2011.
[4] Philips. The I2C- BUS Specification Version 2. 1,2000.
[5] 高非非. ARM-Linux中I2C總線驅(qū)動開發(fā)[J].微型機與應用,2012(3).
[6] TMS320DM36x Digital Media System-on-Chip(DMSoC)Inter-Integrated Circuit(I2C)Module User's Guide,2009.
[7] Linux-2.6.32.17[EB/OL].[2014-09].http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_4_00/latest/index_FDS.html.
[8] ARM9[EB/OL].[2014-09].http://www.arm.com/zh/products/processors/classic/arm9/index.php.
[9] TI.TMS320DM36x Digital Media System-on-Chip(DMSoC) ARM Subsystem User's Guide[EB/OL].[2014-09].http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_4_00/latest/index_FDS.html.
[10] DanielP Bovet.Understanding the Linux Kernel [M].北京:中國電力出版社,2007:354-669.
[11] Jonahan Corbet.Linux Device Drivers [M].北京:中國電力出版社,2006.
[12] W Richard Stevens.Advanced Progamming in the UNIX Environment Fourth Edition[M].北京:人民郵電出版社,2006.
廖建尚(系統(tǒng)分析師),研究方向為嵌入式系統(tǒng)、視頻處理、智能交通。
Liao Jianshang
(School of Computer Engineering,Guangdong Communication Polytechnic,Guangzhou 510650,China)
This paper analyzes the working principle of I2C and the driver of I2C bus in Linux, then constructs I2C PTZ motor control system used in the video surveillance system on freeway.It completes the I2C driver design on ARM and Linux,I2C application program design and PTZ motor control application program design.The system implements the control of PTZ motor by application program,which is used on freeway.It achieves the full range video surveillance,and has good result and high social value.
video surveillance;PTZ motor;I2C driver;Linux
2013年廣東省科技計劃項目(高速公路高清視頻監(jiān)控系統(tǒng)研究與開發(fā))。
TP271
A
?迪娜
2014-09-05)