Skip to content

Latest commit

 

History

History
104 lines (89 loc) · 2.13 KB

usb_moded-udev.c

File metadata and controls

104 lines (89 loc) · 2.13 KB
 
Mar 22, 2011
Mar 22, 2011
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
#include <poll.h>
#include <libudev.h>
Apr 6, 2011
Apr 6, 2011
10
11
12
#include <glib.h>
#include "usb_moded-log.h"
Apr 7, 2011
Apr 7, 2011
13
#include "usb_moded-config.h"
Apr 6, 2011
Apr 6, 2011
14
15
#include "usb_moded-hw-ab.h"
#include "usb_moded.h"
Mar 22, 2011
Mar 22, 2011
16
17
18
19
20
21
/* global variables */
struct udev *udev;
struct udev_monitor *mon;
struct udev_device *dev;
Apr 6, 2011
Apr 6, 2011
22
23
24
25
/* static function definitions */
gpointer monitor_udev(gpointer data) __attribute__ ((noreturn));
gboolean hwal_init(void)
Mar 22, 2011
Mar 22, 2011
26
{
Apr 6, 2011
Apr 6, 2011
27
GThread * thread;
Apr 7, 2011
Apr 7, 2011
28
const gchar *udev_path;
Mar 22, 2011
Mar 22, 2011
29
30
31
32
33
34
/* Create the udev object */
udev = udev_new();
if (!udev)
{
log_err("Can't create udev\n");
Apr 6, 2011
Apr 6, 2011
35
36
return 0;
}
Apr 7, 2011
Apr 7, 2011
37
38
39
40
41
42
udev_path = find_udev_path();
if(udev_path)
dev = udev_device_new_from_syspath(udev, udev_path);
else
dev = udev_device_new_from_syspath(udev, "/sys/class/power_supply/usb");
Apr 6, 2011
Apr 6, 2011
43
44
45
46
47
48
49
50
51
52
if (!dev)
{
log_err("Unable to find /sys/class/power_supply/usb device.");
return 0;
}
mon = udev_monitor_new_from_netlink (udev, "udev");
if (!mon)
{
log_err("Unable to monitor the 'present' value\n");
return 0;
Mar 22, 2011
Mar 22, 2011
53
}
Apr 6, 2011
Apr 6, 2011
54
55
56
57
udev_monitor_filter_add_match_subsystem_devtype(mon, "power_supply", NULL);
udev_monitor_enable_receiving (mon);
thread = g_thread_create(monitor_udev, NULL, FALSE, NULL);
Mar 22, 2011
Mar 22, 2011
58
Apr 6, 2011
Apr 6, 2011
59
60
61
62
63
64
65
66
if(thread)
return 1;
else
{
log_debug("thread not created succesfully\n");
return 0;
}
}
Mar 22, 2011
Mar 22, 2011
67
Apr 6, 2011
Apr 6, 2011
68
69
gpointer monitor_udev(gpointer data)
{
Mar 22, 2011
Mar 22, 2011
70
71
while(1)
{
Apr 6, 2011
Apr 6, 2011
72
73
74
75
dev = udev_monitor_receive_device (mon);
if (dev)
{
if(!strcmp(udev_device_get_action(dev), "change"))
Mar 22, 2011
Mar 22, 2011
76
{
Apr 6, 2011
Apr 6, 2011
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
if(!strcmp(udev_device_get_property_value(dev, "POWER_SUPPLY_PRESENT"), "1"))
{
log_debug("UDEV:power supply present\n");
/* POWER_SUPPLY_TYPE is USB if usb cable is connected, or USB_DCP for charger */
if(!strcmp(udev_device_get_property_value(dev, "POWER_SUPPLY_TYPE"), "USB"))
{
log_debug("UDEV:USB cable connected\n");
set_usb_connected(TRUE);
}
}
else
{
log_debug("UDEV:USB cable disconnected\n");
set_usb_connected(FALSE);
}
Mar 22, 2011
Mar 22, 2011
92
}
Apr 6, 2011
Apr 6, 2011
93
udev_device_unref(dev);
Mar 22, 2011
Mar 22, 2011
94
}
Apr 6, 2011
Apr 6, 2011
95
}
Mar 22, 2011
Mar 22, 2011
96
97
}
Apr 6, 2011
Apr 6, 2011
98
void hwal_cleanup(void)
Mar 22, 2011
Mar 22, 2011
99
{
Apr 6, 2011
Apr 6, 2011
100
udev_monitor_unref(mon);
Mar 22, 2011
Mar 22, 2011
101
102
udev_unref(udev);
}