AIO-PX30JD4 開發(fā)板上的 AD 接口有兩種,分別為:溫度傳感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。其中:
-
TS-ADC(Temperature Sensor):支持兩通道,時鐘頻率必須低于800KHZ
-
SAR-ADC(Successive Approximation Register):支持三通道單端10位的SAR-ADC,時鐘頻率必須小于13MHZ。
Linux內(nèi)核采用工業(yè) I/O 子系統(tǒng)(iio子系統(tǒng))來控制 ADC,該子系統(tǒng)主要為 AD 轉換或者 DA 轉換而設計。本文以配置SAR-ADC為例,主要介紹 SAR-ADC的基本配置和使用的方法,其相關的數(shù)據(jù)結構,源碼路徑以及配置步驟如下:
iio_channel結構體
iio_dev結構體
該結構體主要是用于描述IO口所屬的設備,其具體定義如下:
iio_chan_spec結構體
該結構體主要用于描述單個通道的屬性,具體定義如下:
配置DTS節(jié)點
第一步:在AIO-PX30JD4的 DTS 文件:kernel/arch/arm64/boot/dts/rockchip/px30.dtsi中,添加saradc資源,應如下:
第二步:根據(jù)用戶的通道需要選擇對應的saradc通道,本次例程使用AIO-PX30-JD4上的ADC按鍵檢測,選擇通道2,配置如下:
-
io-channels 屬性 為 選擇的通道號,這里選擇通道2
-
io-channel-names 屬性 表示 為申請的通道起一個別名。
-
keyup-threshold-microvolt 屬性 表示按鍵抬起,saradc通道2的電壓(單位微伏)。
-
press-threshold-microvolt 屬性 表示按鍵按下,saradc通道2的電壓。
-
vol-up-key 在硬件連接上,為AIO-PX30-JD4 上的recovery 按鍵。
-
linux,code 屬性 為 按鍵上報的鍵值,鍵值對應的動作 為 “音量+” 。
在saradc驅動文件中匹配 saradc 的dts 節(jié)點
第一步: 在內(nèi)核設備樹添加saradc資源之后,可以在源碼kernel/drivers/iio/adc/rockchip_saradc.c中添加對應的saradc數(shù)據(jù)結構體
第二步: 在rockchip_saradc_match[] 中,添加px30的compatible屬性,使得saradc驅動可以匹配到saradc設備。因如下:
第三步: 填充saradc的platform_driver結構體:
第四步:通過module_platform_driver(rockchip_saradc_driver)宏平進行驅動的注冊。
在設備上電的時候,內(nèi)核會解析內(nèi)核設備樹,當檢測到設備樹上saradc的compatible屬性與saradc驅動的of_device_id中的compatible成員一致的時候,便會調(diào)用rockchip_saradc.c中的rockchip_saradc_probe()函數(shù)來進行iio系統(tǒng)的adc設備的資源申請以及初始化(此處不再贅述,用戶可自行查看源碼)。
在進入系統(tǒng)后,會出現(xiàn)一個 /sys/bus/iio/devices/iio:device0的目錄,表示創(chuàng)建成功。
在adc-keys.c驅動文件中匹配 adc-keys的dts 節(jié)點
第一步: 填充ADC按鍵驅動的adc_keys_of_match[]中的compatible成員用于匹配設備
第二步: 填充驅動結構體
第三步: 使用module_platform_driver(adc_keys_driver);往內(nèi)核注冊該驅動。
第四步: 設備樹 compatible匹配正確,驅動注冊成功之后,便會調(diào)用ADC按鍵驅動的adc_keys_probe()函數(shù),進行輸入子系統(tǒng)設備的注冊(因為是按鍵驅動,所以使用輸入子系統(tǒng),此部分不在此講述)與saradc的io通道的申請。
在進入系統(tǒng)后,通過 getevent 命令 :
其中我們可以看到:
這樣表示我們的設備已經(jīng)創(chuàng)建成功。
按鍵檢測
adc-keys.c驅動是通過輸入子系統(tǒng)的輪詢檢測函數(shù)adc_keys_poll(),來不斷地讀取saradc通道的值,當不同按鍵按下的時候,是有不同的電壓值的:
所以當recovery按鍵按下的時候,通過iio_read_channel_processed()函數(shù)獲取到的電壓值如果與設備樹配置相符合的話,就會觸發(fā)按鍵上報事件,而用戶層會收到事件,從屏幕可以看到有 ”音量+“ 的動作。
獲取所有ADC值
有個便捷的方法可以在命令行中直接查詢到每個SARADC的值:
其中in_voltage0_raw為通道0,in_voltage01_raw為通道1,以此類推。
以上面的例子為例,命令行輸入 cat /sys/bus/iio/devices/iio:device0/in_voltage2_raw 來獲取ADC電壓轉換后的數(shù)字量
獲取 AD 通道
注:iio_channel_get 通過 probe 函數(shù)傳進來的參數(shù) pdev 獲取 IIO 通道結構體,probe 函數(shù)如下:
讀取 AD 采集到的原始數(shù)據(jù)
調(diào)用 iio_read_channel_raw 函數(shù)讀取 AD 采集的原始數(shù)據(jù)并存入 val 中。
計算采集到的電壓
使用標準電壓將 AD 轉換的值轉換為用戶所需要的電壓值。其計算公式如下:
注:
-
Vref 為標準電壓
-
n 為 AD 轉換的位數(shù)
-
Vresult 為用戶所需要的采集電壓
-
raw 為 AD 采集的原始數(shù)據(jù)
例如,標準電壓為 1.8V,AD 采集位數(shù)為 10 位,AD 采集到的原始數(shù)據(jù)為 568,則:
-
功能:獲取 iio 通道描述
-
參數(shù):
-
dev: 使用該通道的設備描述指針
-
consumer_channel: 該設備所使用的 IIO 通道描述指針
-
-
功能:釋放 iio_channel_get 函數(shù)獲取到的通道
-
參數(shù):
-
chan:要被釋放的通道描述指針
-
-
功能:讀取 chan 通道 AD 采集的原始數(shù)據(jù)。
-
參數(shù):
-
chan:要讀取的采集通道指針
-
val:存放讀取結果的指針
-
為何按上面的步驟申請SARADC,會出現(xiàn)申請報錯的情況?
驅動需要獲取ADC通道來使用時,需要對驅動的加載時間進行控制,必須要在saradc初始化之后。saradc是使用module_platform_driver()進行平臺設備驅動注冊,最終調(diào)用的是module_init()。所以用戶的驅動加載函數(shù)只需使用比module_init()優(yōu)先級低的,例如:late_initcall(),就能保證驅動的加載的時間比saradc初始化時間晚,可避免出錯。
GPIO, 全稱 General-Purpose Input/Output(通用輸入輸出),是一種軟件運行期間能夠動態(tài)配置和控制的通用引腳。 PX30有4組GPIO bank:GPIO0~GPIO3,每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區(qū)分(GPIO0在PD_PMU子系統(tǒng)中,GPIO1/GPIO2/GPIO3在PD_BUS子系統(tǒng)中)。 所有的GPIO在上電后的初始狀態(tài)都是輸入模式,可以通過軟件設為上拉或下拉,也可以設置為中斷腳,驅動強度都是可編程的。每個 GPIO 口除了通用輸入輸出功能外,還可能有其它復用功能,例如:
每個 GPIO 口的驅動電流、上下拉和重置后的初始狀態(tài)都不盡相同,詳細情況請參考《px30 規(guī)格書》中的 “Chapter 21 GPIO” 一章。 px30 的 GPIO 驅動是在以下 pinctrl 文件中實現(xiàn)的:
其核心是填充 GPIO bank 的方法和參數(shù),并調(diào)用 gpiochip_add 注冊到內(nèi)核中。
DTS配置
本文以px30的gslx680外設(基于i2c通信的觸摸屏)為例,講述 gpio的輸入輸出,中斷,復用功能的使用,該驅動源碼在SDK的路徑為:
以下就以該驅動為例介紹GPIO的操作。
本例子所需添加的DTS資源如下所示:
輸入輸出引腳配置
這里使用的是gslx680外設的reset(復位)引腳來講述GPIO的輸入輸出操作。 在DTS配置如下資源:
AIO-PX30JD4的dts對引腳的描述與Firefly-RK3288有所區(qū)別,GPIO0_B4被描述為:<&gpio0 12 GPIO_ACTIVE_HIGH>,這里的12來源于:8+4=12,其中8是因為GPIO0_B4是屬于GPIO0的B組,如果是A組的話則為0,如果是C組則為16,如果是D組則為24,以此遞推,而4是因為B4后面的4。GPIO_ACTIVE_HIGH表示高電平有效,如果想要低電平有效,可以改為:GPIO_ACTIVE_LOW,這個屬性將被驅動所讀取。
中斷引腳配置
這里使用的是gslx680外設的irq(中斷) 引腳來講述GPIO的中斷功能 在DTS中配置如下資源:
其中 gpio0 5 的意思是使用gpio0_A5 為中斷引腳,IRQ_TYPE_LEVEL_LOW意思是該引腳低電平(下降沿)的時候觸發(fā)中斷,跳到中斷函數(shù)執(zhí)行,中斷的觸發(fā)類型還可以配置如下:
復用功能引腳配置
查看芯片的數(shù)據(jù)手冊,可以知道:
在上面i2c1的dts的配置中,主要有以下關鍵的描述
-
pinctrl-names 定義了狀態(tài)名稱列表: default (i2c 功能) 和 gpio 兩種狀態(tài)。
-
pinctrl-0 定義了狀態(tài) 0 (即 default)時需要設置的 pinctrl: &i2c4_xfer
-
pinctrl-1 定義了狀態(tài) 1 (即 gpio)時需要設置的 pinctrl: &i2c4_gpio
由于在i2c1的dts上gpio的字段屬性沒有添加,所以默認該兩個引腳設置為i2c復用功能,其中pinctrl的描述可以在kernel/arch/arm64/boot/dts/rockchip/px30.dtsi 找到 :
其中 0 RK_PC2 表示的是GPIO0_C2引腳,0 RK_PC3 表示的是 GPIO0_C3引腳
RK_FUNC_1,RK_FUNC_GPIO的定義在 kernel/include/dt-bindings/pinctrl/rockchip.h 中可以找到:
在復用時,如果選擇了 “default” (即 i2c 功能),系統(tǒng)會應用 i2c1_xfer 這個 pinctrl,最終將 GPIO0_C2 和 GPIO0_C3 兩個針腳切換成對應的 i2c 功能;而如果選擇了 “gpio” ,系統(tǒng)會應用 i2c1_gpio 這個 pinctrl,將 GPIO0_C2 和 GPIO0_C3 兩個針腳還原為 GPIO 功能。
由于px30的i2c都是默認復用的,所以在源SDK的px30.dtsi中并沒有加上gpio的選擇,所以,在i2c總線驅動中:kernel/drivers/i2c/busses/i2c-rk3x.c,并沒有加上切換復用功能的源碼
如需了解i2c總線驅動是如何切換復用功能的,可以參考源碼SDK中的rockchip的官方例子:kernel/drivers/i2c/busses/i2c-rockchip.c 中的rockchip_i2c_probe()函數(shù)。
首先是調(diào)用 of_get_gpio 取出設備樹中 i2c1 結點的 gpios 屬于所定義的兩個 gpio:
然后是調(diào)用 devm_gpio_request 來申請 gpio,接著是調(diào)用 pinctrl_lookup_state 來查找 “gpio” 狀態(tài),而默認狀態(tài) “default” 已經(jīng)由框架保存到 i2c->dev-pins->default_state 中了。最后調(diào)用 pinctrl_select_state 來選擇是 “default” 還是 “gpio” 功能。
下面是常用的GPIO復用 API的定義:
gslx680 驅動解析之輸入輸出,中斷
以下是對px30源SDK中gslx680外設驅動中gsl_ts_probe()函數(shù),gslX680_init()函數(shù),static irqreturn_t gsl_ts_irq()進行部分的解析,用戶可以從中了解gpio的輸入輸出,中斷功能的使用,而用于復用功能的i2c通信,則在下一章i2c進行講解。
-
of_get_named_gpio_flags 從設備樹中讀取 “reset-gpio” 和 “touch-gpio” 的 GPIO 配置編號和標志,gpio_is_valid 判斷該 GPIO 編號是否有效,devm_gpio_request_one則申請占用該 GPIO。如果初始化過程出錯,會跳到dev_err()函數(shù)進行報錯與gpio資源釋放處理。
-
調(diào)用gpio_to_irq把GPIO的PIN值轉換為相應的IRQ值,調(diào)用devm_request_threaded_irq申請中斷,如果失敗會goto到標簽error_req_irq_fail進行錯誤處理,gpio資源的釋放,該函數(shù)中ts->irq是要申請的硬件中斷號,gsl_ts_irq是中斷函數(shù),irq_flags | IRQF_ONESHOT是中斷標志位, client->name是設備驅動程序名稱,ts是該設備的device結構體,在注冊共享中斷時會用到。
在gsl_ts_probe()中,會在上電的時候,對復位引腳以及中斷引腳進行初始化操作:
由上面的步驟可知曉,在設備上電的時候,可以用示波器測試出,該reset引腳會出現(xiàn)一個復位的操作。
而對于中斷而言,在用戶在進入系統(tǒng)之后,點擊觸摸屏,會把中斷引腳拉低,由上面的devm_request_threaded_irq()函數(shù)可知,該中斷在觸發(fā)的時候,會跳到static irqreturn_t gsl_ts_irq()中斷函數(shù)中去執(zhí)行:
上面這個中斷函數(shù)主要是做了一些鍵值的上報,由于本文未涉及input輸入子系統(tǒng),所以不在此處講述。
下面是常用的 GPIO 輸入輸出的API 定義:
IO指令
GPIO調(diào)試有一個很好用的工具,那就是IO指令,Android系統(tǒng)默認已經(jīng)內(nèi)置了IO指令,使用IO指令可以實時讀取或寫入每個IO口的狀態(tài),這里簡單介紹IO指令的使用。 首先查看 io 指令的幫助:
從幫助上可以看出,如果要讀或者寫一個寄存器,可以用:
使用示例:
-
查看GPIO0當前各引腳值的情況
-
從主控的datasheet查到GPIO0_IOMUX對應寄存器基地址為:FF040000
-
如果想改變GPIO的配置值,可以使用以下指令設置:
GPIO調(diào)試接口
Debugfs文件系統(tǒng)目的是為開發(fā)人員提供更多內(nèi)核數(shù)據(jù),方便調(diào)試。 這里GPIO的調(diào)試也可以用Debugfs文件系統(tǒng),獲得更多的內(nèi)核信息。 GPIO在Debugfs文件系統(tǒng)中的接口為 /sys/kernel/debug/gpio,可以這樣讀取該接口的信息:
從讀取到的信息中可以知道,內(nèi)核把GPIO當前的狀態(tài)都列出來了,以GPIO0組為例,gpio-5(GPIO0_A5)作為gslX680 模塊的中斷引腳,設置輸入,輸出高電平。
Q1: 如何將PIN的MUX值切換為一般的GPIO?
A1: 當使用GPIO request時候,會將該PIN的MUX值強制切換為GPIO,所以使用該pin腳為GPIO功能的時候確保該pin腳沒有被其他模塊所使用。
Q2: 為什么我用IO指令讀出來的值都是0x00000000?
A2: 如果用IO命令讀某個GPIO的寄存器,讀出來的值異常,如 0x00000000或0xffffffff等,請確認該GPIO的CLK是不是被關了,GPIO的CLK是由CRU控制,可以通過讀取datasheet下面CRU_CLKGATE_CON* 寄存器來查到CLK是否開啟,如果沒有開啟可以用io命令設置對應的寄存器,從而打開對應的CLK,打開CLK之后應該就可以讀到正確的寄存器值了。
Q3: 測量到PIN腳的電壓不對應該怎么查?
A3: 測量該PIN腳的電壓不對時,如果排除了外部因素,可以確認下該pin所在的io電壓源是否正確,以及IO-Domain配置是否正確。
Q4: gpio_set_value()與gpio_direction_output()有什么區(qū)別?
A4: 如果使用該GPIO時,不會動態(tài)的切換輸入輸出,建議在開始時就設置好GPIO 輸出方向,后面拉高拉低時使用gpio_set_value()接口,而不建議使用gpio_direction_output(), 因為gpio_direction_output接口里面有mutex鎖,對中斷上下文調(diào)用會有錯誤異常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪費。
AIO-PX30-JD4 開發(fā)板上有 4 個片上 I2C 控制器,各個 I2C 的使用情況如下表:
本文主要描述如何在該開發(fā)板上配置 I2C。
配置 I2C 可分為兩大步驟:
-
定義和注冊 I2C 設備
-
定義和注冊 I2C 驅動
下面以配置 GSL3680 (觸摸屏)為例。
在注冊I2C設備時,需要結構體 i2c_client 來描述 I2C 設備。然而在標準Linux中,用戶只需要提供相應的 I2C 設備信息,Linux就會根據(jù)所提供的信息構造 i2c_client 結構體。
用戶所提供的 I2C 設備信息以節(jié)點的形式寫到 dts 文件中,路徑為 kernel/arch/arm64/boot/dts/rockchip/px30-firefly-aiojd4-lvds.dts ,如下所示:
該驅動的路徑為:kernel/drivers/input/touchscreen/gslx680_firefly.c
定義 I2C 驅動
在定義 I2C 驅動之前,用戶首先要定義變量 of_device_id 和 i2c_device_id 。
of_device_id 用于在驅動中調(diào)用dts文件中定義的設備信息,其定義如下所示:
定義變量 i2c_device_id:
i2c_driver 如下所示:
注:變量id_table指示該驅動所支持的設備。
注冊 I2C 驅動
使用i2c_add_driver函數(shù)注冊 I2C 驅動。
在調(diào)用 i2c_add_driver 注冊 I2C 驅動時,會遍歷 I2C 設備,如果該驅動支持所遍歷到的設備(即id_table的值與設備樹的compatible屬性值相同),則會調(diào)用該驅動的 probe 函數(shù)。
通過 I2C 收發(fā)數(shù)據(jù)
在注冊好 I2C 驅動后,即可進行 I2C 通訊。
在該驅動的gsl_ts_probe()函數(shù)中,會對gslx680的IC進行初始化,而在初始化的代碼中,會對主從設備的通訊進行一個測試
而在 test_i2c()這個函數(shù)中,會存在gsl_ts_read(),gsl_ts_write()兩個gslx680驅動自己封裝的主機發(fā)送和主機接受函數(shù),其內(nèi)部真正調(diào)用的是Linux內(nèi)核提供的I2C通訊函數(shù)。
-
向從機發(fā)送信息:
-
向從機讀取信息:
在使用i2c_master_xxx()函數(shù)來進行接受或者發(fā)送的時候,也是調(diào)用i2c_transfer()這個函數(shù)來處理一個消息結構體(i2c_msg),而對于一些處理信息比較復雜的I2C設備,可以直接調(diào)用i2c_transfer()來處理信息,不過要自己構造 i2c_msg 結構體。
Q1: 通信失敗,出現(xiàn)這種log:”timeout, ipd: 0x00, state: 1”該如何調(diào)試?
A1: 請檢查硬件上拉是否給電。
Q2: 調(diào)用i2c_transfer返回值為-6?
A2: 返回值為-6表示為NACK錯誤,即對方設備無應答響應,這種情況一般為外設的問題,常見的有以下幾種情況:
-
I2C地址錯誤,解決方法是測量I2C波形,確認是否I2C 設備地址錯誤;
-
I2C slave 設備不處于正常工作狀態(tài),比如未給電,錯誤的上電時序等;
-
時序不符合 I2C slave設備所要求也會產(chǎn)生Nack信號。
Q3: 當外設對于讀時序要求中間是stop信號不是repeat start信號的時候,該如何處理?
A3: 這時需要調(diào)用兩次i2c_transfer, I2C read 拆分成兩次,修改如下:
AIO-PX30-JD4 開發(fā)板上使用紅外收發(fā)傳感器 IR (麥克風和i2c0之間)實現(xiàn)遙控功能,在IR接口處接上紅外接收器。本文主要描述在開發(fā)板上如何配置紅外遙控器。
其配置步驟可分為兩個部分:
-
修改內(nèi)核驅動:內(nèi)核空間修改,Linux 和 Android 都要修改這部分的內(nèi)容。
-
修改鍵值映射:用戶空間修改(僅限 Android 系統(tǒng))。
在PX30的DTS文件 : kernel/arch/arm64/boot/dts/rockchip/px30-firefly-aiojd4-lvds.dts 中:
注1:第一列為鍵值,第二列為要響應的按鍵碼。 注2:由于UART3的RX與IR復用了,所以要使用IR功能,就需要在設備樹上關閉UART3。
在 Linux 內(nèi)核中,IR 驅動僅支持 NEC 編碼格式。以下是在內(nèi)核中配置紅外遙控的方法。
所涉及到的文件
如何獲取用戶碼和IR 鍵值
在 remotectl_do_something 函數(shù)中獲取用戶碼和鍵值:
注:用戶可以使用 DBG_CODE() 函數(shù)打印用戶碼。
使用下面命令可以使能DBG_CODE打?。?/p>
將 IR 驅動編譯進內(nèi)核
將 IR 驅動編譯進內(nèi)核的步驟如下所示:
(1)、向配置文件 drivers/input/remotectl/Kconfig 中添加如下配置:
(2)、修改 drivers/input/remotectl 路徑下的 Makefile,添加如下編譯選項:
(3)、在 kernel 路徑下使用 make menuconfig ,按照如下方法將IR驅動選中。
保存后,執(zhí)行 make 命令即可將該驅動編進內(nèi)核。
文件 /system/usr/keylayout/ff200030_pwm.kl 用于將 Linux 層獲取的鍵值映射到 Android 上對應的鍵值。用戶可以添加或者修改該文件的內(nèi)容以實現(xiàn)不同的鍵值映射。
該文件內(nèi)容如下所示:
注:通過 adb 修改該文件重啟后即可生效。
下圖是當紅外遙控器按鈕按下的時候,所產(chǎn)生的波形,主要由head,Control,information,signed free這四部分組成,具體可以參考RC6 Protocol。
AIO-PX30-JD4開發(fā)板默認外置支持了一個LCD屏接口,為LVDS,另外板子也支持MIPI屏幕,但需要注意的是MIPI和LVDS是復用的,使用LVDS之后不能使用MIPI,接口如下圖:
由于AIO-PX30-JD4默認使用的是LVDS屏幕,同時在默認的配置文件kernel/arch/arm64/configs/firefly_defconfig已經(jīng)把LCD相關的配置設置好了,如果自己做了修改,請注意把以下配置加上:
DSI_PHY配置
AIO-PX30-JD4中關于LVDS(MIPI) DSI_PHY的DTS配置在:kernel/arch/arm64/boot/dts/rockchip/px30.dtsi中,從該文件我們可以看到:
而在kernel/arch/arm64/boot/dts/rockchip/px30-firefly-aiojd4-lvds.dts 也存在對以上dts進行引用配置
Backlight配置
AIO-PX30-JD4開發(fā)板外置了一個背光接口用來控制屏幕背光,如下圖所示:
主要有背光電源引腳以及控制亮度引腳,DTS:kernel/arch/arm64/boot/dts/rockchip/px30-firefly-aiojd4-lvds.dts配置如下
-
enable-gpios 屬性為背光的電源控制引腳。
-
pwms屬性:配置PWM,可用來改變輸出占空比(范例里面默認使用pwm0,50000ns是周期(20 KHz)。
-
brightness-levels屬性:配置背光亮度數(shù)組,最大值為255,配置暗區(qū)和亮區(qū),并把亮區(qū)數(shù)組做255的比例調(diào)節(jié)。比如范例中暗區(qū)是255-221,亮區(qū)是220-0。 由于PX30使用200以上的level屏幕就會過暗,所以默認最大值為200。
-
default-brightness-level屬性:開機時默認背光亮度,范圍為0-255。
具體請參考kernel中的說明文檔:kernel/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt
顯示時序配置
在kernel/arch/arm64/boot/dts/rockchip/px30-firefly-aiojd4-lvds.dts中可以看到以下語句:
時序屬性參考下圖:
lvds屏上完電后需要完成一些初始化的工作才可以工作。
u-boot 部分 ->u-boot/drivers/video/drm/rockchip-dw-mipi-dsi.c
詳細流程說明可參考以下附件: Rockchip DRM Panel Porting Guide.pdf
AIO-PX30-JD4 開發(fā)板上有 2 個 LED 燈,如下表所示:
以設備的方式控制 LED可通過使用 LED 設備子系統(tǒng)或者直接操作 GPIO 控制該 LED。
標準的 Linux 專門為 LED 設備定義了 LED 子系統(tǒng)。 在 AIO-PX30-JD4 開發(fā)板中的兩個 LED 均以設備的形式被定義。
用戶可以通過 /sys/class/leds/ 目錄控制這兩個 LED。
開發(fā)板上的 LED 的默認狀態(tài)為:
-
Blue: 系統(tǒng)上電時打開
-
Yellow:用戶自定義
用戶可以通過 echo 向其 brightness屬性輸入命令控制每一個 LED:
Trigger 包含多種方式可以控制LED,這里就用兩個例子來說明
-
Simple trigger LED
-
Complex trigger LED
更詳細的說明請參考 kernel/Documentation/leds/leds-class.txt ,有內(nèi)核對LED相關功能的支持的描述。
首先我們需要知道定義多少個LED,同時對應的LED的屬性是什么。
在 kernel/arch/arm64/boot/dts/rockchip/px30-firefly-aiojd4-lvds.dts 文件中定義LED節(jié)點,具體定義如下:
注意:compatible 的值要跟 drivers/leds/leds-gpio.c 中的 .compatible 的值要保持一致。
Simple trigger LED
這是使用簡單的觸發(fā)方式控制來LED,如下就默認打開黃燈:
(1)定義 LED 觸發(fā)器 在kernel/drivers/leds/trigger/led-firefly-demo.c 文件中有如下添加
(2)注冊該觸發(fā)器
(3)控制 LED 的亮。
(4)打開LED demo
led-firefly-demo默認沒有打開,如果需要的話可以使用以下補丁打開demo驅動:
Complex trigger LED
如下是trigger方式控制LED復雜一點的例子,timer trigger 就是讓LED達到不斷亮滅的效果
我們需要在內(nèi)核把timer trigger配置上
在 kernel 路徑下使用 make menuconfig ,按照如下方法將timer trigger驅動選中。
保存配置并編譯內(nèi)核,把kernel.img 燒到AIO-PX30-JD4板子上 我們可以使用串口輸入命令,就可以看到藍燈不停的間隔閃爍
用戶還可以使用 cat 命令獲取 trigger 的可用值:
AIO-PX30-JD4 開發(fā)板帶有一個MIPI camera,為MIPI_CSI,MIPI最高支持 3264x2448 pixels拍照。
本文以 OV13850 攝像頭為例,講解在該開發(fā)板上的配置過程。
kernel/arch/arm64/boot/dts/rockchip/px30.dtsi:
與攝像頭相關的代碼目錄如下:
設置攝像頭相關的引腳和時鐘,即可完成配置過程。
從以下攝像頭接口原理圖可知,需要配置的引腳有:CIF_PWR、DVP_PWR和MIPI_RST。
-
mipi接口
-
DVP_PWR 對應 PX30 的 GPIO1_B7;
-
CIF_PWR 對應 PX30 的 GPIO1_B6;
-
MIPI_RST對應 PX30 的 GPIO2_B3;
在開發(fā)板中,這三個引腳都是在 cam_board_rk3326.xml 中設置。
配置 Android
修改hardware/rockchip/camera/Config/cam_board_rk3326.xml 來注冊攝像頭:
-
嵌入式主板
+關注
關注
7文章
6097瀏覽量
36152 -
安卓
+關注
關注
5文章
2149瀏覽量
58382 -
Firefly
+關注
關注
2文章
541瀏覽量
7414
發(fā)布評論請先 登錄
AIO-PX30-JD4核心板上手教程
fireflyCORE-PX30-JD4燒寫工作介紹

fireflyCORE-PX30-JD4接口定義介紹

fireflyCORE-PX30-JD4編譯Buildroot 固件簡介
fireflyCORE-PX30-JD4編譯 Ubuntu 固件簡介
fireflyCORE-PX30-JD4燒寫固件簡介
fireflyCORE-PX30-JD4產(chǎn)品簡介
Core PX30 JD4 AndroidTools燒寫工具

Core PX30 JD4工具DriverAssitant驅動助手

Core PX30 JD4 Android 8.1 SDK源碼分享

Core PX30 JD4源代碼Linux SDK分享

Core PX30 JD4固件Android 8.1固件分享

Core PX30 JD4固件Buildroot(GPT)文件分享

Core PX30 JD4固件Ubuntu(GPT)文件分享

Core PX30 JD4核心板產(chǎn)品規(guī)格書

評論