summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/l1ctl_proto.h5
-rw-r--r--src/host/layer23/include/osmocom/bb/common/l1ctl.h3
-rw-r--r--src/host/layer23/src/common/l1ctl.c17
-rw-r--r--src/target/firmware/apps/layer1/main.c2
-rw-r--r--src/target/firmware/layer1/l23_api.c15
5 files changed, 42 insertions, 0 deletions
diff --git a/include/l1ctl_proto.h b/include/l1ctl_proto.h
index 5adc6a1f..70de4bde 100644
--- a/include/l1ctl_proto.h
+++ b/include/l1ctl_proto.h
@@ -56,6 +56,7 @@ enum {
L1CTL_TRAFFIC_REQ,
L1CTL_TRAFFIC_CONF,
L1CTL_TRAFFIC_IND,
+ L1CTL_RINGER_REQ,
};
enum ccch_mode {
@@ -306,4 +307,8 @@ struct l1ctl_traffic_req {
uint8_t data[TRAFFIC_DATA_LEN];
} __attribute__((packed));
+struct l1ctl_ringer_req {
+ uint8_t volume;
+} __attribute__((packed));
+
#endif /* __L1CTL_PROTO_H__ */
diff --git a/src/host/layer23/include/osmocom/bb/common/l1ctl.h b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
index e95f47b7..3cf014e4 100644
--- a/src/host/layer23/include/osmocom/bb/common/l1ctl.h
+++ b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
@@ -74,4 +74,7 @@ int l1ctl_ph_prim_cb(struct osmo_prim_hdr *oph, void *ctx);
/* Transmit L1CTL_NEIGH_PM_REQ */
int l1ctl_tx_neigh_pm_req(struct osmocom_ms *ms, int num, uint16_t *arfcn);
+/* Transmit L1CTL_RINGER_REQ */
+int l1ctl_tx_ringer_req(struct osmocom_ms *ms, uint8_t volume);
+
#endif
diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c
index bdb4853b..6fca8ade 100644
--- a/src/host/layer23/src/common/l1ctl.c
+++ b/src/host/layer23/src/common/l1ctl.c
@@ -934,6 +934,23 @@ static int rx_l1_neigh_pm_ind(struct osmocom_ms *ms, struct msgb *msg)
return 0;
}
+/* Transmit L1CTL_RINGER_REQ */
+int l1ctl_tx_ringer_req(struct osmocom_ms *ms, uint8_t volume)
+{
+ struct msgb *msg;
+ struct l1ctl_ringer_req *ring_req;
+
+ msg = osmo_l1_alloc(L1CTL_RINGER_REQ);
+ if (!msg)
+ return -1;
+
+ LOGP(DL1C, LOGL_INFO, "Tx RINGER Req (volume %u)\n", volume);
+ ring_req = (struct l1ctl_ringer_req *) msgb_put(msg, sizeof(*ring_req));
+ ring_req->volume = volume;
+
+ return osmo_send_l1(ms, msg);
+}
+
/* Receive incoming data from L1 using L1CTL format */
int l1ctl_recv(struct osmocom_ms *ms, struct msgb *msg)
{
diff --git a/src/target/firmware/apps/layer1/main.c b/src/target/firmware/apps/layer1/main.c
index 59ffe972..f122de6b 100644
--- a/src/target/firmware/apps/layer1/main.c
+++ b/src/target/firmware/apps/layer1/main.c
@@ -102,6 +102,8 @@ int main(void)
/* initialize SIM */
calypso_sim_init();
+ buzzer_mode_pwt(1);
+
puts("Power up simcard:\n");
memset(atr,0,sizeof(atr));
atrLength = calypso_sim_powerup(atr);
diff --git a/src/target/firmware/layer1/l23_api.c b/src/target/firmware/layer1/l23_api.c
index 0e18ec4d..51ad4864 100644
--- a/src/target/firmware/layer1/l23_api.c
+++ b/src/target/firmware/layer1/l23_api.c
@@ -46,6 +46,7 @@
#include <rf/trf6151.h>
#include <calypso/sim.h>
#include <calypso/dsp.h>
+#include <calypso/buzzer.h>
#include <l1ctl_proto.h>
@@ -616,6 +617,17 @@ static void l1ctl_sim_req(struct msgb *msg)
sim_apdu(len, data);
}
+static void l1ctl_ringer_req(struct msgb *msg)
+{
+ struct l1ctl_hdr *l1h = (struct l1ctl_hdr *) msg->data;
+ struct l1ctl_ringer_req *ring_req =
+ (struct l1ctl_ringer_req *) l1h->data;
+
+ printf("Ringtone Request: %u\n", ring_req->volume);
+ buzzer_volume(ring_req->volume);
+ buzzer_note(NOTE(NOTE_C, OCTAVE_4));
+}
+
static struct llist_head l23_rx_queue = LLIST_HEAD_INIT(l23_rx_queue);
/* callback from SERCOMM when L2 sends a message to L1 */
@@ -707,6 +719,9 @@ void l1a_l23_handler(void)
case L1CTL_SIM_REQ:
l1ctl_sim_req(msg);
break;
+ case L1CTL_RINGER_REQ:
+ l1ctl_ringer_req(msg);
+ break;
}
exit_msgbfree: