Skip to content

Commit b6b0e09

Browse files
[CXRD-17] Added bootup buzzer signal using User-Alerts
- generated "croxel inc" and "zephyr morse codes - user user-alerts to play "zephyr" morse code on bootup Signed-off-by: Anuj Pathak <[email protected]>
1 parent 14396e7 commit b6b0e09

File tree

6 files changed

+268
-0
lines changed

6 files changed

+268
-0
lines changed

app/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ target_include_directories(app PRIVATE
99

1010
target_sources(app PRIVATE
1111
src/main.c
12+
src/buzzer.c
1213
)

app/boards/croxel_cx1825.overlay

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/ {
2+
aliases {
3+
buzzer-pwm = &buzzer;
4+
};
5+
6+
buzzer: buzzer {
7+
compatible = "pwm-buzzer";
8+
pwms = <&pwm0 0 PWM_HZ(4000) PWM_POLARITY_NORMAL>;
9+
};
10+
};

app/include/morse_beep_codes.h

+152
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
#include <zephyr/sys/util.h>
2+
#include <user_alerts/user_alerts.h>
3+
4+
#define MORSE_DAA_FREQ 4400
5+
#define MORSE_DIT_FREQ 3600
6+
#define MORSE_SPACE_FREQ 0
7+
#define MORSE_TIME(S) ((S) * 100)
8+
9+
/* morse beeper code array for "ZEPHYR" */
10+
static const struct buzzer_alert_step _zephyr_morse_beep_steps[] = {
11+
/* morse encoded "Z" Char */
12+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
13+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
14+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
15+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
16+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
17+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
18+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
19+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
20+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
21+
/* morse encoded "E" Char */
22+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
23+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
24+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
25+
/* morse encoded "P" Char */
26+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
27+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
28+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
29+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
30+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
31+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
32+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
33+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
34+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
35+
/* morse encoded "H" Char */
36+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
37+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
38+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
39+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
40+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
41+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
42+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
43+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
44+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
45+
/* morse encoded "Y" Char */
46+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
47+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
48+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
49+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
50+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
51+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
52+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
53+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
54+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
55+
/* morse encoded "R" Char */
56+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
57+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
58+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
59+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
60+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
61+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
62+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
63+
};
64+
65+
static const struct user_alerts_pattern _zephyr_morse_beeps = {
66+
.steps = _zephyr_morse_beep_steps,
67+
.steps_count = ARRAY_SIZE(_zephyr_morse_beep_steps),
68+
.loop_count = 1,
69+
};
70+
/* morse beeper code array for "CROXEL INC" */
71+
static const struct buzzer_alert_step _croxel_inc_morse_beep_steps[] = {
72+
/* morse encoded "C" Char */
73+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
74+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
75+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
76+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
77+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
78+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
79+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
80+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
81+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
82+
/* morse encoded "R" Char */
83+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
84+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
85+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
86+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
87+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
88+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
89+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
90+
/* morse encoded "O" Char */
91+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
92+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
93+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
94+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
95+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
96+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
97+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
98+
/* morse encoded "X" Char */
99+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
100+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
101+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
102+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
103+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
104+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
105+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
106+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
107+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
108+
/* morse encoded "E" Char */
109+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
110+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
111+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
112+
/* morse encoded "L" Char */
113+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
114+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
115+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
116+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
117+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
118+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
119+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
120+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
121+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
122+
/* morse encoded word space */
123+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(7)},
124+
/* morse encoded "I" Char */
125+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
126+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
127+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
128+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
129+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
130+
/* morse encoded "N" Char */
131+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
132+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
133+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
134+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
135+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
136+
/* morse encoded "C" Char */
137+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
138+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
139+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
140+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
141+
{.freq = MORSE_DAA_FREQ, .ms = MORSE_TIME(3)},
142+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
143+
{.freq = MORSE_DIT_FREQ, .ms = MORSE_TIME(1)},
144+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(1)},
145+
{.freq = MORSE_SPACE_FREQ, .ms = MORSE_TIME(3)},
146+
};
147+
148+
static const struct user_alerts_pattern _croxel_inc_morse_beeps = {
149+
.steps = _croxel_inc_morse_beep_steps,
150+
.steps_count = ARRAY_SIZE(_croxel_inc_morse_beep_steps),
151+
.loop_count = 1,
152+
};

app/prj.conf

+2
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
CONFIG_LOG=y
2+
CONFIG_PWM=y
3+
CONFIG_USER_ALERTS=y

app/src/buzzer.c

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <zephyr/kernel.h>
2+
#include <zephyr/logging/log.h>
3+
#include <zephyr/drivers/pwm.h>
4+
#include <user_alerts/user_alerts.h>
5+
#include <morse_beep_codes.h>
6+
7+
LOG_MODULE_REGISTER(buzzer);
8+
9+
int pwm_user_alerts_step_exec(const struct user_alerts_channel *ch, const void *step)
10+
{
11+
int err;
12+
const struct buzzer_alert_step *b_step = step;
13+
const struct pwm_dt_spec *pwm = ch->io;
14+
15+
err = (b_step && b_step->freq)
16+
? pwm_set_dt(pwm, PWM_HZ(b_step->freq), PWM_HZ(b_step->freq) / 2)
17+
: pwm_set_dt(pwm, PWM_HZ(4000), 0);
18+
return err;
19+
}
20+
21+
static const struct pwm_dt_spec _buzzer_ch_pwm = PWM_DT_SPEC_GET(DT_NODELABEL(buzzer));
22+
static struct user_alerts_channel _buzzer_ch = {
23+
.step_size = sizeof(struct buzzer_alert_step),
24+
.io = &_buzzer_ch_pwm,
25+
.exec = pwm_user_alerts_step_exec,
26+
.cur_step_idx = 0,
27+
.cur_loop_idx = 0,
28+
/*".timer" wil be init using api */
29+
.pattern = NULL,
30+
};
31+
32+
int play_bootup_buzzer_beeps(void)
33+
{
34+
user_alerts_channel_init_timer(&_buzzer_ch);
35+
user_alerts_channel_play(&_buzzer_ch, &_zephyr_morse_beeps, true);
36+
return 0;
37+
}
38+
39+
SYS_INIT(play_bootup_buzzer_beeps, APPLICATION, 99);

include/user_alerts/user_alerts.h

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#ifndef _USER_ALERTS_H_
2+
#define _USER_ALERTS_H_
3+
4+
#include <stdint.h>
5+
#include <stdbool.h>
6+
#include <zephyr/kernel.h>
7+
8+
struct alert_step {
9+
uint16_t ms;
10+
/* extends alert info here */
11+
};
12+
13+
struct buzzer_alert_step {
14+
uint16_t ms;
15+
uint16_t freq;
16+
};
17+
18+
struct mono_led_alert_step {
19+
uint16_t ms;
20+
uint8_t duty;
21+
};
22+
23+
struct bi_led_alert_step {
24+
uint16_t ms;
25+
uint8_t duty_1;
26+
uint8_t duty_2;
27+
};
28+
29+
struct rgb_led_alert_step {
30+
uint16_t ms;
31+
uint8_t r;
32+
uint8_t g;
33+
uint8_t b;
34+
uint8_t _rsv;
35+
};
36+
37+
struct user_alerts_pattern {
38+
const void *steps;
39+
uint16_t steps_count;
40+
uint16_t loop_count;
41+
};
42+
43+
struct user_alerts_channel;
44+
typedef int (*user_alerts_step_exec)(const struct user_alerts_channel *ch, const void *step);
45+
46+
struct user_alerts_channel {
47+
uint8_t step_size;
48+
const void *io;
49+
user_alerts_step_exec exec;
50+
uint16_t cur_step_idx;
51+
uint16_t cur_loop_idx;
52+
struct k_timer timer;
53+
const struct user_alerts_pattern *pattern;
54+
};
55+
56+
int user_alerts_channel_init_timer(struct user_alerts_channel *ch);
57+
58+
int user_alerts_channel_play(struct user_alerts_channel *ch,
59+
const struct user_alerts_pattern *pattern,
60+
bool force);
61+
62+
int user_alerts_channel_stop(struct user_alerts_channel *ch, bool force);
63+
64+
#endif /* _USER_ALERTS_H_ */

0 commit comments

Comments
 (0)