Import libosmocore timer infrastructure and use it for PERST

The PERST is thus no longer busy-waiting but starting a timer to release
the PERST after 1ms.
This commit is contained in:
Harald Welte
2017-02-04 12:34:35 +01:00
parent b41598b602
commit 987f59aa02
7 changed files with 960 additions and 5 deletions

View File

@@ -8,36 +8,51 @@
#include "board.h"
#include "wwan_perst.h"
#include "osmocom/core/timer.h"
#define PERST_DURATION_MS 1
#ifdef PIN_PERST1
static const Pin pin_perst1 = PIN_PERST1;
static struct osmo_timer_list perst1_timer;
#endif
#ifdef PIN_PERST2
static const Pin pin_perst2 = PIN_PERST2;
static struct osmo_timer_list perst2_timer;
#endif
static void perst_tmr_cb(void *data)
{
const Pin *pin = data;
/* release the (low-active) reset */
PIO_Set(pin);
}
int wwan_perst_do_reset(int modem_nr)
{
static const Pin *pin;
const Pin *pin;
struct osmo_timer_list *tmr;
switch (modem_nr) {
#ifdef PIN_PERST1
case 1:
pin = &pin_perst1;
tmr = &perst1_timer;
break;
#endif
#ifdef PIN_PERST2
case 2:
pin = &pin_perst2;
tmr = &perst2_timer;
break;
#endif
default:
return -1;
}
PIO_Clear(pin);
mdelay(1);
PIO_Set(pin);
osmo_timer_schedule(tmr, PERST_DURATION_MS/1000, (PERST_DURATION_MS%1000)*1000);
return 0;
}
@@ -46,11 +61,15 @@ int wwan_perst_init(void)
int num_perst = 0;
#ifdef PIN_PERST1
PIO_Configure(&pin_perst1, 1);
perst1_timer.cb = perst_tmr_cb;
perst1_timer.data = (void *) &pin_perst1;
num_perst++;
#endif
#ifdef PIN_PERST2
PIO_Configure(&pin_perst2, 1);
perst2_timer.cb = perst_tmr_cb;
perst2_timer.data = (void *) &pin_perst2;
num_perst++;
#endif
return num_perst;