Linux Device Link机制

Linux网络驱动之Fixed-Link(20) 阅读详情

Linux Device Link 机制详解

1. 什么是device link

Device link(设备链接)是Linux内核驱动核心中用来表示设备之间依赖关系的机制。它允许驱动作者描述超越单纯父子层次关系的设备依赖,例如兄弟设备之间的依赖,同时能够让驱动核心自动处理这些依赖关系。

Device link 结合了两种依赖类型:

  1. 排序依赖:保证"供应商(supplier)"设备和"消费者(consumer)"设备之间正确的挂起/恢复和关闭排序列
  2. 驱动存在依赖:保证供应商设备先绑定驱动,消费者设备才会被探测;供应商解除绑定前,消费者会先解除绑定

根据需求,可以通过标志位配置不同行为:

  1. DL_FLAG_STATELESS:只需要正确的挂起/恢复和关闭排序,不需要强制驱动存在依赖
  2. DL_FLAG_PM_RUNTIME:启用运行时PM集成,消费者运行时恢复时自动恢复供应商并保持其活动

2. 为什么需要有device link

默认情况下,Linux驱动核心仅根据设备层次结构中的父子关系处理设备依赖:

  1. 挂起/关闭时:子设备总是在父设备之前挂起
  2. 恢复时:父设备总是在子设备之前恢复

但实际场景中存在更多依赖需求:

  1. 非父子关系的依赖:兄弟设备之间也可能存在依赖,需要保证特定的执行顺序
  2. 驱动存在依赖:一个设备必须等待另一个设备绑定驱动后,自身才能正确探测或运行
    这两种依赖通常同时存在,device link正好满足了这个需求,允许在驱动核心中明确表示这种依赖关系,由内核自动处理。

3. 怎么使用device link机制

3.1 添加时机

可以添加设备链接的最早时间点:对供应商调用 device_add() 并对消费者调用 device_initialize() 之后。

添加时需要注意系统一致性:
不能在挂起/恢复转换过程中添加,需要使用 lock_system_sleep() 防止并发,或者从不会与挂起/恢复并行执行的回调(如 probe 回调、启动时PCI quirk)中添加
如果从消费者 probe 回调添加依赖于供应商的链接,消费者需要在添加后检查供应商存在性,如果不存在则需要延迟探测

3.2 删除时机

如果在 probe 回调中添加无状态(DL_FLAG_STATELESS)设备链接,通常需要在 remove 回调中删除,保持对称
驱动核心管理的设备链接由内核自动删除
删除操作同样需要避免与挂起/恢复转换并行

3.3 常用标志说明

标志
作用
DL_FLAG_STATELESS
不需要驱动存在依赖,仅需排序保证
DL_FLAG_PM_RUNTIME
需要运行时PM集成
DL_FLAG_RPM_ACTIVE
运行时恢复供应商,防止其在消费者运行时挂起
DL_FLAG_AUTOREMOVE_CONSUMER
消费者探测失败或解除绑定时自动清除链接
DL_FLAG_AUTOREMOVE_SUPPLIER
供应商探测失败或解除绑定时自动清除链接

注意:DL_FLAG_AUTOREMOVE_CONSUMER / DL_FLAG_AUTOREMOVE_SUPPLIER /
DL_FLAG_AUTOPROBE_CONSUMER 不能与 DL_FLAG_STATELESS 组合使用。

3.4 限制

托管设备链接(未设置 DL_FLAG_STATELESS)可能导致消费者探测无限期延迟,如果供应商驱动缺失,消费者永远不会被探测
托管设备链接不能直接删除,由内核根据自动删除标志处理;无状态设备链接需要调用者通过 device_link_del() 或 device_link_remove() 主动删除
DL_FLAG_RPM_ACTIVE + DL_FLAG_STATELESS 连续调用可能导致供应商运行时使用计数器泄漏,需要特殊处理

4. device link的实现机制

4.1 数据结构

设备链接将原来的树状设备层次结构转变为有向无环图,每个设备会维护与供应商、消费者的链接关系。

设备链接有明确的状态机定义:

enum device_link_state {
    DL_STATE_NONE = -1,
    DL_STATE_DORMANT = 0,       // supplier和consumer的driver都未绑定
    DL_STATE_AVAILABLE,          // supplier已绑定,consumer还未绑定
    DL_STATE_CONSUMER_PROBE,     // consumer正在probe,且supplier driver已就位
    DL_STATE_ACTIVE,             // consumer和supplier都已绑定
    DL_STATE_SUPPLIER_UNBIND,    // supplier driver正在解绑
};

4.2 状态转换

初始状态:device_link_add() 根据供应商和消费者驱动存在情况自动设置,如果探测前创建,进入 DL_STATE_DORMANT
当供应商绑定驱动:链接进入 DL_STATE_AVAILABLE(driver_bound() → device_links_driver_bound())
探测消费者前:检查供应商是否就绪,如果就绪状态更新为 DL_STATE_CONSUMER_PROBE(really_probe() → device_links_check_suppliers())
探测失败:回到 DL_STATE_AVAILABLE
探测成功:进入 DL_STATE_ACTIVE
消费者驱动移除:回到 DL_STATE_AVAILABLE
供应商驱动移除前:将未绑定消费者的链接更新为 DL_STATE_SUPPLIER_UNBIND,触发消费者解绑,完成后回到 DL_STATE_DORMANT

4.3 排序实现

挂起/恢复排序由 dpm_list 确定,关闭排序由 devices_kset 确定
默认情况下,列表是设备树的扁平化表示,设备位于所有祖先之后
添加设备链接后,为满足"消费者必须在所有供应商之后"的约束,会将消费者及其整个子图移动到列表末尾(device_link_add() → device_reorder_to_tail())
添加链接前会验证依赖,防止循环(device_link_add() → device_is_dependent()),如果检测到循环会返回错误

4.4 基于设备树的自动创建

Linux内核会在设备树解析阶段自动处理常见资源依赖,创建对应的fwnode link:
时钟(clocks)、互连(interconnects)、IOMMU、邮箱(mboxes)、DMA、电源域等常用属性会被系统自动处理
在 device_add 过程中,会调用 fw_devlink_link_device 将fwnode link转换为实际的device link

int device_add(struct device *dev)
{
    // ...
    if (dev->fwnode && !dev->fwnode->dev) {
        dev->fwnode->dev = dev;
        fw_devlink_link_device(dev);
    }
    // ...
}

4.5 探测处理

在真正probe消费者设备之前,内核会检查所有供应商是否就绪:

int device_links_check_suppliers(struct device *dev)
{
    list_for_each_entry(link, &dev->links.suppliers, c_node) {
        if (!(link->flags & DL_FLAG_MANAGED))
            continue;

        if (link->status != DL_STATE_AVAILABLE &&
            !(link->flags & DL_FLAG_SYNC_STATE_ONLY)) {
            // 供应商未就绪,返回-EPROBE_DEFER,延迟探测
            return -EPROBE_DEFER;
        }
        WRITE_ONCE(link->status, DL_STATE_CONSUMER_PROBE);
        }
       return 0;
}

如果供应商未就绪,会直接返回 -EPROBE_DEFER,推迟消费者探测,直到供应商就绪。

5. 典型使用场景

  1. MMU + 总线主设备:MMU为总线主设备提供DMA地址转换,需要在总线主设备活动时保持运行,总线主设备驱动需要等待MMU绑定后才能绑定
  2. Thunderbolt主机控制器:NHI设备和PCIe热插拔端口是同级设备,恢复时需要NHI先重建PCI隧道,热插拔端口才能恢复,使用无状态设备链接保证顺序
  3. 混合图形:独立GPU的HDA音频控制器依赖VGA设备,使用device link表示依赖
  4. ACPI _DEP:ACPI通过_DEP定义设备启动顺序,device link可以正确实现这种依赖
  5. SoC内部依赖:显示/视频编码IP依赖内存访问IP,使用device link保证探测顺序

6. 与其他方案的对比

方案特点对比device link
struct dev_pm_domain用于共享开关的设备,不保证挂起/恢复排序,不支持驱动存在依赖device link同时支持排序和驱动依赖
struct generic_pm_domain比device link重,不支持关闭排序和驱动存在依赖,不能在ACPI使用device link更轻量,适用场景更广
Linux网络驱动之Fixed-Link(15) 阅读详情

相关推荐

Linux网络驱动之Fixed-Link(14)

Linux网络驱动之Fixed-Link(14)

phmatthaus的专栏 471

device link

文章:kernel.org/doc/html/latest/driver-api/device_link.html device link 默认情况下,驱动core仅在设备层次结构中父子设备间建立依赖关系:在休眠或唤醒过程中,设备依次按设备之间的关系执行,比如子设备必须在父设备前休眠,而父设备必须在子设备钱唤醒。 除了父子关系外,有时需要在设备间如兄弟设备建立依赖,并且驱动core能够自动处理这种关系。另外默认情况下驱动core不会强制执行任何驱动存在性依赖,即一个设备必须绑定到一个驱动程序,另一个设备才能

flyingnosky的专栏 4473

Linux网络驱动之Fixed-Link(30)

Linux网络驱动之Fixed-Link(30)

phmatthaus的专栏 840

八、device_add

1.总体框架 linux设备模型:设备device,驱动driver,总线bus。 设备代表物理设备,驱动代表了设备操作方法,bus则是用来管理和匹配它们。 device和driver里面都有一个成员变量bus,表示它们归哪个总线管理; bus里面则有两个链表,device链表和driver链表。 当有新的设备加入的时候,就会将它加入它对应的bus的dev

当我荒废时间的时候,会有多少人在拼命 5103

Linux网络驱动之Fixed-Link(23)

Linux网络驱动之Fixed-Link(23)

phmatthaus的专栏 1635

嵌入式Linux摄像头调试:media device框架与pipeline实战

在嵌入式Linux多媒体开发中,V4L2框架下的media device是管理复杂硬件拓扑的核心抽象。它通过entity、pad和link三层模型,将摄像头、ISP、CSI等模块统一描述为可查询和控制的pipeline。理解这一机制,能帮助开发者快速定位链路不通、格式不匹配等常见故障,提升驱动调试效率。本文结合调试实例,深入解析media device的设计原理与实操技巧,涵盖拓扑查询、link配置、格式协商及典型问题排查,为摄像头驱动开发与ISP调优提供实用参考。

weixin_31815843的博客 248

linux内核驱动API指南(2)----驱动框架

linux内核驱动API指南

Jamienstar的博客 2518

Linux网络驱动之Fixed-Link(9)

Linux网络驱动之Fixed-Link(9)

phmatthaus的专栏 735

linux设备驱动 device add详解

《Linux设备节点创建》内核kobject上报uevent过滤规则_程序改变生活-优快云博客_netlink_kobject_uevent

u012787604的博客 3725

AutoSAR实战:手把手教你配置PNC(Partial Network Cluster)实现精准休眠与唤醒

本文详细介绍了如何在AutoSAR中配置PNC(Partial Network Cluster)实现精准休眠与唤醒,通过DaVinci Configurator工具逐步指导,结合ComM模块的协同调试,优化车载电子系统的能耗管理。文章包含实战步骤、常见错误排查及功耗优化数据,适合汽车电子开发工程师参考。

weixin_33725239的博客 465

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1870

linux设备模型:pci驱动程序注册过程

MANF_ID 表示厂商ID 是一个数字ID,如0xfead 或 PCI_ANY_ID(表示通用),如果有真实硬件应与硬件ID一致 MODEL_CODE 表示厂商设备 是一个数字ID,如0x1234 或 PCI_ANY_ID(表示通用),如上 默认情况下,子系统的厂商ID和厂商设备ID不用设置,它们采用PCI_ANY_ID(表示通用),class、class_mask等成员默认也不需要指定,在设备创建后,创建相关对象关联设备节点即可(或创建时指定父级) pci_probe: 驱动探测函数,可在函数内

大昱的博客 2946

自动驾驶系统架构解析:从传感器到决策控制的完整链路(附实际案例)

本文深入解析了自动驾驶系统从感知、决策到控制的完整架构链路。通过对比摄像头、毫米波雷达、激光雷达等核心传感器的特性与选型策略,阐述了多传感器融合的必要性。文章结合行为决策、运动规划及控制执行的实际案例,揭示了系统集成、数据闭环与功能安全等工程化落地的关键挑战,为理解自动驾驶技术提供了清晰的蓝图。

weixin_29051811的博客 337

net_device的打开与关闭

前面的笔记分析了net_device的分配和注册流程,在可以进行数据收发之前,还需要打开net_device。对应的net_device不再工作时需要关闭net_device,这篇笔记来分析下这两个流程是如何实现的。

九天小哥的专栏 2503

单周期CPU设计【Verilog】

第一章 单周期CPU的设计原理 为实现单周期CPU,本文首先研究了单周期CPU的相关理论和工作原理。本章首先简要介绍单周期CPU的基本概念,然后对CPU的工作原理进行简要分析,以便为单周期CPU的设计和开发提供理论基础。 1.1 单周期CPU概述 中央处理器,即CPU,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。在CPU内部,电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一

醉酒、冰城外 2万+

HyperLynx VX2.5 实战:5分钟搞定LPDDR4X内存的批量仿真与报告分析

本文详细介绍了如何使用HyperLynx VX2.5进行LPDDR4X内存的批量仿真与报告分析,通过智能网络分组和并行计算技术,5分钟内即可完成全流程验证。文章涵盖工程准备、批量仿真配置、报告解析及典型问题解决方案,帮助工程师高效提升PCB仿真效率,确保移动设备内存接口的稳定性与性能。

weixin_42683394的博客 400

Linux网络驱动之Fixed-Link(21)

Linux网络驱动之Fixed-Link(21)

phmatthaus的专栏 482

从零到一:uniPush2.0全链路集成与多厂商通道配置实战

本文提供了uniPush2.0从零开始的全链路集成与多厂商通道配置实战指南。详细讲解了DCloud平台配置、uniCloud云函数开发、客户端CID获取与消息监听,并重点攻克了华为、小米、OPPO、vivo等主流厂商推送通道的配置难点与避坑技巧,帮助UniApp开发者实现“一次集成,全端覆盖”的高效消息推送方案。

onion的博客 431

Linux网络驱动之Fixed-Link(17)

Linux网络驱动之Fixed-Link(17)

phmatthaus的专栏 369

OpenCode + Oh My OpenCode:打造你的终极AI编程团队(OpenCode新手入门指南)

本文详细介绍了开源终端AI编程助手 OpenCode 的完整配置教程 🖥️,从安装、AI模型配置到增强插件 Oh My OpenCode 的部署一应俱全。支持 Claude、ChatGPT、Gemini 多模型切换 🤖,还能实现多AI智能体协作开发。步骤清晰适合新手 📝,想在终端用AI写代码的开发者不要错过 ✨

XiaoqiangClub的博客 1万+

硬件工程师入门基础知识(一)基础元器件认识(二)

我们的电路输入一般是只有两种状态,0V 或者是其它的高电平(1.8V,3.3V,5V 等),截止状态一般不用怎么考虑,因为如果让三极管的 Vbe=0,自然就截止了,重要的是饱和状态如何保证。也就是说只要 Rb

小幽余生不加糖 1万+

Linux网络驱动之Fixed-Link(12)

Linux网络驱动之Fixed-Link(12)

phmatthaus的专栏 640

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux网络驱动之Fixed-Link(19)

Linux网络驱动之Fixed-Link(19)

phmatthaus的专栏 472

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux网络驱动之Fixed-Link(26)

Linux网络驱动之Fixed-Link(26)

phmatthaus的专栏 1356

ST-Link unknown device id 排查:从Vendor ID/Device ID到USB设备枚举

在嵌入式开发与USB设备调试中,Vendor ID(厂商ID)与Device ID(产品ID)是操作系统识别硬件、匹配驱动的核心标识。无论你是插上ST-Link烧录器还是自定义USB设备,系统都通过枚举流程读取这两个16位值,进而决定驱动加载与设备状态。当ST-Link报出unknown device id时,很多人误以为单纯是接触不良,其实需要先区分是主机未识别调试器,还是调试器无法读取目标芯片的IDCODE。本文从USB枚举原理与ID查询方法讲起,覆盖Windows、Linux、macOS下的实操命令,

weixin_33796205的博客 470

Linux网络驱动之Fixed-Link(22)

Linux网络驱动之Fixed-Link(22)

phmatthaus的专栏 1001
上一篇: Linux UCLAMP机制深度分析
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值