对高通平台pin(包括gpio)的一点理解、pincontrol子系统、gpio 子系统

1、pincontrol子系统和gpio子系统是两回事,不能混淆来看。比如说,在pincontrol子系统中分配了某gpio作为uart来使用,如果这时候在gpio子系统中gpio_request也是可以成功的,这个时候后执行的代码生效。
pincontrol子系统主要实现的是对PIN的复用功能配置和电气特性配置(比如上/下拉、速度、驱动能力等等)等,比如,这个引脚可以被pincontrol子系统配置为UART引脚或者SPI引脚或者GPIO引脚,可以理解为预处理;
如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统了。 gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,读取 GPIO 的值等。 gpio 子系统的主要目的就是方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API函数来操作 GPIO,Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开发者使用 GPIO。

如下是pincontrol子系统从设备树中分配gpio的代码:

int flag;

struct pinctrl * p = devm_pinctrl_get(&pdev->dev);
 
struct pinctrl_state * turnon_tes = pinctrl_lookup_state(p, "default");

flag = pinctrl_select_state(p, turnon_tes);

如果某一外设在pincontrol子系统和gpio子系统都使用了某一gpio,另一外设也使用了这一gpio。则可能会有以下类似报错:

 2.642425] pinctrl-single d401e000.pinmux: pin d401e1b0 already requested by pxa2xx-uart.1; cannot claim for matrix-keypad.7
[    2.653961] ------------[ cut here ]------------
[    2.658691] WARNING: at drivers/pinctrl/pinmux.c:118 pin_request+0x75/0x11c()
[    2.665954] Modules linked in:
[    2.669097] CPU: 0 PID: 1 Comm: swapper Tainted: G        W    3.10.33 #79
[    2.676086] [<c0019879>] (unwind_backtrace+0x1/0x88) from [<c0017def>] (show_stack+0xb/0xc)
[    2.684631] [<c0017def>] (show_stack+0xb/0xc) from [<c0022747>] (warn_slowpath_common+0x33/0x4c)
[    2.693603] [<c0022747>] (warn_slowpath_common+0x33/0x4c) from [<c00227b7>] (warn_slowpath_null+0xf/0x14)
[    2.703338] [<c00227b7>] (warn_slowpath_null+0xf/0x14) from [<c0108fd5>] (pin_request+0x75/0x11c)
[    2.712402] [<c0108fd5>] (pin_request+0x75/0x11c) from [<c0109535>] (pinmux_enable_setting+0x49/0x104)
[    2.721923] [<c0109535>] (pinmux_enable_setting+0x49/0x104) from [<c01080f3>] (pinctrl_select_state+0x5f/0xc0)
[    2.732116] [<c01080f3>] (pinctrl_select_state+0x5f/0xc0) from [<c01a980f>] (matrix_keypad_probe+0x26f/0x494)
[    2.742218] [<c01a980f>] (matrix_keypad_probe+0x26f/0x494) from [<c013ecd9>] (driver_probe_device+0x75/0x15c)
[    2.752349] [<c013ecd9>] (driver_probe_device+0x75/0x15c) from [<c013ee19>] (__driver_attach+0x35/0x48)
[    2.761901] [<c013ee19>] (__driver_attach+0x35/0x48) from [<c013ddd9>] (bus_for_each_dev+0x3b/0x46)
[    2.771148] [<c013ddd9>] (bus_for_each_dev+0x3b/0x46) from [<c013e7a1>] (bus_add_driver+0x89/0x148)
[    2.780364] [<c013e7a1>] (bus_add_driver+0x89/0x148) from [<c013f143>] (driver_register+0x4b/0x98)
[    2.789520] [<c013f143>] (driver_register+0x4b/0x98) from [<c0012b69>] (do_one_initcall+0x69/0xe8)
[    2.798645] [<c0012b69>] (do_one_initcall+0x69/0xe8) from [<c044685b>] (kernel_init_freeable+0xab/0x140)
[    2.808349] [<c044685b>] (kernel_init_freeable+0xab/0x140) from [<c000ed53>] (kernel_init+0x7/0xa0)
[    2.817565] [<c000ed53>] (kernel_init+0x7/0xa0) from [<c00090fd>] (ret_from_fork+0x11/0x34)
[    2.826049] ---[ end trace 46cebf95fb99e101 ]---
[    2.830780] pinctrl-single d401e000.pinmux: pin-108 (matrix-keypad.7) status -22
[    2.838317] pinctrl-single d401e000.pinmux: could not request pin 108 on device pinctrl-single
[    2.847106] matrix-keypad matrix-keypad.7: Error applying setting, reverse things back
[    2.855133] keypad pintrl -22
[    2.858184] keypad request col 31 0  pinctrl
[    2.862548] keypad request col 13 0  pinctrl
[    2.866912] keypad request col 53 0  pinctrl
[    2.871246] keypad request col 14 0  pinctrl
[    2.875579] keypad request col 54 0  pinctrl

2、以mdm9x07为例
通用gpio只有0~80. 整个cpu pin有300+,但是有的pin标号1000+,可以用下面来理解

/sys/class/gpio # cat /sys/kernel/debug/gpio
cat /sys/kernel/debug/gpio
GPIOs 0-79, platform/1000000.pinctrl, 1000000.pinctrl:
 gpio0   : out 0 4mA no pull
 gpio1   : in  0 2mA pull down
 gpio2   : in  0 2mA pull down
 gpio3   : in  0 2mA pull down
 gpio4   : out 2 2mA pull up
 gpio5   : in  2 2mA pull up
 gpio6   : in  2 2mA pull up
 gpio7   : out 2 2mA pull up
 gpio8   : out 2 2mA pull down
 gpio9   : in  2 2mA pull down
 gpio10  : in  0 2mA pull down
 gpio11  : in  0 2mA pull down
 gpio12  : in  0 2mA pull down
 gpio13  : in  0 2mA pull down
 gpio14  : in  0 2mA pull down
 gpio15  : in  0 2mA pull down
 gpio16  : in  0 2mA no pull
 gpio17  : in  0 2mA pull down
 gpio18  : out 0 2mA pull up
 gpio19  : out 0 2mA pull up
 gpio20  : out 3 8mA no pull
 gpio21  : in  3 8mA no pull
 gpio22  : out 3 8mA no pull
 gpio23  : out 3 8mA no pull
 gpio24  : in  0 2mA pull down
 gpio25  : in  0 2mA pull down
 gpio26  : out 0 2mA pull up
 gpio27  : out 0 2mA no pull
 gpio28  : out 0 8mA no pull
 gpio29  : out 0 2mA no pull
 gpio30  : in  0 2mA pull down
 gpio31  : out 0 2mA no pull
 gpio32  : out 0 8mA no pull
 gpio33  : out 0 2mA no pull
 gpio34  : in  0 2mA pull down
 gpio35  : in  0 2mA pull down
 gpio36  : in  0 2mA pull down
 gpio37  : out 0 4mA pull down
 gpio38  : in  0 2mA pull down
 gpio39  : in  0 2mA no pull
 gpio40  : in  0 2mA no pull
 gpio41  : in  0 2mA no pull
 gpio42  : in  0 2mA no pull
 gpio43  : in  0 2mA no pull
 gpio44  : in  0 2mA no pull
 gpio45  : in  0 2mA no pull
 gpio46  : in  0 2mA no pull
 gpio47  : in  0 2mA no pull
 gpio48  : in  0 2mA no pull
 gpio49  : in  0 2mA pull up
 gpio50  : in  0 2mA no pull
 gpio51  : in  0 2mA no pull
 gpio52  : in  0 2mA no pull
 gpio53  : in  0 2mA pull down
 gpio54  : in  0 2mA pull down
 gpio55  : in  0 2mA no pull
 gpio56  : in  0 2mA no pull
 gpio57  : in  0 2mA no pull
 gpio58  : in  0 2mA pull down
 gpio59  : in  0 2mA pull down
 gpio60  : in  0 2mA pull down
 gpio61  : in  0 2mA pull down
 gpio62  : in  0 2mA pull down
 gpio63  : in  0 2mA pull down
 gpio64  : in  0 2mA pull down
 gpio65  : in  0 2mA pull down
 gpio66  : in  0 2mA pull down
 gpio67  : in  0 2mA pull down
 gpio68  : in  0 2mA pull down
 gpio69  : in  0 2mA pull down
 gpio70  : in  0 2mA pull down
 gpio71  : in  0 2mA pull down
 gpio72  : in  0 2mA pull down
 gpio73  : in  0 2mA pull down
 gpio74  : in  0 2mA pull up
 gpio75  : in  0 2mA pull down
 gpio76  : in  0 2mA pull down
 gpio77  : in  0 2mA pull down
 gpio78  : in  0 2mA pull down
 gpio79  : in  0 2mA pull down

GPIOs 820-851, platform/soc:qcom,smp2pgpio-ssr-smp2p-1-out, master-kernel:

GPIOs 852-883, platform/soc:qcom,smp2pgpio-ssr-smp2p-1-in, slave-kernel:

GPIOs 884-915, platform/soc:qcom,smp2pgpio-smp2p-1-out, smp2p:

GPIOs 916-947, platform/soc:qcom,smp2pgpio-smp2p-1-in, smp2p:

GPIOs 948-979, platform/soc:qcom,smp2pgpio-smp2p-15-out, smp2p:

GPIOs 980-1011, platform/soc:qcom,smp2pgpio-smp2p-15-in, smp2p:

GPIOs 1012-1017, spmi/qpnp-pin-7, pm8019-mpp:
 gpio-1012 (sysfs               ) out lo    

GPIOs 1018-1023, spmi/qpnp-pin-6, pm8019-gpio:
 gpio-1018 (rome_vreg           ) out lo    
 gpio-1021 (sdcard_ext_vreg     ) out lo    

场景:用gpio控电,后面gpio用作他用,可以用以下代码来配置

 #if 1 // leiting add changan svdc project...    open peripheral device power
        if (!strcmp(dev_name(&pdev->dev), "78b6000.i2c")) {
           gpio_request(41, NULL);
           gpio_direction_output(41, 0);
                    
           gpio_request(58, NULL); 
           gpio_direction_output(58, 0);
            
           mdelay(1000);         
    
           gpio_set_value(41,1);
           gpio_set_value(58,1);
           
           gpio_free(41);
           gpio_free(58);
        }
    #endif
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值