linux debugfs使用分享 软件查看gpio状态

在调试Android设备时,通过adb shell命令创建并挂载debugfs文件系统,可以方便地查看和操作GPIO、调节器、时钟等硬件资源,提高调试效率。

 

在调试中加入debugfs有时可以起到事半功倍的效果:

 

adb shell
#mkdir /data/debug
#mount -t debugfs debugfs /data/debug
#cd /data/debug

 

 

查看gpio状态

root@android:/data/debugfs # cat gpio
GPIOs 0-15:
 gpio-0   (front_camera_rst    ) out lo

GPIOs 16-42:
 gpio-17  (tsl2771_int         ) in  hi
 gpio-26  (ctp_reset           ) out hi
 gpio-29  (front_camera_pwd    ) out hi
 gpio-31  (gpio_kp_out         ) out lo
 gpio-32  (gpio_kp_out         ) out lo
 gpio-35  (GPIO_E186_POWER     ) in  lo
 gpio-36  (gpio_kp_in          ) in  hi
 gpio-37  (gpio_kp_in          ) in  hi
 gpio-42  (hs_sw               ) in  hi

GPIOs 43-67:
 gpio-48  (ctp_irq             ) in  hi
 gpio-60  (qup_scl             ) in  hi
 gpio-61  (qup_sda             ) in  hi

GPIOs 68-94:
 gpio-76  (lis3dh_acc_int      ) in  lo
 gpio-82  ([auto]              ) out hi
 gpio-85  (bahama sys_rst_n    ) in  lo
 gpio-94  ([auto]              ) out hi

GPIOs 95-106:
 gpio-97  (MDP_VSYNC           ) in  lo

GPIOs 107-132:
 gpio-107 (ctp_power           ) in  hi
 gpio-115 (GPIO_E186_WAKEUP    ) in  lo
 gpio-131 (qup_scl             ) in  hi
 gpio-132 (qup_sda             ) in  hi

查看
regulator
root@android:/data/debugfs # cd
regulator/                                    
dummy/ ldo03/ ldo06/ ldo09/ ldo12/ ldo15/ ldo18/ smps1/ smps4/
ldo01/ ldo04/ ldo07/ ldo10/ ldo13/ ldo16/ ldo19/ smps2/
ldo02/ ldo05/ ldo08/ ldo11/ ldo14/ ldo17/ ncp/   smps3/
root@android:/data/debugfs # cat
regulator/ldo10/voltage                      
3000000

查看
clk
root@android:/ #
cat /data/debugfs/clk/                                       
adm_clk/                  ebi_mddi_clk/
sdc1_p_clk/          
adsp_clk/                 ebi_vfe_clk/
sdc2_clk/            
ahb_m_clk/                ecodec_clk/
sdc2_p_clk/          
ahb_s_clk/                gp_clk/
sdc3_clk/            
cam_m_clk/                grp_3d_clk/
sdc3_p_clk/          
csi0_clk/                 grp_3d_p_clk/
sdc4_clk/            
csi0_p_clk/               gsbi1_qup_clk/
sdc4_p_clk/          
csi0_vfe_clk/             gsbi1_qup_p_clk/
tsif_p_clk/          
csi1_clk/                 gsbi2_qup_clk/
tsif_ref_clk/        
csi1_p_clk/               gsbi2_qup_p_clk/
uart1_clk/           
csi1_vfe_clk/             icodec_rx_clk/
uart1dm_clk/         
debug_suspend             icodec_tx_clk/
uart2_clk/           
dsi_byte_clk/             imem_clk/
uart2dm_clk/         
dsi_clk/                  mdp_clk/
usb_hs2_clk/         
dsi_esc_clk/              mdp_dsi_p_clk/
usb_hs_clk/          
dsi_pixel_clk/            mdp_lcdc_pad_pclk_clk/
usb_hs_core_clk/     
dsi_ref_clk/              mdp_lcdc_pclk_clk/
usb_hs_p_clk/        
ebi1_clk/                 mdp_vsync_clk/
usb_phy_clk/         
ebi2_clk/                 pbus_clk/
vdc_clk/             
ebi_acpu_clk/             pcm_clk/
vfe_clk/             
ebi_adm_clk/              pmdh_clk/
vfe_mdc_clk/         
ebi_grp_3d_clk/           sdac_clk/                
ebi_lcdc_clk/             sdc1_clk/ 

root@android:/ #
cat /data/debugfs/clk/mdp_clk/rate                           
200000000

Linux设备树中,将GPIO引脚配置为GPIO功能通常需要以下步骤: --- ### **1. 定义GPIO引脚复用** 在设备树中,GPIO的复用配置通常通过`pinmux`或`pinctrl-*`属性实现。以下是两种常见方法: #### **(1) 直接使用`pinmux`属性(部分平台支持)** ```dts &gpio0 { pinmux = <PINMUX_GPIO(0)>, // 引脚0复用为GPIO <PINMUX_GPIO(1)>; // 引脚1复用为GPIO }; ``` - `PINMUX_GPIO(n)`是板级定义的宏,需对应硬件寄存器的复用值。 #### **(2) 通过`pinctrl`子系统(推荐)** ```dts &pinctrl { gpio0_default: gpio0-default { pinmux = <PINMUX_GPIO(0)>, // 引脚0复用为GPIO <PINMUX_GPIO(1)>; // 引脚1复用为GPIO }; }; &gpio0 { pinctrl-names = "default"; pinctrl-0 = <&gpio0_default>; // 关联复用状态 }; ``` --- ### **2. 配置GPIO控制器** 确保设备树中正确定义了GPIO控制器节点,并启用驱动: ```dts &gpio0 { compatible = "vendor,gpio-controller"; // 替换为实际驱动 reg = <0x10000000 0x1000>; // 寄存器地址和大小 interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; gpio-controller; // 声明为GPIO控制器 #gpio-cells = <2>; // 参数格式(如引脚号、标志) status = "okay"; // 启用设备 }; ``` --- ### **3. 定义GPIO使用节点** 其他设备(如LED、按键)通过`gpios`属性引用GPIO: ```dts &led0 { compatible = "gpio-leds"; led-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; // 使用gpio0的第0引脚 default-state = "off"; }; &button0 { compatible = "gpio-keys"; button-gpios = <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; label = "User Button"; }; ``` - `#gpio-cells`定义了参数格式(通常为引脚号和标志)。 - 标志如`GPIO_ACTIVE_HIGH`、`GPIO_PULL_UP`需包含在设备树绑定中。 --- ### **4. 平台特定注意事项** #### **(1) 复用值定义** 在板级头文件中定义`PINMUX_GPIO(n)`: ```c #define PINMUX_GPIO(n) (0x100 | (n)) // 示例:复用值=基址+引脚号 ``` #### **(2) 多功能引脚冲突** 如果引脚可能被复用为其他功能(如UART),需在设备树中明确优先级: ```dts &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_pins>; // 避免与GPIO冲突 status = "disabled"; // 默认禁用UART }; ``` --- ### **5. 验证配置** #### **(1) 检查设备树解析** 编译设备树并检查`.dts`展开结果: ```bash dtc -I dts -O dtb -o /dev/null your_board.dts # 查看是否有警告 ``` #### **(2) 内核日志** 启动时观察GPIO控制器注册日志: ```bash dmesg | grep -i gpio ``` #### **(3) 运行时状态** 通过`sysfs`或`debugfs`检查引脚状态: ```bash cat /sys/kernel/debug/gpio # 查看GPIO配置 ``` --- ### **6. 常见问题** #### **(1) 复用未生效** - 原因:`pinctrl`驱动未加载,或设备树节点未关联。 - 解决:确保`pinctrl-0`指向有效的状态节点。 #### **(2) GPIO无法操作** - 原因:未正确设置`gpio-controller`或`#gpio-cells`。 - 解决:检查控制器节点定义。 #### **(3) 引脚冲突** - 原因:多个设备尝试使用同一引脚。 - 解决:通过`status = "disabled"`禁用冲突设备。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值