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
相关产品推荐
相关产品推荐

