【设备树笔记整理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…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
