企业形象网站建设织梦网站头部

张小明 2026/1/1 14:29:17
企业形象网站建设,织梦网站头部,dedecms做网站有多快,个人网站 不备案最近在工作中遇到了gpio解析失败的问题#xff0c;跟踪发现设备树配置的字符串不匹配#xff0c;在这里再次学习并记录下。 of_get_named_gpio 以前在工作中更多使用的是of_get_named_gpio这个标准函数#xff0c;用以直接获取gpio。只要指定其具体的属性名#xff0c;一般…最近在工作中遇到了gpio解析失败的问题跟踪发现设备树配置的字符串不匹配在这里再次学习并记录下。of_get_named_gpio以前在工作中更多使用的是of_get_named_gpio这个标准函数用以直接获取gpio。只要指定其具体的属性名一般就能正常获取其gpio号而本次使用另外一个接口获取的是gpio描述符结构体。就碰到问题了devm_gpiod_get源码物位置kernel/driver/gpio/gpiolib-devres.c/** * devm_gpiod_get - Resource-managed gpiod_get() * dev: GPIO consumer * con_id: function within the GPIO consumer * flags: optional GPIO initialization flags * * Managed gpiod_get(). GPIO descriptors returned from this function are * automatically disposed on driver detach. See gpiod_get() for detailed * information about behavior and return values. */structgpio_desc*__must_checkdevm_gpiod_get(structdevice*dev,constchar*con_id,enumgpiod_flagsflags){returndevm_gpiod_get_index(dev,con_id,0,flags);}此接口是linux内核标准接口下面来解析下其具体的参数函义dev 指定此gpio的使用者一般需要拿到此dev的of_node属性节点。然后从所有的属性中查找指定的字符串。所以此参数不能为空con_id 找定查找的gpio属性名因为可能存在多个gpio属性配置使用多个属性名。此参数可为空如果为空则查找系统指定的字符串flags gpio初始化状态,可以为以下值的任意一个enumgpiod_flags{GPIOD_ASIS0,GPIOD_INGPIOD_FLAGS_BIT_DIR_SET,GPIOD_OUT_LOWGPIOD_FLAGS_BIT_DIR_SET|GPIOD_FLAGS_BIT_DIR_OUT,GPIOD_OUT_HIGHGPIOD_FLAGS_BIT_DIR_SET|GPIOD_FLAGS_BIT_DIR_OUT|GPIOD_FLAGS_BIT_DIR_VAL,GPIOD_OUT_LOW_OPEN_DRAINGPIOD_OUT_LOW|GPIOD_FLAGS_BIT_OPEN_DRAIN,GPIOD_OUT_HIGH_OPEN_DRAINGPIOD_OUT_HIGH|GPIOD_FLAGS_BIT_OPEN_DRAIN,};大体函义如下GPIOD_ASIS 不需要对gpio作任何修改GPIOD_IN gpio为输入GPIOD_OUT_LOW gpio为输出并拉低GPIOD_OUT_HIGH gpio为输出并拉高GPIOD_OUT_LOW_OPEN_DRAIN gpio漏极开路输出并拉低GPIOD_OUT_HIGH_OPEN_DRAIN gpio漏极开路输出并拉高此函数的调用流程如下devm_gpiod_get_indexNon-Exclusive :此模式允许多个进程或任务同时访问同一个GPIO引脚需要对资源访问加锁of_find_gpiostatic__maybe_unusedconstchar*constgpio_suffixes[]{gpios,gpio};structgpio_desc*of_find_gpio(structdevice_node*np,constchar*con_id,unsignedintidx,unsignedlong*flags){charprop_name[32];/* 32 is max size of property name */enumof_gpio_flagsof_flags;constof_find_gpio_quirk*q;structgpio_desc*desc;unsignedinti;/* Try GPIO property foo-gpios and foo-gpio */for(i0;iARRAY_SIZE(gpio_suffixes);i){if(con_id)snprintf(prop_name,sizeof(prop_name),%s-%s,con_id,gpio_suffixes[i]);elsesnprintf(prop_name,sizeof(prop_name),%s,gpio_suffixes[i]);descof_get_named_gpiod_flags(np,prop_name,idx,of_flags);if(!gpiod_not_found(desc))break;}/* Properly named GPIO was not found, try workarounds */for(qof_find_gpio_quirks;gpiod_not_found(desc)*q;q)desc(*q)(np,con_id,idx,of_flags);if(IS_ERR(desc))returndesc;*flagsof_convert_gpio_flags(of_flags);returndesc;}如果有指定属性名那么会进行字符串拼接.拼接的规则是xxx-gpios|xxx-gpio,也就是说实际查找的字符串是添加了后辍的。会轮询查找对应的字符串比如在驱动中使用of_find_gpio(…,“power”,…)那么在DTS中就应该配置power-gpios或者power-gpio如果指定属性名为空那么会直接查找gpios或者gpio所以如果你不想写属性名就直接在DTS中配置其它的一个属性就可以了工作中碰到的查找失败起因就是在此了。of_get_named_gpiod_flagsof_parse_phandle_with_args_map是个系统函数这里不用太关注。只需要关心其输出的结果gpiospecnp 其指向的gpio控制器节点args_count #gpio-size配置的数据args 具体的gpio配置数据structof_phandle_args{structdevice_node*np;intargs_count;uint32_targs[MAX_PHANDLE_ARGS];};of_find_gpiochip_by_xlatestaticstructgpio_chip*of_find_gpiochip_by_xlate(structof_phandle_args*gpiospec){returngpiochip_find(gpiospec,of_gpiochip_match_node_and_xlate);}structgpio_chip*gpiochip_find(void*data,int(*match)(structgpio_chip*gc,void*data)){structgpio_device*gdev;structgpio_chip*gcNULL;unsignedlongflags;spin_lock_irqsave(gpio_lock,flags);list_for_each_entry(gdev,gpio_devices,list)if(gdev-chipmatch(gdev-chip,data)){gcgdev-chip;break;}spin_unlock_irqrestore(gpio_lock,flags);returngc;}上述代码很明显轮询所有的gpio控制器。从而找到匹配的控制器匹配的规则也很简单就两点设备树配置的控制器节点与其中一个控制器相等存在of_xlate回调函数且其返回值0匹配实现如下staticintof_gpiochip_match_node_and_xlate(structgpio_chip*chip,void*data){structof_phandle_args*gpiospecdata;returndevice_match_of_node(chip-gpiodev-dev,gpiospec-np)chip-of_xlatechip-of_xlate(chip,gpiospec,NULL)0;}of_xlate_and_get_gpiod_flagsstaticstructgpio_desc*of_xlate_and_get_gpiod_flags(structgpio_chip*chip,structof_phandle_args*gpiospec,enumof_gpio_flags*flags){intret;if(chip-of_gpio_n_cells!gpiospec-args_count)returnERR_PTR(-EINVAL);retchip-of_xlate(chip,gpiospec,flags);if(ret0)returnERR_PTR(ret);returngpiochip_get_desc(chip,ret);}这里的函数实现完全依赖控制器代码逻辑比较简单这里要搞懂这个实现。需要找一个gpio控制器来研究下这里以gpio-sprd.c为例gpio-sprd控制器staticintsprd_gpio_probe(structplatform_device*pdev){structgpio_irq_chip*irq;structsprd_gpio*sprd_gpio;sprd_gpiodevm_kzalloc(pdev-dev,sizeof(*sprd_gpio),GFP_KERNEL);if(!sprd_gpio)return-ENOMEM;sprd_gpio-irqplatform_get_irq(pdev,0);if(sprd_gpio-irq0)returnsprd_gpio-irq;sprd_gpio-basedevm_platform_ioremap_resource(pdev,0);if(IS_ERR(sprd_gpio-base))returnPTR_ERR(sprd_gpio-base);spin_lock_init(sprd_gpio-lock);sprd_gpio-chip.labeldev_name(pdev-dev);sprd_gpio-chip.ngpioSPRD_GPIO_NR;sprd_gpio-chip.base-1;sprd_gpio-chip.parentpdev-dev;sprd_gpio-chip.requestsprd_gpio_request;sprd_gpio-chip.freesprd_gpio_free;sprd_gpio-chip.getsprd_gpio_get;sprd_gpio-chip.setsprd_gpio_set;sprd_gpio-chip.direction_inputsprd_gpio_direction_input;sprd_gpio-chip.direction_outputsprd_gpio_direction_output;irqsprd_gpio-chip.irq;gpio_irq_chip_set_chip(irq,sprd_gpio_irqchip);irq-handlerhandle_bad_irq;irq-default_typeIRQ_TYPE_NONE;irq-parent_handlersprd_gpio_irq_handler;irq-parent_handler_datasprd_gpio;irq-num_parents1;irq-parentssprd_gpio-irq;returndevm_gpiochip_add_data(pdev-dev,sprd_gpio-chip,sprd_gpio);}这里此控制器的定义从上可以看出此控制器并没有定义。如果控制器没有定义此回调函数则会使用系统默认提供的回调函数of_gpio_simple_xlate此函数是公用的回调函数如果控制器定义了自己的xlate函数则使用控制器自身的如果没有就会使用此函数。到这里gpio的解析流程就基本走完了对gpio子系统认识进一步加深。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站费计入什么科目南通专业做网站

还在为无法复制视频中的硬字幕而烦恼吗?本地OCR技术让视频字幕提取变得简单高效。无需联网、不依赖第三方API,只需几分钟就能将视频中的字幕转换为可编辑的文本文件。 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。…

张小明 2025/12/31 5:46:26 网站建设

成免费crm推广网站唐山广告设计制作公司

在软件测试领域,技术能力如自动化测试、性能分析和缺陷跟踪往往是职业发展的基石。然而,随着敏捷开发、DevOps和跨团队协作的普及,测试工程师的角色已从单纯的技术执行者演变为项目成功的推动者。软技能——包括沟通、情商、问题解决和团队协…

张小明 2025/12/31 5:45:53 网站建设

中国百强城市榜单大连seo皮皮

想要为你的应用添加实时消息推送功能?yudao-cloud WebSocket模块提供了完整的解决方案,让新手也能轻松构建高性能实时通信系统。无论你是需要系统通知、在线客服还是团队协作,这里都有简单易懂的配置方法。 【免费下载链接】yudao-cloud ruoy…

张小明 2025/12/31 5:45:20 网站建设

上海网站开发有限公司太原网站建设pnjfw

信息自由获取新方案:6款实用工具深度评测 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息付费化浪潮席卷的今天,你是否经常遇到心仪的文章被付费墙阻挡在…

张小明 2025/12/31 5:44:47 网站建设

个人建网站步骤宁陵网站建设

在macOS生态中,鼠标滚动的生硬感一直是困扰用户的痛点。Mos作为一款专为优化鼠标滚动体验而设计的工具,通过智能算法彻底改变了这一现状,让普通鼠标也能拥有触控板般的顺滑操作感。无论你是程序员、设计师还是日常办公用户,Mos都能…

张小明 2025/12/31 5:44:14 网站建设

深圳网站品牌建设中小型企业网络拓扑图及配置

基于Kotaemon的智能招聘助手开发全过程 在企业人力资源部门每天被“工作地点在哪”“试用期多久”“什么时候出面试结果”这类重复问题淹没的今天,自动化招聘服务早已不是锦上添花的功能,而是提升效率、优化候选人体验的关键突破口。然而,市面…

张小明 2025/12/31 5:43:41 网站建设