-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbsp.c
157 lines (134 loc) · 3.63 KB
/
bsp.c
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include "bsp.h"
#include <zephyr/device.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/uart.h>
#include "pcr_reg.h"
#include "periph_defs.h"
#include "timer_group_reg.h"
#include <zephyr/devicetree.h>
#include <zephyr/drivers/led_strip.h>
#include <zephyr/device.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/sys/util.h>
#define UART_DEVICE_NODE DT_CHOSEN(zephyr_console)
static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE);
#define STRIP_NODE DT_ALIAS(led_strip)
static const struct device *const strip = DEVICE_DT_GET(STRIP_NODE);
uint8_t bsp_rgb_led_init(void) {
uint8_t ret = 0;
if(!device_is_ready(strip)) {
return 1;
}
return ret;
}
void bsp_rgb_led_set(bsp_rgb_led_color_s *val) {
static struct led_rgb pixel;
pixel.r = val->r;
pixel.g = val->g;
pixel.b = val->b;
led_strip_update_rgb(strip, &pixel, 1);
}
void bsp_rgb_led_change(void) {
static bsp_rgb_led_color_s val = {
.r = 0,
.g = 0,
.b = 0
};
static uint8_t valIdx = 0;
val.r = 0;
val.g = 0;
val.b = 0;
if(valIdx >= 3) {
valIdx = 0;
}
switch(valIdx) {
case 0:
val.r = 255;
break;
case 1:
val.g = 255;
break;
case 2:
val.b = 255;
break;
default:
val.r = 255;
val.g = 255;
val.b = 255;
break;
}
bsp_rgb_led_set(&val);
valIdx++;
}
char bsp_getchar(void) {
char c;
if(uart_poll_in(uart_dev, &c) != 0) {
c = -1;
}
return c;
}
int16_t bsp_getline(char *buf, uint8_t size) {
int16_t ret = 0;
char c = bsp_getchar();
uint8_t bufIdx;
for(bufIdx = 0; bufIdx < size;) {
// ignore non ascii chars
if(c < 0 || c > 127 || c == '\r') {
// do nothing
} else if(c == '\n') {
buf[bufIdx] = '\0';
bufIdx++;
ret = bufIdx;
break;
} else if(bufIdx == (size-1)){
ret = -1;
break;
} else {
buf[bufIdx] = c;
bufIdx++;
}
c = bsp_getchar();
k_yield();
}
return ret;
}
__attribute__((weak)) void timer1_handler(void) {
// do nothing
}
static void _bsp_timer1_handler(void *arg) {
ARG_UNUSED(arg);
REG_SET_BIT(TIMG_INT_CLR_TIMERS_REG(1), TIMG_T0_INT_CLR_M);
REG_SET_BIT(TIMG_T0CONFIG_REG(1), (TIMG_T0_EN_M | TIMG_T0_ALARM_EN_M));
timer1_handler();
}
void bsp_tm1_int_setup(void) {
REG_SET_BIT(PCR_TIMERGROUP1_CONF_REG, PCR_TG1_CLK_EN_M);
REG_CLR_BIT(PCR_TIMERGROUP1_CONF_REG, PCR_TG1_RST_EN_M);
//printk("pcr cfg %u\n", REG_READ(PCR_TIMERGROUP1_CONF_REG));
REG_SET_BIT(PCR_TIMERGROUP1_TIMER_CLK_CONF_REG, PCR_TG1_TIMER_CLK_EN_M);
REG_SET_BIT(PCR_TIMERGROUP1_TIMER_CLK_CONF_REG, (1<<PCR_TG1_TIMER_CLK_SEL_S));
//printk("pcr clk cfg %u\n", REG_READ(PCR_TIMERGROUP1_TIMER_CLK_CONF_REG));
REG_WRITE(TIMG_T0CONFIG_REG(1), 0);
REG_SET_BIT(TIMG_T0CONFIG_REG(1), (
(2000<<TIMG_T0_DIVIDER_S) | // 80 MHz / 2000 = 40 kHz
TIMG_T0_DIVCNT_RST_M |
TIMG_T0_INCREASE_M |
TIMG_T0_ALARM_EN_M
));
//printk("tm1 cfg %u\n", REG_READ(TIMG_T0CONFIG_REG(1)));
REG_WRITE(TIMG_T0ALARMLO_REG(1), 40000); // 1 sec
REG_WRITE(TIMG_T0ALARMHI_REG(1), 0);
//printk("tm1 alm lo %u\n", REG_READ(TIMG_T0ALARMLO_REG(1)));
//printk("tm1 alm hi %u\n", REG_READ(TIMG_T0ALARMHI_REG(1)));
REG_SET_BIT(TIMG_INT_ENA_TIMERS_REG(1), TIMG_T0_INT_ENA_M);
//printk("tm1 int ena %u\n", REG_READ(TIMG_INT_ENA_TIMERS_REG(1)));
REG_WRITE(TIMG_T0LOADLO_REG(1), 0);
//printk("tm1 load lo %u\n", REG_READ(TIMG_T0LOADLO_REG(1)));
REG_WRITE(TIMG_T0LOADHI_REG(1), 0);
//printk("tm1 load hi %u\n", REG_READ(TIMG_T0LOADHI_REG(1)));
REG_SET_BIT(TIMG_T0CONFIG_REG(1), (TIMG_T0_EN_M | TIMG_T0_AUTORELOAD_M));
//printk("tm1 cfg %u\n", REG_READ(TIMG_T0CONFIG_REG(1)));
IRQ_CONNECT(ETS_TG1_T0_LEVEL_INTR_SOURCE, 2, _bsp_timer1_handler, NULL, 0);
irq_enable(ETS_TG1_T0_LEVEL_INTR_SOURCE);
}