【UBOOT DM框架下pinctrl功能实现(经典pin_generic用法)】

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";
	        };
            };
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值