做底層驅動免不了gpio打交道,所以對其操作和除錯進行了一下簡單的梳理
一、gpio的除錯方法
在linux下,通過sysfs,獲取gpio狀態,也可以操作gpio。
1、獲取gpio狀態
cd /sys/kernel/debug/
cat gpio
2、操作gpio(以gpio99為例)
cd /sys/class/gpio/
echo 99 > export
cd gpio99
echo in/out > direction //設定gpio輸入或輸出
cat direction //獲取gpio輸入輸出狀態
echo 'value' > value //設定gpio暫存器值
cat value //獲取gpio暫存器的值
二、在kernel**中操作gpio
在**中有兩種方式操作gpio,一種是一次申請單個gpio,成功後操縱該gpio,另一種是使用pinctrl,通過裝置樹設定,一次操作多個gpio。
1、方法一
裝置樹裝置節點中新增gpio //可選
device_node
驅動**:
intgpio_99
=of_get_named_gpio_flags
(dev
->
of_node
,"gpio_name",0
,null
);//從裝置數節點, 可選
gpio_request
(gpio_99
,"gpio_name"
);//通過gpio號申請gpio
gpio_direction_output
(gpio_99,1
);//設定gpio_99輸出,初始值為1
gpio_set_value
(gpio_99,0
);//設定gpio_99值為0
gpio_free
(gpio_99
);//gpio_99不再使用後應當釋放
注:gpio的申請和設定都可能會出現失敗的情況,應該做好異常處理
2、方法二
裝置樹**:
平台pinctrl節點下新增如下子節點:
相關文件和裝置樹配置詳解見kernel/document/pinctrl.txt和documentation/devicetree/bindings/pinctrl/下多個檔案
gpio_group ;
config ;
};gpio_sleep: gpio_sleep ;
config ;
};裝置節點中引用pinctrl:
device_node ;
核心驅動**:
struct
pinctrl
*pinctrl
=devm_pinctrl_get
(device
);//獲取device對應節點下的pinctrl
struct
pinctrl_state
=pinctrl_lookup_state
(pinctrl
,"gpio_active"
);//通過pinctrl名獲取pinctrl對應狀態
pinctrl_select_state
(pinctrl
,pinctrl_state
);//設定pinctrl的狀態為'gpio_active
devm_pinctrl_put
(pinctrl
);//使用完了釋放資源
也可以同時使用方法一和方法二,方法一操作簡單,但是只能拉高或拉低,而方法二可全面配置gpio。在乙個裝置驅動中同時使用方法一和方法二可保證資源不被其他模組操作。
高通平台中gpio簡單操作和除錯
做底層驅動免不了gpio打交道,所以對其操作和除錯進行了一下簡單的梳理 一 gpio的除錯方法 在linux下,通過sysfs,獲取gpio狀態,也可以操作gpio。1 獲取gpio狀態 cd sys kernel debug cat gpio 2 操作gpio 以gpio99為例 cd sys c...
高通平台中用devicetree註冊裝置及驅動匹配
1 在裝置樹檔案 dts 中的相應節點下新增要註冊裝置的節點 soc 定義好的裝置樹原始檔 dts檔案 會被編譯器dtc編譯成二進位制的dtb檔案。然後在系統上電時,這個二進位制檔案會被載入到記憶體中,其位址被儲存在r2暫存器中。但是,這個時候還並不存在device tree,需要經過kernel解...
高通平台直接通過adb控制GPIO電平
首先,看看系統中有沒有 sys class gpio 這個資料夾。如果沒有請在編譯核心的時候加入 device drivers gpio support sys class gpio sysfs inte ce sys class gpio 的使用說明 gpio operation 通過 sys 檔...