0.IRCUT說明
作爲小白,上手海思開發板的時候,不清楚IRCUT是什麼,更別說IRCUT如何切換了,在學習過程中遇到的問題以及所得在此記錄。
IRCUT雙濾鏡包括全透濾片和紅外光過濾片,從結構上看,是一個長方形的鏡片分成左右兩個部分。使用IRCUT的原因是白天日光光照中含有大量的紅外線,這些紅外線使感光元件得到的圖像偏紅色,所以在白天需要開啓紅外濾鏡濾掉紅外線,夜晚監控攝像一般配有紅外燈板,此時應當改用普通濾光片以得到紅外圖像。如果外部有能檢測光照強度變化的器件,則可以將此轉換過程自動化,而我使用的開發板中沒有光敏元件,所以對IRCUT的切換隻能採用手動模式。
本文內容基於Hi3516EV200開發板測試,描述基於Hi3516EV200。
1.切換過程
IRCUT的型號和種類不同,其驅動方式也有不同,比如電平驅動和脈衝驅動。本文以脈衝驅動的IRCUT爲例。
脈衝驅動的IRCUT爲兩線制,分別接在控制板的兩個GPIO,通過GPIO的電平變化進行控制。所以IRCUT的控制分爲兩部分:GPIO配置/操作以及控制時序。
1.1海思GPIO讀寫工具
對GPIO的操作可以通過使用echo向 /sys/class/gpio/ 中的文件寫值進行,但此處我們使用海思SDK中自帶的對內部寄存器的操作工具——himm命令。該命令的編譯見文末參考1,雖然芯片和SDK不同,但編譯步驟是一致的。
對某寄存器賦值的語句爲:
himm 寄存器地址 值
該操作在shell下進行。
*注:應用程序中調用shell命令可以使用system函數。
1.2GPIO配置
我使用的開發板上,IRCUT連接在GPIO1_1和GPIO1_7上,那麼對GPIO的配置步驟應爲:
1.將GPIO方向設置爲輸出
2.設置GPIO上下拉
3.操作GPIO
4.將GPIO方向設置爲輸入
在這裏,第二步的原因是,在我的開發板上,如果不設置下拉,會導致切換失敗;第四步的原因是恢復寄存器默認值,減少電流損耗。
1.2.1 GPIO方向配置
GPIO基址寄存器描述見《Hi3516EV200 經濟型HD IP Camera SoC用戶指南》P705:
方向配置的寄存器描述見《Hi3516EV200 經濟型HD IP Camera SoC用戶指南》P707:
則使用himm設置GPIO1_1和GPIO1_7爲輸出模式的語句爲:
#set GPIO to output mode
himm 0x120b1400 0x82
同理設置其爲輸入模式的語句爲:
#set GPIO to default(in) mode
himm 0x120b1400 0x00
1.2.2GPIO數據寫入
數據寫入也需要配合基址寄存器,向基址的偏移寫入數值,但是需要注意的是,數據寄存器的對應位位置,數據寄存器的描述見《Hi3516EV200 經濟型HD IP Camera SoC用戶指南》P706:
多說無益,看一下具體的設置吧,如果之前接觸過關於寄存器基址+偏移尋址的操作,這裏的理解並不難,只是費腦子驗證而已:
#set GPIO1_7 to high
himm 0x120b1200 0x80
#set GPIO1_7 to low
himm 0x120b1200 0x0
#set GPIO1_1 to high
himm 0x120b1008 0x02
#set GPIO1_1 to low
himm 0x120b1008 0x0
可以看到,操作的地址的[9:2]對應着GPIO的[8:0]位,而第0、1位是無效的,寫入的數據則不需要空出兩位,依舊是和GPIO位一一對應。這裏多嘴一句,如果你的IRCUT接在別的GPIO口上,那麼操作也要對應着來,不要不理解就Ctrl+C/V。
1.2.3GPIO上下拉及引腳複用
關於引腳描述需要參考文件《Hi3516EV200_PINOUT_CN.xlsx》。在 2.功能信號表 選項卡中可以找到對GPIO1的控制寄存器號:
可以看到,GPIO1_1的控制寄存器爲iocfg_reg46;GPIO1_7的控制寄存器爲iocfg_reg50。
接下來切換到 3.管腳控制寄存器 選項卡,找到對應的寄存器描述,按位確定屬性即可,比如:
#set GPIO1_7 pinmux to GPIO, with Pull-down
himm 0x120C001C 0x1202
上述文件均在 海思SDK\ReleaseDoc\00.hardware\chip\Hi3516EV200 文件夾中,不再冗餘截圖。至此,對GPIO配置的學習就完成了。
1.3控制時序
設IRCUT的兩條線分別爲線A和線B,則時序大致爲:
線A保持低電平,線B從高電平切換到低電平時,IRCUT開啓;
線B保持低電平,線A從高電平切換到低電平時,IRCUT關閉。
開啓和關閉的邏輯相對,對於不同的IRCUT,該操作的開啓和關閉可能相反。時序示意見代碼註釋。
2.切換代碼
此操作針對脈衝方式驅動的IRCUT,IRCUT的型號種類不同,操作的效果可能相反!
此操作在Hi3516EV200驗證!
將以下代碼保存在 *.sh 文件中,並使用 chmod +x filename 賦予可執行權限,在shell下執行即可。
【IRCUT開啓】
#!/bin/sh
#Written by YanWeiBo: https://blog.csdn.net/Turix/article/details/106065234
#IR_CUT on
#[NOTE]For different models of IRCUT, the switching logic may be reversed.
#set GPIO to output mode
himm 0x120b1400 0x82
#set GPIO1_7 pinmux to GPIO, with Pull-down
himm 0x120C001C 0x1202
#GPIO1_1 (0x120b1008)
#
#
#--------------------
#
#GPIO1_7 (0x120b1200)
#----+--------+
#XXXX| ->|<-
#----+ +------
#set GPIO1_7 to high
himm 0x120b1200 0x80
#set GPIO1_1 to low
himm 0x120b1008 0x0
#it seems sleep is not necessary
#sleep 1
#set GPIO1_7 to low
himm 0x120b1200 0x0
#set GPIO to default(input) mode
himm 0x120b1400 0x00
【IRCUT關閉】
#!/bin/sh
#Written by YanWeiBo: https://blog.csdn.net/Turix/article/details/106065234
#IR_CUT off
#[NOTE]For different models of IRCUT, the switching logic may be reversed.
#set GPIO to output mode
himm 0x120b1400 0x82
#set GPIO1_7 pinmux to GPIO, with Pull-down
himm 0x120C001C 0x1202
#GPIO1_7 (0x120b1200)
#
#
#--------------------
#
#GPIO1_1 (0x120b1008)
#----+--------+
#XXXX| ->|<-
#----+ +------
#set GPIO1_1 to high
himm 0x120b1008 0x02
#set GPIO1_7 to low
himm 0x120b1200 0x0
#it seems sleep is not necessary
#sleep 1
#set GPIO1_1 to low
himm 0x120b1008 0x0
#set GPIO to default(input) mode
himm 0x120b1400 0x00
找到的資料中,均有休眠操作,猜測是保證GPIO確被拉到高電平,但實際使用中,不加sleep也可以完成切換,具體考量有讀者自行決定。
參考
1.從零開始創建Hi3516DV300在EMMC上的根文件系統
————2020-5-12 @燕衛博————