USB网卡和以太网交换机“常连”后,增加交换机插拔网线判断机制

这个项目已经做了小半年了,客户是一个做智能电话机的。所谓的智能电话就是一台可以插网线、电话线,外观却是座机的手机。

客户的需求特别奇葩,USB网卡和一个内部的交换机直接通过PCB走线相连接。这个设计导致了系统在插入网线并且网卡link up上报后,网卡就一直处于连接状态,无法判断交换机的wan口网线是否拔出。后面经过大家的会议商讨,决定将交换机wan口led接口引出并接到我们的模块上,利用GPIO去判断LED闪烁状态来设置网卡状态。

于是乎,这个问题就首先落到了BSP这边,而后又落到了我这边,简单讲一下思路:DM9601作为USB网卡,driver_info(usbnet.h)中有一个.status的方法,用于轮询网卡状态。

/* for status polling */
void (*status)(struct usbnet *, struct urb *); // 驱动的具体实现
static void dm9601_status(struct usbnet *dev, struct urb *urb)
{
int link;
u8 *buf; /* format:
b0: net status
b1: tx status 1
b2: tx status 2
b3: rx status
b4: rx overflow
b5: rx count
b6: tx count
b7: gpr
*/ if (urb->actual_length < 8)
return; buf = urb->transfer_buffer; link = !!(buf[0] & 0x40);
if (netif_carrier_ok(dev->net) != link) {
usbnet_link_change(dev, link, 1);
netdev_dbg(dev->net, "Link Status is: %d\n", link);
}
}

通过观察log发现每次插拔网线都会在轮询函数中触发log,再深入分析后发现确实是由该函数来实现网卡link up/down的设置。

于是增加修改如下:

extern struct gpio_desc * eth_switch_gpiod_get(void);
static void dm9601_status(struct usbnet *dev, struct urb *urb)
{
int link;
u8 *buf;
int cnt;
int val;
struct gpio_desc * gpiod = NULL; /* format:
b0: net status
b1: tx status 1
b2: tx status 2
b3: rx status
b4: rx overflow
b5: rx count
b6: tx count
b7: gpr
*/ if (urb->actual_length < 8)
return; buf = urb->transfer_buffer; link = !!(buf[0] & 0x40);
netdev_info(dev->net, "%s link:%d\n", __func__, link); cnt = 0;
gpiod = eth_switch_gpiod_get();
if (!IS_ERR_OR_NULL(gpiod)) {
while (link && (val = gpiod_get_value(gpiod))) {
netdev_info(dev->net, "gpio%d:%d\n", desc_to_gpio(gpiod), val);
if (cnt++ > 5) {
netdev_info(dev->net, "%s link down\n", __func__);
usbnet_link_change(dev, 0, 1);
return;
}
mdelay(100);
}
} if (netif_carrier_ok(dev->net) != link) {
usbnet_link_change(dev, link, 1);
netdev_info(dev->net, "Link Status is: %d\n", link);
}
}

解决思路:首先判断当前网卡状态,其次通过GPIO判断LED灯状态,为了防止误判增加重试机制。

使用GPIO判断网线拔插的更多相关文章

  1. rbac组件权限按钮,菜单,可拔插

      1.通用模板 overflow: auto; //在a和b模板中进行切换 a 模板 :左侧菜单跟随滚动条 b模板  左侧以及上不动 **** <!DOCTYPE html> <h ...

  2. 2、rbac组件 后台布局模板,权限按钮,菜单,可拔插,路径重定向

    1.后台布局管理 https://www.cnblogs.com/venicid/p/7772742.html#_label0 1.通用模板 overflow: auto; //在a和b模板中进行切换 ...

  3. STM32 软件复位并模拟USB拔插

    最近做了个USB跟上位机的通信,需要软件对MCU进行复位,复位后如果USB没有拔插,PC就不会重新枚举USB为了解决这个问题,我做了软件复位跟,软件模拟USB拔插. 这里我用的是HAL库的软件复位,复 ...

  4. C# 上位机的USB设备拔插检测

    我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...

  5. android 获取设备拔插状态广播事件易漏掉的一行属性!

    我们都知道设备拔插的状态获取需要一个权限   <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILES ...

  6. 下一代USB接口将支持双向拔插,于明年亮相

    近日,USB接口标准制定组织表示新一代USB接口将于明年年中亮相,而其名称目前被暂定为了USB Type-C.该组织表示USB Type-C标准将允许制造商采用更纤薄的接口设计,在实用性大大提高的同时 ...

  7. 嵌入式 hi3518平台检测网线是否插上

    /********************************** (C) COPYRIGHT ******************************* * File Name        ...

  8. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  9. 设计一个可拔插的 IOC 容器

    前言 磨了许久,借助最近的一次通宵上线 cicada 终于更新了 v2.0.0 版本. 之所以大的版本号变为 2,确实是向下不兼容了:主要表现为: 修复了几个反馈的 bug. 灵活的路由方式. 可拔插 ...

  10. C#中USB转串口的拔插捕获

    // usb消息定义 public const int WM_DEVICE_CHANGE = 0x219; public const int DBT_DEVICEARRIVAL = 0x8000; p ...

随机推荐

  1. Nuxt.js 应用中的 build:manifest 事件钩子详解

    title: Nuxt.js 应用中的 build:manifest 事件钩子详解 date: 2024/10/22 updated: 2024/10/22 author: cmdragon exce ...

  2. esp8266+mqtt+继电器 (platformio)

    esp8266+mqtt+继电器 使用mqtt 控制led灯 项目地址 https://gitee.com/zhudachangs/esp8266-mqtt-relay #include <Ar ...

  3. SyncOOD:增加OOD目标检测鲁棒性,自动化数据助您一臂之力 | ECCV'24

    本文是对公开论文的核心提炼,而非直接翻译,旨在进行学术交流.如有任何侵权问题,请及时联系号主以便删除. 来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Can OOD Object Dete ...

  4. 4.8 Linux解压.bz2格式的文件(bunzip2命令)

    要解压".bz2"格式的压缩包文件,除了使用"bzip2 -d 压缩包名"命令外,还可以使用 bunzip2 命令. bunzip2 命令的使用和 gunzip ...

  5. 网站免费https加密教程

    为网站实现HTTPS加密可以大大提高网站的安全性和用户信任度.以下是一个详细的免费HTTPS加密教程: 一.选择免费SSL证书提供商 JoySSL:这是目前国内为数不多的国产CA服务商打造的自主品牌S ...

  6. python3的json数据库-TinyDB初入门

    无意间看到TinyDB这个词汇,就去查了一下,就发现了它的官方网站 这里 然后就是按照他说的步骤去做. 第1步 安装  pip3 install tinydb 安装成功后,创建一个文件名字叫做 tes ...

  7. C#-公众号H5页面授权获取用户code、openid、unionid

    一:配置信息 公众号设置: 1:设置 IP白名单(所在的服务器ip).记录公众号APPID和APPsecret; 2:设置 网页授权域名; 二:页面授权----[html中获取code] 1:页面引入 ...

  8. onlyoffice

    https://helpcenter.onlyoffice.com/installation/docs-enterprise-install-centos.aspx?_ga=2.51626159.76 ...

  9. MarkDown文档的编写

    MarkDown的基本语法 MarkDown的标题语法  通过#进行创建标题,#的数量控制标题的级别 MarkDown的段落语法  通过空白行将一行或者多行文本进行分隔 MarkDown的强调语法 粗 ...

  10. 鸿蒙NEXT开发案例:世界时间表

    [引言] 本案例将展示如何使用鸿蒙NEXT框架开发一个简单的世界时钟应用程序.该应用程序能够展示多个城市的当前时间,并支持搜索功能,方便用户快速查找所需城市的时间信息.在本文中,我们将详细介绍应用程序 ...