UBOOT DM框架下pinctrl功能实现(经典pin_generic用法)
1、U_BOOT_DRIVER中实现.name、.id、.of_match、.ofdata_to_platdata、.ops、.probe、.priv_auto_alloc_size等回调函数的实现;
2、处理流程:(1)设备树中的compatible属性与驱动代码中的compatible属性字符串匹配,
(2)匹配完成后,在ofdata_to_platdata函数中实现设备树reg(地址)的获取,若有多个reg地址,可以通过dev_remap_addr_index(dev, n)(n为0,代表第1个reg地址)来获取;
(3).probe函数中实现pin脚数据结构的填充和获取,通常是将自己定义的数据结构赋值给DM框架中udevice *dev(dev_get_priv(dev))的私有变量,实现自身数据向DM框架udevice私有数据的转移,给后续的ops使用;
(4).ops中实现pin_groups、pin_functions、.set_state(经典pin_generic使用框架中的pinctrl_generic_set_state)等函数;
3、调用pinctrl函数set_mux和set_config的框架详细流程:
device_probe --> pinctrl_select_state --> pinctrl_select_state_full --> pinctrl_config_one
–> ops = pinctrl_get_ops(pctldev) --> ops->set_state(pctldev, config) --> pinctrl_generic_set_state
–> pinctrl_generic_set_state_subnode --> pinctrl_generic_set_state_one --> pinmux_enable_setting\pinconf_enable_setting
–> ops->pinmux_group_set\pinconf_group_set.
上述流程只是驱动代码,驱动实际使用需要结合设备树,细节没有太多描述;
设备树举例:
uart0: serial@xxxx {
compatible = “aaa”;
reg = ;
interrupts = ;
clock-frequency = ;
reg-io-width = <4>;
reg-shift = <2>;
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins>;
status = "okay";
};
&pinctrl {
uart0_pins:uart0{
uart0_grp0 {
pins = “xxxx”;
function = “UART_TX”;
};
uart0_grp1 {
pins = "xxxx";
function = "UART_RX";
};
};