USB插拔检测机制-uevent事件监测


USB插拔检测机制-uevent事件监测

ls system/extras/tests/uevents/
Android.mk  uevents.c


130|console:/ # ps -A |grep uevent                                             
root           398     1    8844   2620 poll_schedule_timeout 0 S ueventd
console:/ #

console:/ # which ueventd                                                      
/sbin/ueventd


sa6155 uevent处理代码:
-rw-rw-r-- 1 xcz xcz 10852 9月  15 20:11 ../system/core/init/ueventd.cpp
-rw-rw-r-- 1 xcz xcz   805 9月  15 20:11 ../system/core/init/ueventd.h
-rw-rw-r-- 1 xcz xcz  6680 9月  15 20:11 ../system/core/init/ueventd_parser.cpp
-rw-rw-r-- 1 xcz xcz  1133 9月  15 20:11 ../system/core/init/ueventd_parser.h
-rw-rw-r-- 1 xcz xcz  6765 9月  15 20:11 ../system/core/init/ueventd_test.cpp
-rw-rw-r-- 1 xcz xcz  1011 9月  15 20:11 ../system/core/init/uevent.h
-rw-rw-r-- 1 xcz xcz  7065 9月  15 20:11 ../system/core/init/uevent_listener.cpp
-rw-rw-r-- 1 xcz xcz  1854 9月  15 20:11 ../system/core/init/uevent_listener.h


[100% 9/9] Install: out/target/product/sm6150_au/system/bin/uevents

#### build completed successfully (01:37 (mm:ss)) ####

xcz@xcz-OptiPlex-7070:~/HD_1T_20210708/HTB23/sa6155p-la-1-0-1_hlos/LINUX/android/system/extras/tests/uevents$


接收所有的事件然后打印出来:

console:/ # /system/bin/uevents                                                
[ 2974.617410] msm-dwc3 a600000.ssusb: Could not get usb psy
[ 2974.623096] usb0_vbus_change_low_interrupt: irq=[382], gpio_value=[0]
[ 2974.623205] usb0_vbus_change_low_thread_interrupt: irq=[382], gpio_value=[0]
[ 2974.623763] usb0_vbus_change_low_thread_interrupt: sent uevent {SUBSYSTEM=usb-vbusdev,ACTION=change,USB_STATE=DISCONNECTED}
[ 2977.419943] msm-dwc3 a600000.ssusb: Could not get usb psy
[ 2977.526252] msm-dwc3 a600000.ssusb: Could not get usb psy
[ 2977.631122] msm-dwc3 a600000.ssusb: Could not get usb psy


拔出事件:
change@/devices/platform/soc/soc:usb0_vbus_input_gpio ACTION=change DEVPATH=/devices/platform/soc/soc:usb0_vbus_input_gpio SUBSYSTEM=platform SUBSYSTEM=usb-vbusdev ACTION=change USB_STATE=DISCONNECTED DE

插入事件:
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=DISCONNECTED SEQNUM=5428
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=CONNECTED SEQNUM=5429
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=DISCONNECTED SEQNUM=5430
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=CONNECTED SEQNUM=5431
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=CONFIGURED SEQNUM=5432


使用的是netlink技术:

kernel/msm-4.14/lib/kobject_uevent.c:602:    ue_sk->sk = netlink_kernel_create(net, NETLINK_KOBJECT_UEVENT, &cfg);


最大数量
系统已经定义的
kernel/msm-4.14/include/uapi/linux/netlink.h

#define NETLINK_ROUTE        0    /* Routing/device hook                */
#define NETLINK_UNUSED        1    /* Unused number                */
#define NETLINK_USERSOCK    2    /* Reserved for user mode socket protocols     */
#define NETLINK_FIREWALL    3    /* Unused number, formerly ip_queue        */
#define NETLINK_SOCK_DIAG    4    /* socket monitoring                */
#define NETLINK_NFLOG        5    /* netfilter/iptables ULOG */
#define NETLINK_XFRM        6    /* ipsec */
#define NETLINK_SELINUX        7    /* SELinux event notifications */
#define NETLINK_ISCSI        8    /* Open-iSCSI */
#define NETLINK_AUDIT        9    /* auditing */
#define NETLINK_FIB_LOOKUP    10    
#define NETLINK_CONNECTOR    11
#define NETLINK_NETFILTER    12    /* netfilter subsystem */
#define NETLINK_IP6_FW        13
#define NETLINK_DNRTMSG        14    /* DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT    15    /* Kernel messages to userspace */
#define NETLINK_GENERIC        16
/* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT    18    /* SCSI Transports */
#define NETLINK_ECRYPTFS    19
#define NETLINK_RDMA        20
#define NETLINK_CRYPTO        21    /* Crypto layer */
#define NETLINK_SMC        22    /* SMC monitoring */
#define NETLINK_SOCKEV        23    /* Socket Administrative Events */
#define NETLINK_INET_DIAG    NETLINK_SOCK_DIAG

#define MAX_LINKS 32


函数定义
static inline struct sock *
netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
{
    return __netlink_kernel_create(net, unit, THIS_MODULE, cfg);
}


LINUX/android/system$ grep -rn NETLINK_KOBJECT_UEVENT  ./
./netd/server/NetlinkManager.cpp:133:    if ((mUeventHandler = setupSocket(&mUeventSock, NETLINK_KOBJECT_UEVENT,
./vold/NetlinkManager.cpp:60:            NETLINK_KOBJECT_UEVENT)) < 0) {
./core/libsysutils/src/NetlinkEvent.cpp:599: * Parse an ASCII-formatted message from a NETLINK_KOBJECT_UEVENT
./core/libcutils/uevent.cpp:105:    s = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT);


文件 ./core/libcutils/uevent.cpp

int uevent_open_socket(int buf_sz, bool passcred) {
    struct sockaddr_nl addr;
    int on = passcred;
    int s;

    memset(&addr, 0, sizeof(addr));
    addr.nl_family = AF_NETLINK;
    addr.nl_pid = getpid();
    addr.nl_groups = 0xffffffff;

    s = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT);
    if (s < 0) return -1;

    /* buf_sz should be less than net.core.rmem_max for this to succeed */
    if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buf_sz, sizeof(buf_sz)) < 0) {
        close(s);
        return -1;
    }

    setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));

    if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        close(s);
        return -1;
    }

    return s;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值