【设备树笔记整理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…...

桌面平台层安全随手记录
声明 本文是学习桌面云安全技术要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 桌面平台层安全 桌面接入安全 用户标识 一般要求 本项要求包括: a) 系统应为用户提供唯一的身份标识,同时将用户的身份标识与该用户的所…...

【Docker】 08-Dockerfile
什么是Dockerfile Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的教程,主要作用是用来构建docker镜像的构建文件。 Dockerfile解析过程 Dockerfile的保留命令 保留字作用FROM当前镜像是基于哪个镜像的 第一个指令必须是FROMMA…...

【二等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「Aries」解题思路
第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…...

Github 下载指定文件夹(git sparse-checkout)
比如要下载这里的 data_utils 步骤 1、新建空文件夹,并进入新建的空文件夹。 2、git init 初始化 3、git remote add origin 添加远程仓库 4、git config core.sparsecheckout true 允许稀疏检出 5、git sparse-checkout set 设置需要拉取的文件夹(可…...

蚂蚁集团SQLess 开源,与内部版有何区别?
当我们使用关系型数据库时,SQL 是联系起用户和数据库的一座桥梁。 SQL 是一种高度非过程化的语言,当我们在编写SQL 时,表达的是想要什么数据,而不是怎么获取数据。因此,我们往往更关心SQL 有没有满足业务逻辑ÿ…...

An Efficient Memory-Augmented Transformer for Knowledge-Intensive NLP Tasks
本文是LLM系列文章,针对《An Efficient Memory-Augmented Transformer for Knowledge 一种用于知识密集型NLP任务的高效内存增强转换器 摘要1 引言2 相关工作3 高效内存增强Transformer4 EMAT的训练流程5 实验6 分析7 结论局限性 摘要 获取外部知识对于许多自然语言…...

Java项目中jar war pom包的区别
1、pom:用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom。 <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.wong.tech</groupId> <artifactI…...

整理mongodb文档:分页
个人博客 整理mongodb文档:分页 个人博客,求关注,如果文章不够清晰,麻烦指出。 文章概叙 本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。 分页的情况很经常出现,这也是这篇博客诞生的理由。 数据准备…...

社区团购新玩法,生鲜蔬菜配货发货小程序商城
在当前的电商市场中,生鲜市场具有巨大的潜力和发展空间。为了满足消费者的需求,许多生鲜店正在寻找创新的方法来提高销售和客户满意度。其中,制作一个个性且功能强大的生鲜小程序商城是一个非常有效的策略。以下是在乔拓云平台上制作生鲜小程…...

shell bash中设置命令set
1 Preface/Foreword set命令用于shell脚本在执行命令时候,遇到异常的处理机制。 2 Usage 2.1 set -e 当执行命令过程中遇到异常,那么就退出脚本,不会往下执行其它命令。 #!/bin/bash #set -eroot GIT_TAG${CI_BUILD_TAG-NOTAG} GIT_REV…...