最新文�? 自抗扰控制算法(一)—_Simulink实现 四旋翼飞行器建模(一)—_动力学及运动学方程 四旋翼飞行器建模(二)—_Simulink实现 自抗扰控制算法(二)—_S-fuction实现 自抗扰控制算法(三)—_控制实例
设备树与 Linux 内核设备驱动模型的整合_kernel 驱动模型-CSDN博客 历史版本:
上次修改时间:
;of_platform_default_populate-->;\n of_platform_populate-->;\n/**\n * of_platform_populate() - Populate platform_devices from device tree data\n * @root: parent of the first level to probe or NULL for the root of the tree\n * @matches: match table, NULL to use the default\n * @lookup: auxdata table for matching id and platform_data with device nodes\n * @parent: parent to hook devices from, NULL for toplevel\n *\n * Similar to of_platform_bus_probe(), this function walks the device tree\n * and creates devices from nodes. It differs in that it follows the modern\n * convention of requiring all device nodes to have a \'compatible\' property,\n * and it is suitable for creating devices which are children of the root\n * node (of_platform_bus_probe will only create children of the root which\n * are selected by the @matches argument).\n *\n * New board support should be using this function instead of\n * of_platform_bus_probe().\n *\n * Returns 0 on success, <; 0 on failure.\n */\nint of_platform_populate(struct device_node *root,\n const struct of_device_id *matches,\n const struct of_dev_auxdata *lookup,\n struct device *parent)\n{\n struct device_node *child;\n int rc = 0;\n\n root = root ? of_node_get(root) : of_find_node_by_path(\"/\"); >;>;>;>;>;>;>; 使用 of_find_node_by_path(\"/\") 查找设备树的根节点\n if (!root)\n return -EINVAL;\n\n pr_debug(\"%s()\\n\", __func__);\n pr_debug(\" starting at: %s\\n\", root->;full_name);\n\n for_each_child_of_node(root, child) { >;>;>;>;>; 宏遍历 root 的每一个子节点。每个子节点表示设备树中的一个设备节点\n rc = of_platform_bus_create(child, matches, lookup, parent, true);\n >;>;>;>;>;>;>; 对每一个子节点调用 of_platform_bus_create() 函数,将设备节点转换为 platform_device,并注册到平台总线 (platform_bus) 上\n if (rc) {\n of_node_put(child);\n break;\n }\n }\n of_node_set_flag(root, OF_POPULATED_BUS);\n //>;>;>;>;>;在所有子节点被处理后,of_platform_populate 会标记该设备节点为 OF_POPULATED_BUS。这表示这个总线已经被成功地填充了(即设备树的节点已经被转换并注册为设备)\n of_node_put(root);\n return rc;\n}\n\n```\n1. **驱动与设备的匹配**:\n### 注\n\n当然,也不是全部的节点都是挂在bus上的,比如下面三个节点:\n\n以memory节点为例子,这部分的处理可以参考setup_arch->;setup_machine_fd->;early_init_dt_scan_nodes->;of_scan_flat_dt->;early_init_dt_scan_memory\n\n```\nLinux-4.9.88\\Linux-4.9.88\\drivers\\of\\fdt.c:\n/**\n * early_init_dt_scan_memory - Look for an parse memory nodes\n */\nint __init early_init_dt_scan_memory(unsigned long node, const char *uname,\n int depth, void *data)\n//node: 当前扫描的设备节点的地址。\n//uname: 当前节点的名称。\n//depth: 当前节点的深度(树的层级)。\n//data: 额外的数据(这里未使用)\n{\n const char *type = of_get_flat_dt_prop(node, \"device_type\", NULL); ——————获取当前节点的 device_type 属性,以确定该节点是否是内存节点\n const __be32 *reg, *endp;\n int l;\n \n /* We are scanning \"memory\" nodes only */\n if (type == NULL) {\n /*\n * The longtrail doesn\'t have a device_type on the\n * /memory node, so look for the node called /memory@0.\n */\n if (!IS_ENABLED(CONFIG_PPC32) || depth != 1 || strcmp(uname, \"memory@0\") != 0)\n return 0;\n } else if (strcmp(type, \"memory\") != 0)\n return 0;\n\n reg = of_get_flat_dt_prop(node, \"linux,usable-memory\", &l); ——————函数获取节点的内存属性\n if (reg == NULL)\n reg = of_get_flat_dt_prop(node, \"reg\", &l);\n if (reg == NULL)\n return 0;\n\n endp = reg + (l / sizeof(__be32));\n\n pr_debug(\"memory scan node %s, reg size %d,\\n\", uname, l);\n\n while ((endp - reg) >;= (dt_root_addr_cells + dt_root_size_cells)) { ————————遍历内存节点\n u64 base, size;\n\n base = dt_mem_next_cell(dt_root_addr_cells, &reg);————————内存的起始地址\n size = dt_mem_next_cell(dt_root_size_cells, &reg);————————大小\n\n if (size == 0)\n continue;\n pr_debug(\" - %llx , %llx\\n\", (unsigned long long)base,\n (unsigned long long)size);\n\n early_init_dt_add_memory_arch(base, size); ——————将内存信息添加到系统架构中\n }\n\n return 0;\n}\n函数通过解析设备树中的 memory 节点,提取出内存的基地址和大小\n然后调用 early_init_dt_add_memory_arch 函数将这些内存区域添加到内核的内存管理系统中。\n\n```\n\n## 2. drivers/base/platform.c和drivers/of/platform.c\n\ndrivers/base/platform.c:这个文件处理 平台设备(platform devices) 和 平台驱动(platform drivers) 的通用实现,与设备树无关。\n\n```\nplatform_device_register(): 注册一个平台设备。 \nplatform_driver_register(): 注册一个平台驱动程序。\nplatform_match(): 匹配平台设备与驱动。\n\n```\n\n平台设备模型允许开发者通过 `struct platform_device` 和 `struct platform_driver` 定义设备和驱动程序,分别对应于硬件设备和管理设备的驱动程序。`drivers/base/platform.c` 适用于 **不依赖于设备树** 的系统,或者那些通过直接编程静态平台设备的系统。典型的例子包括不使用设备树的嵌入式系统或者通过代码硬编码设备和资源的平台设备。\n\n---\n\n\ndrivers/of/platform.c:这个文件处理的是基于 设备树(Device Tree, DT) 的平台设备及驱动的实现,与设备树相关联。\n\n```\nof_platform_bus_probe(): 解析设备树,扫描指定总线的子节点,注册这些设备到总线上。\nof_platform_device_create(): 根据设备树的节点创建一个平台设备。\nof_platform_populate(): 扫描设备树的根节点,将所有与某个总线相关的设备节点创建为 platform_device,并注册到总线上。\n\n```\n\n设备树通常包含嵌入式系统中设备的详细描述,包括硬件资源和属性。`drivers/of/platform.c` 的任务就是将这些描述从设备树转换成内核中的 `platform_device`,这样驱动程序就可以通过 `platform_driver` 来匹配和管理它们。`drivers/of/platform.c` 适用于 **基于设备树** 的系统,特别是现代的 ARM 平台和其他依赖设备树来描述硬件布局的系统。在这些系统中,硬件的详细信息通常由设备树提供,而不是通过静态代码硬编码在内核中。\n\n---\n\n\n对于drivers/base/platform.c中的platform_device_register(),其实用的不多,更多的是用form_driver_register()来注册一个驱动,至于platfrom_device其实更多的是交由drivers/of/platform.c中的of_platform_populate去创建,毕竟现在对于硬件资源的指定更多依赖于设备树,很少自己去.c文件去指定然后手动注册。\n -->
0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image

. 闽ICP备19002644号