關於IRCUT切換的操作步驟

0.IRCUT說明

作爲小白,上手海思開發板的時候,不清楚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:

GPIO基址寄存器

方向配置的寄存器描述見《Hi3516EV200 經濟型HD IP Camera SoC用戶指南》P707:

GPIO方向配置

則使用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:

GPIO數據寄存器

多說無益,看一下具體的設置吧,如果之前接觸過關於寄存器基址+偏移尋址的操作,這裏的理解並不難,只是費腦子驗證而已:

#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

可以看到,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 @燕衛博————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章