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;
}