【设备树笔记整理7】实践操作
1 使用设备树给DM9000网卡_触摸屏指定中断
1.1 修改方法
根据设备节点的compatible属性,在驱动程序中构造/注册 platform_driver,在 platform_driver 的 probe 函数中获得中断资源。
1.2 实验方法
以下是修改好的代码:第6课第1节_网卡_触摸屏驱动\001th_dm9000\dm9dev9000c.c
第6课第1节_网卡_触摸屏驱动\002th_touchscreen\s3c_ts.c
分别上传到内核如下目录:
drivers/net/ethernet/davicom
drivers/input/touchscreen
(1)编译内核
(2)使用新的uImage启动
(3)测试网卡
ifconfig eth0 192.168.1.101
ping 192.168.1.1
(4)测试触摸屏
hexdump /dev/evetn0 // 然后点击触摸屏
1.3 图示
(1)图1

(2)图2

(3)图3

2 在设备树中时钟的简单使用
2.1 笔记
(1)设备树中定义了各种时钟,在文档中称之为"Clock providers",比如:
clocks: clock-controller@4c000000 {compatible = "samsung,s3c2440-clock";reg = <0x4c000000 0x20>;#clock-cells = <1>; // 想使用这个clocks时要提供1个u32来指定它, 比如选择这个clocks中发出的LCD时钟、PWM时钟};
(2)设备需要时钟时,它是"Clock consumers",它描述了使用哪一个"Clock providers"中的哪一个时钟(id),比如:
fb0: fb@4d000000{compatible = "jz2440,lcd";reg = <0x4D000000 0x60>;interrupts = <0 0 16 3>;clocks = <&clocks HCLK_LCD>; // 使用clocks即clock-controller@4c000000中的HCLK_LCD };
(3)驱动中获得/使能时钟:
// 确定时钟个数int nr_pclks = of_count_phandle_with_args(dev->of_node, "clocks","#clock-cells");// 获得时钟for (i = 0; i < nr_pclks; i++) {struct clk *clk = of_clk_get(dev->of_node, i);}// 使能时钟clk_prepare_enable(clk);// 禁止时钟clk_disable_unprepare(clk);
(4)参考文档:
- 内核 Documentation/devicetree/bindings/clock/clock-bindings.txt
- 内核 Documentation/devicetree/bindings/clock/samsung,s3c2410-clock.txt
2.2 图示


3 在设备树中pinctrl的简单使用
3.1 笔记
3.1.1 几个概念
(1)Bank
以引脚名为依据, 这些引脚分为若干组, 每组称为一个Bank,比如s3c2440里有GPA、GPB、GPC等Bank,每个Bank中有若干个引脚,比如GPA0,GPA1, ...,GPC0,GPC1,... 等引脚。
(2) Group
以功能为依据, 具有相同功能的引脚称为一个Group,比如s3c2440中串口0的TxD、RxD引脚使用 GPH2,GPH3,那这2个引脚可以列为一组,比如s3c2440中串口0的流量控制引脚使用GPH0,GPH1,那这2个引脚也可以列为一组。
(3)State
设备的某种状态,比如内核自己定义的"default","init","idel","sleep"状态;也可以是其他自己定义的状态,比如串口的"flow_ctrl"状态(使用流量控制)。设备处于某种状态时,它可以使用若干个Group引脚。
3.1.2 设备树中 pinctrl 节点
(1)它定义了各种 pin bank,比如s3c2440有GPA,GPB,GPC,...,GPB各种BANK,每个BANK中有若干引脚:
pinctrl_0: pinctrl@56000000 {reg = <0x56000000 0x1000>;gpa: gpa {gpio-controller;#gpio-cells = <2>; /* 以后想使用gpa bank中的引脚时, 需要2个u32来指定引脚 */};gpb: gpb {gpio-controller;#gpio-cells = <2>;};gpc: gpc {gpio-controller;#gpio-cells = <2>;};gpd: gpd {gpio-controller;#gpio-cells = <2>;};};
(2)它还定义了各种group(组合),某种功能所涉及的引脚称为group,比如串口0要用到2个引脚:gph0,gph1:
uart0_data: uart0-data {samsung,pins = "gph-0", "gph-0";samsung,pin-function = <2>; /* 在GPHCON寄存器中gph0,gph1可以设置以下值:0 --- 输入功能1 --- 输出功能2 --- 串口功能我们要使用串口功能, samsung,pin-function 设置为2*/};uart0_sleep: uart0_sleep {samsung,pins = "gph-0", "gph-1";samsung,pin-function = <0>; /* 在GPHCON寄存器中gph0,gph1可以设置以下值:0 --- 输入功能1 --- 输出功能2 --- 串口功能我们要使用输入功能, samsung,pin-function 设置为0*/};
3.1.3 设备节点中要使用某一个 pin group:
serial@50000000 {......pinctrl-names = "default", "sleep"; /* 既是名字, 也称为state(状态) */pinctrl-0 = <&uart0_data>;pinctrl-1 = <&uart0_sleep>;};# pinctrl-names中定义了2种state: default 和 sleep,# default 对应的引脚是: pinctrl-0, 它指定了使用哪些pin group: uart0_data# sleep 对应的引脚是: pinctrl-1, 它指定了使用哪些pin group: uart0_sleep
3.1.4 platform_device,platform_driver匹配时:
really_probe:/* If using pinctrl, bind pins now before probing */ret = pinctrl_bind_pins(dev);dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_DEFAULT); /* 获得"default"状态的pinctrl */dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_INIT); /* 获得"init"状态的pinctrl */ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state); /* 优先设置"init"状态的引脚 */ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state); /* 如果没有init状态, 则设置"default"状态的引脚 */......ret = drv->probe(dev);
所以:如果设备节点中指定了pinctrl,在对应的probe函数被调用之前,先"bind pins",即先绑定、设置引脚。
3.1.5 驱动中想选择、设置某个状态的引脚:
devm_pinctrl_get_select_default(struct device *dev); // 使用"default"状态的引脚pinctrl_get_select(struct device *dev, const char *name); // 根据name选择某种状态的引脚pinctrl_put(struct pinctrl *p); // 不再使用, 退出时调用
3.1.6 参考文档
- 内核 Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
3.2 图示
(1)Bank

(2)Group

(3)State

(4)设备结点

4 使用设备树给LCD指定各种参数
4.1 参考文章
讓TQ2440也用上設備樹(1) - 摩斯电码 - 博客园
4.2 参考代码
https://github.com/pengdonglin137/linux-4.9/blob/tq2440_dt/drivers/video/fbdev/s3c2410fb.c
4.3 实验方法
(1)替换dts文件
把"jz2440_irq.dts" 放入内核 arch/arm/boot/dts目录
(2)替换驱动文件
把"s3c2410fb.c" 放入内核 drivers/video/fbdev/ 目录,修改内核 drivers/video/fbdev/Makefile:
obj-$(CONFIG_FB_S3C2410) += lcd_4.3.o
改为:
obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o
(3)编译驱动、编译dtbs
export PATH=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/system/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
cp config_ok .config
make uImage // 生成 arch/arm/boot/uImage
make dtbs // 生成 arch/arm/boot/dts/jz2440_irq.dtb
(4)使用上述uImage,dtb启动内核即可看到LCD有企鹅出现
4.4 设备树相关
(1)设备树中的描述
fb0: fb@4d000000{compatible = "jz2440,lcd";reg = <0x4D000000 0x60>;interrupts = <0 0 16 3>;clocks = <&clocks HCLK_LCD>; /* a. 时钟 */clock-names = "lcd";pinctrl-names = "default"; /* b. pinctrl */pinctrl-0 = <&lcd_pinctrl &lcd_backlight &gpb0_backlight>;status = "okay";/* c. 根据LCD引脚特性设置lcdcon5, 指定lcd时序参数 */lcdcon5 = <0xb09>;type = <0x60>;width = /bits/ 16 <480>;height = /bits/ 16 <272>;pixclock = <100000>; /* 单位: ps, 10^-12 S, */xres = /bits/ 16 <480>;yres = /bits/ 16 <272>;bpp = /bits/ 16 <16>;left_margin = /bits/ 16 <2>;right_margin =/bits/ 16 <2>;hsync_len = /bits/ 16 <41>;upper_margin = /bits/ 16 <2>;lower_margin = /bits/ 16 <2>;vsync_len = /bits/ 16 <10>;};&pinctrl_0 {gpb0_backlight: gpb0_backlight {samsung,pins = "gpb-0";samsung,pin-function = <1>;samsung,pin-val = <1>;};
};
4.5 代码中的处理
(1)时钟
info->clk = of_clk_get(dev->of_node, 0);
clk_prepare_enable(info->clk);
(2)pinctrl
代码中无需处理,在platform_device/platform_driver匹配之后就会设置"default"状态对应的pinctrl
(3)根据LCD引脚特性设置lcdcon5,指定lcd时序参数,直接读设备树节点中的各种属性值, 用来设置驱动参数:
of_property_read_u32(np, "lcdcon5", (u32 *)(&display->lcdcon5));of_property_read_u32(np, "type", &display->type);of_property_read_u16(np, "width", &display->width);of_property_read_u16(np, "height", &display->height);of_property_read_u32(np, "pixclock", &display->pixclock);of_property_read_u16(np, "xres", &display->xres);of_property_read_u16(np, "yres", &display->yres);of_property_read_u16(np, "bpp", &display->bpp);of_property_read_u16(np, "left_margin", &display->left_margin);of_property_read_u16(np, "right_margin", &display->right_margin);of_property_read_u16(np, "hsync_len", &display->hsync_len);of_property_read_u16(np, "upper_margin", &display->upper_margin);of_property_read_u16(np, "lower_margin", &display->lower_margin);of_property_read_u16(np, "vsync_len", &display->vsync_len);
4.6 图示
5 补充笔记
5.1 确定内核的虚拟地址、物理地址的关键信息
vmlinux虚拟地址的确定,内核源码:
.config :CONFIG_PAGE_OFFSET=0xC0000000arch/arm/include/asm/memory.h#define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET)arch/arm/Makefiletextofs-y := 0x00008000TEXT_OFFSET := $(textofs-y)arch/arm/kernel/vmlinux.lds.S:. = PAGE_OFFSET + TEXT_OFFSET; // // 即0xC0000000+0x00008000 = 0xC0008000, vmlinux的虚拟地址为0xC0008000arch/arm/kernel/head.S#define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) // 即0xC0000000+0x00008000 = 0xC0008000vmlinux物理地址的确定:
内核源码:
arch/arm/mach-s3c24xx/Makefile.boot :zreladdr-y += 0x30008000 // zImage自解压后得到vmlinux, vmlinux的存放位置params_phys-y := 0x30000100 // tag参数的存放位置, 使用dtb时不再需要tagarch/arm/boot/Makefile:ZRELADDR := $(zreladdr-y)arch/arm/boot/Makefile:UIMAGE_LOADADDR=$(ZRELADDR)scripts/Makefile.lib:UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR) // 制作uImage的命令, uImage = 64字节的头部 + zImage, 头部信息中含有内核的入口地址(就是vmlinux的物理地址)cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \-C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \-T $(UIMAGE_TYPE) \-a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \-n $(UIMAGE_NAME) -d $(UIMAGE_IN) $(UIMAGE_OUT)
5.2 参考
00-Linux设备树系列-简介 - 飞翔de刺猬 - CSDN博客.html
https://blog.csdn.net/lhl_blog/article/details/82387486
Linux kernel的中断子系统之(二):IRQ Domain介绍_搜狐科技_搜狐网.html
http://www.sohu.com/a/201793206_467784
基于设备树的TQ2440的中断(1)
https://www.cnblogs.com/pengdonglin137/p/6847685.html
基于设备树的TQ2440的中断(2)
https://www.cnblogs.com/pengdonglin137/p/6848851.html
基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)
http://www.cnblogs.com/pengdonglin137/p/6349209.html
Linux kernel的中断子系统之(一):综述
http://www.wowotech.net/irq_subsystem/interrupt_subsystem_architecture.html
Linux kernel的中断子系统之(二):IRQ Domain介绍
linux kernel的中断子系统之(三):IRQ number和中断描述符
linux kernel的中断子系统之(四):High level irq event handler
Linux kernel中断子系统之(五):驱动申请中断API
Linux kernel的中断子系统之(六):ARM中断处理过程
linux kernel的中断子系统之(七):GIC代码分析
相关文章:
【设备树笔记整理7】实践操作
1 使用设备树给DM9000网卡_触摸屏指定中断 1.1 修改方法 根据设备节点的compatible属性,在驱动程序中构造/注册 platform_driver,在 platform_driver 的 probe 函数中获得中断资源。 1.2 实验方法 以下是修改好的代码:第6课第1节_网卡_触摸…...
使用VisualStudio制作上位机(六)
文章目录 使用VisualStudio制作上位机(六)第五部分:应用程序打包第一步:勾选为Release模式第二步:生成解决方案第三步:将我们额外添加的文件放入到Release这个文件夹里 使用VisualStudio制作上位机…...
包管理工具--》npm的配置及使用(一)
目录 🌟概念 🌟背景 🌟前端包管理器 🌟包的安装 本地安装 全局安装 🌟包配置 配置文件 保存依赖关系 🌟包的使用 🌟写在最后 🌟概念 模块(module)…...
期货基础知识
一、期货是什么? 期货是与现货相对应,并由现货衍生而来。期货通常指期货合约,期货与现货完全不同,现货是实实在在可以交易的货(商品),期货主要不是货,而是以某种大众产品如棉花、大…...
NC后端扩展开发
前言 在日常的工作中,会遇到各种各样的需要进行扩展开发的需求,可以使用系统预留的扩展开发机制来实现,避免修改源码。因NC产品已迭代至BIP版本,所以前端扩展方式就再进行不赘述了,本文主要介绍后端扩展开发方式&…...
nginx vue2+webpack 和 vue3+vite 配置二级目录访问
我们开发中会遇到这样的需求,让我们用服务器nginx部署一个用域名的二级目录来访问项目 https:xxx/二级目录/来放访问项目 目录 思路 1、nginx配置(vue2 和 vue3配置的nginx相同) 2、vue2webpack的配置 (1࿰…...
无需租云服务器,Linux本地搭建web服务,并内网穿透发布公网访问
文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…...
算法leetcode|76. 最小覆盖子串(rust重拳出击)
文章目录 76. 最小覆盖子串:样例 1:样例 2:样例 3:提示:进阶: 分析:在这里插入图片描述 题解:rust:go:c:python:java: 76.…...
如何让你的jupyter notebook 排版得像Word(Markdown和网页文件写法)
案例背景 很多时候我们在jupyter notebook里面的写代码,画图,但是文字分析什么的写在里面纯文本不好看,需要进行排版,那么就得用markdown的写法,如何还想居中或者更花里胡哨的字体,那就得要网页文件的一些…...
AndroidTV端:酒店扫码认证投屏DLNA
被老板叼了几次了,最近实在忍不了,准备离职; 但是担心离职后长时间没有办法找到工作 就想贡献一套平时琢磨出来的程序,请各位有能力的话带我熬过这凛冽的寒冬。 目前写出来的,有三个端:安卓TV端…...
基于PyTorch的交通标志目标检测系统
一、开发环境 Windows 10PyCharm 2021.3.2Python 3.7PyTorch 1.7.0 二、制作交通标志数据集,如下图 三、配置好数据集的地址,然后开始训练 python train.py --data traffic_data.yaml --cfg traffic_yolov5s.yaml --weights pretrained/yolov5s.pt --e…...
feign调用失败 feign.RetryableException: xxx-service executing GET http://xxx/test
一。 问题引入 升级springcloud的版本后 突然发现 以前正常的feign调用也报错了 升级后的各组件版本如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 错误日志如下 feign.RetryableException: xxx-service executing GET http://xxx-servic…...
mysql 用户管理
目录 用户 创建用户 删除用户 修改密码 权限管理 赋权 查看权限 插销权限 总结 用户 mysql 的用户都存在于系统数据库 mysql 的user 表中 mysql> show tables; --------------------------- | Tables_in_mysql | --------------------------- | column…...
pyinstaller打包exe运行闪退
这里写自定义目录标题 前言问题描述解决过程 前言 闪退原因可能有很多,这里记录下我遇到的问题,简单来说是dll调用错误导致的闪退,因为我的python用的是32位的,但是pyinstaller却是64位的,属于用conda的时候没注意。 …...
ARM 汇编基础知识
1.为什么学习汇编? 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一 上电 SP 指针还没初始化, C 环境还没准备好,所以肯定不能运行 C 代码,必须先用汇编语言设置好 C 环境…...
CRM 自动化如何改善销售和客户服务?
许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程,使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程,让团队有更多的时间来执行高价值的任务,而不是陷于一堆琐碎事情中。 什么是CRM自动化? CRM 自动化是指 C…...
Bean 的六种作用域
目录 一、作用域是什么? 1、singleton(单例作用域) 2、prototype(原型作用域) 3、request(请求作用域) 4、session(回话作用域) 5、application(全局作用域&a…...
go语言--锁
锁的基础,go的锁是构建在原子操作和信号锁之上的 原子锁 原子包实现协程的对同一个数据的操作,可以实现原子操作,只能用于简单变量的简单操作,可以把多个操作变成一个操作 sema锁 也叫信号量锁/信号锁 核心是一个uint32值&#…...
再见,CSDN
从我2018年1月31日加入CSDN,到现在已经5年多的时间了。在这5年里,陆陆续续在CSDN上发布了很多论文阅读笔记、教程、技术文章等等,记录了我从大四到研究生再到工作这段时间的学习和成长轨迹。 我一直有备份个人资料的习惯,尤其是耗…...
MySQL总复习
目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select where like 编辑 范围查找 order by 聚合函数 count max min sum avg g…...
文件 IO
目录 一. 文件 1.1 文件的概念 1.2 文件目录 1.3 文件路径 1.3.1 绝对路径 1.3.2 相对路径 1.4 文件的类型 二. IO 2.1 文件系统操作-- File类 2.1.1 File类的构造方法 2.1.2 File类中的方法 2.2 文件内容操作 2.2.1 字节流 2.2.1.1 InputStream中的方法 2.2.1.2…...
Zotero Reference学术文献管理工具全攻略:从入门到精通
Zotero Reference学术文献管理工具全攻略:从入门到精通 【免费下载链接】zotero-reference PDF references add-on for Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-reference 一、核心价值:重构学术文献管理流程 节省70%文献整…...
Qwen2.5-VL底座+lychee-rerank-mm效果惊艳:批量图片智能打分可视化展示
Qwen2.5-VL底座lychee-rerank-mm效果惊艳:批量图片智能打分可视化展示 1. 项目简介 这是一个专门为RTX 4090显卡(24G显存)打造的智能图片排序系统。核心基于阿里通义千问Qwen2.5-VL多模态大模型,结合Lychee-rerank-mm专业重排序…...
如何利用社交媒体平台来优化网站SEO
如何利用社交媒体平台来优化网站SEO 在当今的数字化时代,社交媒体已经成为每个企业和个人不可或缺的一部分。作为网站运营者,我们常常面临如何通过社交媒体平台来优化网站SEO(搜索引擎优化)的问题。本文将深入探讨这一话题&#…...
基于FireRedASR-AED-L的会议语音转写系统实战
基于FireRedASR-AED-L的会议语音转写系统实战 会议记录不再需要人工逐字整理,智能语音转写让会议纪要自动生成 1. 会议语音转写的痛点与解决方案 每次开完会,最头疼的就是整理会议纪要。人工记录不仅效率低下,还容易遗漏重要内容。特别是多人…...
【OpenClaw】测试工程师如何使用 OpenClaw 参与测试流程
测试工程师如何使用 OpenClaw 参与测试流程1.OpenClaw 能帮测试工程师做什么?2.核心能力:Skill 让 AI 具备测试执行能力2.1 API 测试 Skill2.2 浏览器自动化 Skill2.3 数据库操作 Skill3.实战工作流:让 OpenClaw 跑通你的测试流程3.1 工作流 …...
YOLOv5与DeepSort结合优化:如何调整参数让目标跟踪更精准(附代码对比)
YOLOv5与DeepSort参数调优实战:提升目标跟踪精度的关键策略 在计算机视觉领域,目标跟踪技术正从实验室快速走向工业应用。当基础功能实现后,如何让系统在实际场景中表现更稳定、更精准,成为开发者面临的核心挑战。本文将深入剖析Y…...
HarmonyOS ArkTS开发实战:用Axios封装一个带拦截器的网络请求工具类
HarmonyOS ArkTS实战:构建企业级Axios网络请求工具库 在HarmonyOS应用开发中,网络请求作为数据交互的核心通道,其稳定性和可维护性直接影响应用质量。本文将带你从零构建一个支持Token自动刷新、错误统一处理的Axios企业级封装库,…...
OpenClaw浏览器自动化:Qwen3-4B驱动网页检索与内容抓取
OpenClaw浏览器自动化:Qwen3-4B驱动网页检索与内容抓取 1. 为什么选择OpenClaw做浏览器自动化? 去年我接手了一个市场调研项目,需要从30多个行业网站抓取最新动态。最初尝试用Python写爬虫,但每个网站的页面结构差异太大&#x…...
GX Works2编程避坑指南:PLC数据传输指令(MOV/FMOV/BMOV)的5个常见错误与正确写法
GX Works2编程避坑指南:PLC数据传输指令的5个致命陷阱与工业级解决方案 在自动化产线的深夜调试现场,一个看似简单的MOV指令错误可能导致整条生产线异常停机——这种场景对PLC工程师来说绝不陌生。三菱GX Works2作为工业控制领域的标杆软件,其…...
