coding无法使用浏览器打开,必须用git工具下载:
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
参考资料:
假设使用这个虚拟的GPIO Controller的pinA来控制LED:
如果不想在使用GPIO引脚时,在设备树中设置Pinctrl信息,
如果想让GPIO和Pinctrl之间建立联系,
我们需要做这些事情:
在GPIO设备树中使用gpio-ranges
来描述它们之间的联系:
在GPIO驱动程序中,解析跟Pinctrl之间的联系:处理gpio-ranges
:
gpio_chip->request
pmxops->gpio_request_enable
或pmxops->request
pinctrl_virt: virtual_pincontroller {
compatible = "100ask,virtual_pinctrl";
};
gpio_virt: virtual_gpiocontroller {
compatible = "100ask,virtual_gpio";
gpio-controller;
#gpio-cells = <2>;
ngpios = <4>;
gpio-ranges = <&pinctrl_virt 0 0 4>;
};
myled {
compatible = "100ask,leddrv";
led-gpios = <&gpio_virt 0 GPIO_ACTIVE_LOW>;
};
gpio_chip中提供request函数:
chip->request = gpiochip_generic_request;
static const struct pinmux_ops virtual_pmx_ops = {
.get_functions_count = virtual_pmx_get_funcs_count,
.get_function_name = virtual_pmx_get_func_name,
.get_function_groups = virtual_pmx_get_groups,
.set_mux = virtual_pmx_set,
.gpio_request_enable = virtual_pmx_gpio_request_enable,
};
注意:对于STM32MP157,以前说编译内核/驱动、编译APP的工具链不一样,其实编译APP用的工具链也能用来编译内核。
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
在STM32MP157的内核中,
Pinctrl驱动中并没有提供pmxops->gpio_request_enable
或pmxops->request
,
为什么也可一直接使用GPIO功能?
它的gpio_chip结构体中,有direction_input
、direction_output
,这2个函数的调用关系如下:
direction_output/direction_input
pinctrl_gpio_direction
ret = pinmux_gpio_direction(pctldev, range, pin, input);
ret = ops->gpio_set_direction(pctldev, range, pin, input);
stm32_pmx_gpio_set_direction
stm32_pmx_set_mode // 它会设置引脚为GPIO功能
IMX6ULL使用GPIO时必须设置Pinctrl,如果不设置,只有那些默认就是GPIO功能的引脚可以正常使用。
原因:
### 6. IMX6ULL的特殊情况
IMX6ULL使用GPIO时必须设置Pinctrl,如果不设置,只有那些默认就是GPIO功能的引脚可以正常使用。
原因:
* GPIO控制器的设备树中,没有`gpio-ranges`
* Pinctrl驱动中并没有提供`pmxops->gpio_request_enable`或`pmxops->request`
* gpio_chip结构体中`direction_input`、`direction_output`,并没有配置引脚为GPIO功能