aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/src_simtrace/wwan_led.c
blob: 3bae0ff81cdb55223ec386606afe77b4f9d24f67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/* Code to read/track the status of the WWAN LEDs of attached modems
 *
 * Depending on the board this is running on,  it might be possible
 * for the controller to read the status of the WWAN LED output lines of
 * the cellular modem.  If the board supports this, it sets the
 * PIN_WWAN1 and/or PIN_WWAN2 defines in its board.h file.
 */

#include "board.h"
#include "wwan_led.h"

#ifdef PIN_WWAN1
static const Pin pin_wwan1 = PIN_WWAN1;

static void wwan1_irqhandler(const Pin *pPin)
{
	int active = wwan_led_active(1);

	TRACE_INFO("WWAN1 LED %u\r\n", active);

	/* TODO: notify host via USB */
}
#endif

#ifdef PIN_WWAN2
static const Pin pin_wwan2 = PIN_WWAN2;

static void wwan2_irqhandler(const Pin *pPin)
{
	int active = wwan_led_active(2);
	TRACE_INFO("WWAN2 LED %u\r\n", active);

	/* TODO: notify host via USB */
}
#endif

/* determine if a tiven WWAN led is currently active or not */
int wwan_led_active(int wwan)
{
	const Pin *pin;
	int active;

	switch (wwan) {
#ifdef PIN_WWAN1
	case 1:
		pin = &pin_wwan1;
		break;
#endif
#ifdef PIN_WWAN2
	case 2:
		pin = &pin_wwan2;
		break;
#endif
	default:
		return -1;
	}

	active = PIO_Get(&pin_wwan1) ? 0 : 1;
	return active;
}

int wwan_led_init(void)
{
	int num_leds = 0;

#ifdef PIN_WWAN1
	PIO_Configure(&pin_wwan1, 1);
	PIO_ConfigureIt(&pin_wwan1, wwan1_irqhandler);
	PIO_EnableIt(&pin_wwan1);
	num_leds++;
#endif

#ifdef PIN_WWAN2
	PIO_Configure(&pin_wwan2, 1);
	PIO_ConfigureIt(&pin_wwan2, wwan2_irqhandler);
	PIO_EnableIt(&pin_wwan2);
	num_leds++;
#endif
	return num_leds;
}