You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux单总线主设备检测到从设备离线时的处理方法咨询

DS2484单总线主设备驱动处理DS28E84离线移除方案

核心逻辑

Linux单总线(w1)框架中,仅清除W1_SLAVE_ACTIVE标志位无法触发w1_slave_detach(),需要主设备驱动主动调用总线框架提供的移除接口,结合主设备私有数据跟踪已挂载从设备,完成离线设备的通知与移除。

具体实现步骤

  • 维护已挂载从设备记录
    在主设备驱动的私有数据结构中添加指针,跟踪当前关联的从设备(因每个主设备仅连一个从设备,用单个指针即可):

    struct ds2484_data {
        struct w1_bus_master master;
        struct w1_slave *attached_slave; // 记录当前挂载的从设备
        // 其他私有成员...
    };
    
  • 在search函数中检测离线并触发移除
    当主设备检测到原从设备离线时,直接调用w1_slave_detach(),而非仅修改标志位:

    static void ds2484_search(struct w1_bus_master *master) {
        struct ds2484_data *data = container_of(master, struct ds2484_data, master);
        // 自定义函数:通过单总线复位+存在脉冲检测从设备是否在线
        bool slave_online = ds2484_check_slave_presence(data);
    
        if (data->attached_slave && !slave_online) {
            // 主动通知总线框架移除离线设备
            w1_slave_detach(data->attached_slave);
            data->attached_slave = NULL; // 清空记录
        } else if (!data->attached_slave && slave_online) {
            // 原有新设备检测关联逻辑
            w1_search(master, W1_SEARCH);
        }
    }
    
  • 在从设备probe中关联主设备数据
    在DS28E84的probe函数中,将从设备指针同步到主设备私有数据:

    static int ds28e84_probe(struct w1_slave *slave) {
        struct ds2484_data *data = container_of(slave->master, struct ds2484_data, master);
        data->attached_slave = slave;
        // 其他probe初始化逻辑...
        return 0;
    }
    
  • 保证search函数定期执行
    单总线框架默认会定期调用search函数,可通过w1_set_timeout()调整检测周期;若需更实时的检测,可在主设备驱动中添加定时器或中断触发search。

关键注意点

  • 调用w1_slave_detach()后,框架会自动处理设备注销、资源释放,无需手动修改W1_SLAVE_ACTIVE标志位。
  • 因单主设备仅连一个从设备,无需处理多设备遍历比对,逻辑可大幅简化。
  • ds2484_check_slave_presence()需保证可靠性,建议基于单总线复位命令的存在脉冲反馈判断设备状态。

内容的提问来源于stack exchange,提问作者Robert McLean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:20:27