国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于HID的開關(guān)控制系統(tǒng)設(shè)計(jì)

2021-12-10 02:11:36譚汝浩韋紅錄黃冬梅
視聽 2021年12期
關(guān)鍵詞:描述符固件寄存器

譚汝浩 韋紅錄 黃冬梅

一、概述

廣播電視發(fā)射系統(tǒng)中信號源子系統(tǒng)設(shè)備繁多,有衛(wèi)星信號接收機(jī)、光纖信號解碼器、信號源切換器等重要設(shè)備。若這些設(shè)備發(fā)生故障,很可能致使廣播電視節(jié)目信號中斷,導(dǎo)致頻點(diǎn)靜音靜幀等現(xiàn)象,造成停播事故。臺站原有的電源復(fù)位器功能單一,自動化程度低,通道數(shù)量少,很多設(shè)備電源接入到同一通道上。若某個設(shè)備故障需要復(fù)位重啟,對該設(shè)備接入的通道復(fù)位時,整個通道的設(shè)備都會被復(fù)位重啟,這樣就有可能導(dǎo)致其他設(shè)備工作異常,造成停播現(xiàn)象。因此,可以采用一個新的解決方案,即采用USB-HID控制信號源系統(tǒng)設(shè)備電源。USB-HID是基于USB通信的,與電源復(fù)位器通信方式不同,后者采用網(wǎng)絡(luò)通信,兩者互不影響,因此還可以串聯(lián)組合運(yùn)行。

USB-HID是Universal Serial Bus-Human Interface Device的縮寫,HID設(shè)備通常是鼠標(biāo)、鍵盤、游戲手柄等,不過HID設(shè)備并不一定要有人機(jī)接口,只要符合HID類別規(guī)范的設(shè)備都是HID設(shè)備。HID通信相對簡單,響應(yīng)快,所以比較適合用作控制設(shè)備。交換的數(shù)據(jù)需要存儲在稱為報表(report)的結(jié)構(gòu)內(nèi),設(shè)備固件必須支持HID報表格式。相對其他USB設(shè)備,HID主要由控制傳輸和中斷傳輸來傳送與接收數(shù)據(jù)。報表的格式非常有彈性,可以處理任何類別的數(shù)據(jù)。HID類別設(shè)備的規(guī)范是Device Class Definition for Human Interface Devices①。另外還有一份文件 HID Usage Tables②,用來定義讓主機(jī)了解以及使用HID數(shù)據(jù)的數(shù)值。

二、HID底層通信

現(xiàn)有資源為一塊HID繼電器控制板,配套資料是一份DLL及其頭文件,沒有源碼,根據(jù)現(xiàn)有資源進(jìn)行反匯編學(xué)習(xí)HID通信原理。使用OllyDbg對該DLL進(jìn)行調(diào)試。圖1是OllyDbg調(diào)試界面,區(qū)域1是反匯編指令窗口,第一列是地址欄,第二列是機(jī)器碼,第三列是匯編代碼,第四列是注釋,匯編指令眾多但是常用的很少,這點(diǎn)服從二八定律,少量的指令完成大部分功能。區(qū)域2是CPU寄存器窗口,最重要的是前面9個寄存器,這9個寄存器保存著當(dāng)前程序段的運(yùn)行參數(shù)、結(jié)果等重要信息,各個寄存器的說明詳見參考文獻(xiàn)③。區(qū)域3是數(shù)據(jù)窗口,在這里查看內(nèi)存數(shù)據(jù),常量數(shù)據(jù)一般都存放在此處,例如常用數(shù)值、字符串等。在區(qū)域1和2中,右鍵一個地址指針即可跟隨轉(zhuǎn)存到這里查看該地址的內(nèi)存數(shù)據(jù)。區(qū)域4是棧窗口,棧通常用于保存臨時變量,棧操作push是將目標(biāo)壓棧,pop將棧頂彈出到目標(biāo)。除了這兩個操作還有棧對齊,保證棧頂指針為某字節(jié)的整數(shù)倍;升棧,分配局部變量空間;降棧,刪除棧部分?jǐn)?shù)據(jù)。

圖1 OllyDbg調(diào)試界面

根據(jù)頭文件分析DLL的導(dǎo)出函數(shù)及其傳入?yún)?shù)類型和返回參數(shù)類型。調(diào)試過程中DLL所用到的Win32Api會被OllyDbg標(biāo)示出來,可以從注釋中看到是什么Api,而所用到的HIDDLL的Api沒有標(biāo)記,要手動添加注釋信息。整個通信的建立過程都是基于Win32Api和HIDDLL的Api完成的。

經(jīng)過耐心的跟蹤調(diào)試得到如圖2的通信流程圖。其中SetupDiGetDeviceInterfaceDetailA函數(shù)連續(xù)調(diào)用兩次,第一次獲得required_size參數(shù),第二次將required_size傳入獲得設(shè)備詳細(xì)信息。CreateFile函數(shù)也是連續(xù)調(diào)用兩次,第一次ShareMode參數(shù)為空,如果是鼠標(biāo)、鍵盤等獨(dú)占設(shè)備是不能通過CreateFile打開的,將會在此返回失敗,相當(dāng)于在此過濾鼠標(biāo)、鍵盤等獨(dú)占設(shè)備;第二次ShareMode參數(shù)為3,函數(shù)成功返回HID設(shè)備句柄,設(shè)備句柄是與設(shè)備通信的唯一標(biāo)識。通信階段使用DeviceIoControl函數(shù)向HID設(shè)備發(fā)起查詢請求,獲得特征報告(Feature Report),該設(shè)備自定義的序列號就在特征報告里面,繼電器狀態(tài)也包含在特征報告里。HidD_SetFeature函數(shù)用于發(fā)送特征報告,設(shè)置繼電器狀態(tài)。

圖2 流程圖

三、固件

固件開發(fā)過程需要用到Bus Hound。Bus Hound是一個USB通用的強(qiáng)大的調(diào)試工具,類似于網(wǎng)絡(luò)抓包工具,用于抓取電腦總線數(shù)據(jù),還可以模擬發(fā)送請求數(shù)據(jù)。圖3是Bus Hound調(diào)試界面。21.0表示21號設(shè)備端點(diǎn)0,CTL表示主機(jī)發(fā)送控制請求,請求內(nèi)容為其后的Data,GET DESCRIPTOR表示該請求為獲取描述符。IN表示設(shè)備發(fā)送數(shù)據(jù)到主機(jī)。圖中的數(shù)據(jù)是設(shè)備上電枚舉階段發(fā)生的數(shù)據(jù)交換。共四條GET DESCRIPTOR,第一條描述符為設(shè)備描述符,第二條獲取配置描述符長度,第三條根據(jù)長度再次請求配置描述符,第四條獲取報告描述符。設(shè)備描述符和配置描述符為USB通用,報告描述符為HID傳輸?shù)臄?shù)據(jù)用途(usage)上的說明。至此,獲得了HID固件關(guān)鍵的三個描述符。報告描述符的用法和修改參照HID Usage Tables。官網(wǎng)還有報告描述符工具提供使用。

圖3 Bus Hound調(diào)試界面

MCU采用stm32f407vet6,從stc官網(wǎng)獲取HID固件庫④。使用固件庫參照HID協(xié)議進(jìn)行修改調(diào)試。這里的主要問題是我們沿用舊設(shè)備的數(shù)據(jù)交換方式,即特征報告(Feature Report),上位機(jī)發(fā)送請求特征報告失敗返回0xC0000004,查詢HID協(xié)議找到7.2 Class-Specific Requests(特殊請求),7.2.2 Set_Report Request有說明“A device might choose to ignore input Set_Report requests as meaningless.”,由此得知固件默認(rèn)不處理特征報告。因此要添加對特征報告的處理,7.2 Class-Specific Requests查找發(fā)現(xiàn)7.2.4 Set_Idle Request這一請求是處理成功的。于是在固件庫找到Set_Idle Request的處理,在其同級增加條件分支完成添加特征報告的處理,使用端點(diǎn)0收發(fā)特征報告數(shù)據(jù)。

四、數(shù)據(jù)庫

臺站主控電腦使用SQL Server處理數(shù)據(jù),各個設(shè)備狀態(tài)被相應(yīng)的上位機(jī)實(shí)時更新到數(shù)據(jù)庫,通過查詢數(shù)據(jù)庫獲取設(shè)備狀態(tài),相當(dāng)于借助數(shù)據(jù)庫與其他上位機(jī)進(jìn)行進(jìn)程間通信。

為模擬相關(guān)環(huán)境在自己電腦上安裝SQL Server和SSMS。添加數(shù)據(jù)庫和數(shù)據(jù)表,添加數(shù)據(jù)元組示例??蛻舳藢?shù)據(jù)庫的操作只有讀取,因此采用sqlcmd命令行獲取數(shù)據(jù)比較簡便,使用popen函數(shù)執(zhí)行命令行獲取返回的數(shù)據(jù)。sqlcmd的使用比較簡單,需要的參數(shù)有-S服務(wù)器、-U用戶名、-P密碼、-d使用數(shù)據(jù)庫名稱、-Q查詢命令(sql查詢語句)。圖4為在我的電腦的模擬環(huán)境中進(jìn)行查詢得到的結(jié)果。

圖4 命令行查詢數(shù)據(jù)

五、端口拓展

為了獲得更多的控制通道,以及預(yù)留IO口做其他用途,使用74HC595進(jìn)行端口拓展。74HC595是8位串行輸入/輸出或者并行輸出移位寄存器,具有高阻、關(guān)、斷狀態(tài)。圖5是其真值表。通過將串行數(shù)據(jù)輸出管腳SQH級聯(lián)到下一個74HC595的SI輸入管腳達(dá)到加長拓展。OE拉低SCLR拉高,需要控制的有時鐘輸入SCK、鎖存信號RCK和數(shù)據(jù)源SI,只需要三個MCU IO口即可控制數(shù)位寄存器狀態(tài)。最后通過ULN2803驅(qū)動繼電器。

圖5 74HC595真值表

六、客戶端

客戶端工作流程如圖6所示,實(shí)現(xiàn)自動控制和接管控制。綜合考慮數(shù)據(jù)庫查詢壓力和信號快速恢復(fù),設(shè)定每秒查詢一次設(shè)備狀態(tài)。使用MFC對話框設(shè)計(jì)一個簡單的界面,添加接管按鈕、各個設(shè)備開關(guān)按鈕,在初始化函數(shù)中鏈接底層通信DLL,完成客戶端的開發(fā)工作。

圖6 客戶端工作流程

七、總結(jié)

自動控制只開發(fā)了信號源部分,實(shí)現(xiàn)發(fā)現(xiàn)切換器故障無輸出關(guān)閉切換器電源,發(fā)現(xiàn)設(shè)備通信異常重啟復(fù)位恢復(fù)通信等功能。手動控制支持更多端口,可以控制其他設(shè)備,例如,鄉(xiāng)鎮(zhèn)熊貓數(shù)字電視發(fā)射機(jī)無輸出,控制其復(fù)位。

注釋:

①Device Class Definition for Human Interface Devices.

②HID Usage Tables.

③劉穎東.揭秘數(shù)據(jù)解密的關(guān)鍵技術(shù)[M].北京:人民郵電出版社,2009.

④STM32F10xxx USB-FS-Device firmware library.

猜你喜歡
描述符固件寄存器
基于結(jié)構(gòu)信息的異源遙感圖像局部特征描述符研究
Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
Linux單線程并發(fā)服務(wù)器探索
分簇結(jié)構(gòu)向量寄存器分配策略研究*
利用CNN的無人機(jī)遙感影像特征描述符學(xué)習(xí)
基于固件的遠(yuǎn)程身份認(rèn)證
提取ROM固件中的APP
電腦愛好者(2015年7期)2015-04-09 08:54:02
一種通過USB接口的可靠固件升級技術(shù)
奧林巴斯XZ—2新固件升級
中國攝影(2014年1期)2014-02-24 01:50:23
高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
永州市| 长治市| 宣武区| 榆社县| 安西县| 临高县| 蛟河市| 桑植县| 翁牛特旗| 扎兰屯市| 镇平县| 江门市| 安泽县| 建水县| 隆尧县| 天台县| 牙克石市| 方城县| 东阿县| 福清市| 茶陵县| 莱阳市| 锡林郭勒盟| 金寨县| 丰宁| 嘉鱼县| 光泽县| 高雄市| 乌鲁木齐县| 合山市| 栾川县| 太仆寺旗| 鄂州市| 中宁县| 株洲县| 宣威市| 平乡县| 巴彦县| 长岭县| 崇礼县| 蒲城县|