Skip to content

Commit 4a6dd9c

Browse files
authored
Merge pull request zephyrproject-rtos#6 from dcpleung/sof_zephyr
Update code to boot on QEMU and UP Squared board
2 parents 6c2b616 + 5190276 commit 4a6dd9c

File tree

30 files changed

+2066
-154
lines changed

30 files changed

+2066
-154
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/python3
2+
3+
#FILE = "/dev/shm/qemu-bridge-hp-sram-mem"
4+
FILE = "/sys/kernel/debug/sof/etrace"
5+
#OFFSET = 0x8000
6+
OFFSET = 0x0
7+
MAGIC = 0x55aa
8+
SLOT_NUM = 32
9+
SLOT_LEN = 256
10+
11+
def read_id(f):
12+
buf = f.read(2)
13+
return int.from_bytes(buf, byteorder='little')
14+
15+
def read_magic(f):
16+
buf = f.read(2)
17+
return int.from_bytes(buf, byteorder='little')
18+
19+
def read_log_slot(f):
20+
magic = read_magic(f)
21+
22+
if magic == MAGIC:
23+
id = read_id(f)
24+
slot = f.read(SLOT_LEN - 4)
25+
logstr = slot.decode(errors='replace').split('\r', 1)[0]
26+
print("id %d %s" % (id, logstr))
27+
28+
# Open a file
29+
f = open(FILE, "rb")
30+
31+
for x in range(0, SLOT_NUM):
32+
f.seek(OFFSET + x * SLOT_LEN)
33+
read_log_slot(f)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
zephyr_adsp_logger
2+
*.o
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
.PHONY: all clean
2+
.SECONDARY:
3+
4+
CFLAGS = -march=native -O2 -g
5+
6+
EXECUTABLES = zephyr_adsp_logger
7+
8+
all: $(EXECUTABLES)
9+
10+
clean:
11+
rm -f $(EXECUTABLES)
12+
13+
%.o: %.c
14+
$(C) $(CFLAGS) -c $< -o $@
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
#include <errno.h>
2+
#include <limits.h>
3+
#include <stdint.h>
4+
#include <stdlib.h>
5+
#include <stdio.h>
6+
#include <unistd.h>
7+
8+
#define MAGIC 0x55AA
9+
10+
struct config_t {
11+
char *infile;
12+
13+
unsigned long int trace_size;
14+
unsigned long int buf_size;
15+
16+
unsigned long int interval_usecs;
17+
} cfg;
18+
19+
struct log_t {
20+
uint16_t magic;
21+
uint16_t id;
22+
char log[0];
23+
};
24+
25+
char *sof_etrace_path = "/sys/kernel/debug/sof/etrace";
26+
char *qemu_etrace_path = "/dev/shm/qemu-bridge-etrace-mem";
27+
28+
unsigned long int default_trace_size = 0x2000;
29+
unsigned long int default_buf_size = 256;
30+
31+
void usage(char *prog_name)
32+
{
33+
fprintf(stdout, "Usage: %s [options]\n\n", prog_name);
34+
fprintf(stdout, "Options:\n");
35+
fprintf(stdout, " -s : Use %s as input\n", sof_etrace_path);
36+
fprintf(stdout, " -q : Use %s as input\n", qemu_etrace_path);
37+
fprintf(stdout, " -i infile : Use infile as input\n");
38+
fprintf(stdout, "\n");
39+
fprintf(stdout,
40+
" -t size : Size of the trace buffer (in bytes, default %lu)\n",
41+
default_trace_size);
42+
fprintf(stdout,
43+
" -b size : Size of buffer of one log line (in bytes, default %lu)\n",
44+
default_buf_size);
45+
fprintf(stdout, "\n");
46+
fprintf(stdout,
47+
" -n usecs : Read logs with update interval (microseconds, default is to read once)\n");
48+
}
49+
50+
int read_logs()
51+
{
52+
FILE *fd;
53+
int ret;
54+
unsigned long int offset;
55+
struct log_t *log;
56+
uint8_t *buf = NULL;
57+
char *log_buf = NULL;
58+
unsigned int max_log_strlen;
59+
60+
max_log_strlen = cfg.buf_size - sizeof(log->magic) - sizeof(log->id);
61+
62+
/* Open file */
63+
fd = fopen(cfg.infile, "rb");
64+
if (!fd) {
65+
fprintf(stderr,
66+
"[ERROR] Cannot open %s for reading!\n", cfg.infile);
67+
ret = -1;
68+
goto read_out;
69+
}
70+
71+
/* Allocate buffers */
72+
buf = malloc(cfg.trace_size);
73+
if (!buf) {
74+
fprintf(stderr,
75+
"[ERROR] Cannot allocate trace buffer!\n");
76+
ret = -2;
77+
goto read_out;
78+
}
79+
80+
log_buf = malloc(cfg.buf_size + 1);
81+
if (!log_buf) {
82+
fprintf(stderr,
83+
"[ERROR] Cannot allocate log buffer!\n");
84+
ret = -2;
85+
goto read_out;
86+
}
87+
88+
read_repeat:
89+
fprintf(stdout, "\n");
90+
91+
/* Read everything in file */
92+
rewind(fd);
93+
ret = fread(buf, 1, cfg.trace_size, fd);
94+
if (ret == 0) {
95+
fprintf(stderr,
96+
"[ERROR] Nothing to read?\n");
97+
ret = -3;
98+
goto read_out;
99+
}
100+
101+
/* Go through each log line and display it */
102+
offset = 0;
103+
while ((offset + cfg.buf_size) <= cfg.trace_size) {
104+
log = (struct log_t *)(buf + offset);
105+
106+
if (log->magic == MAGIC) {
107+
/* Avoid non-null terminated strings */
108+
ret = snprintf(log_buf, max_log_strlen,
109+
"%s", &log->log[0]);
110+
log_buf[max_log_strlen] = 0;
111+
112+
fprintf(stdout, "[ID:%5u] %s", log->id, log_buf);
113+
}
114+
115+
/* Move to next log line */
116+
offset += cfg.buf_size;
117+
};
118+
119+
/* If interval is specified, wait and loop */
120+
if (cfg.interval_usecs) {
121+
usleep(cfg.interval_usecs);
122+
goto read_repeat;
123+
}
124+
125+
ret = 0;
126+
127+
read_out:
128+
if (buf) {
129+
free(buf);
130+
}
131+
if (log_buf) {
132+
free(log_buf);
133+
}
134+
if (fd) {
135+
fclose(fd);
136+
}
137+
return ret;
138+
}
139+
140+
int main(int argc, char *argv[])
141+
{
142+
int opt, ret = 0;
143+
144+
/* Defaults */
145+
cfg.infile = sof_etrace_path;
146+
cfg.trace_size = default_trace_size;
147+
cfg.buf_size = default_buf_size;
148+
cfg.interval_usecs = 0;
149+
150+
/* Parse arguments */
151+
while ((opt = getopt(argc, argv, "hsqi:t:b:n:")) != -1) {
152+
switch (opt) {
153+
case 's':
154+
cfg.infile = sof_etrace_path;
155+
break;
156+
case 'q':
157+
cfg.infile = qemu_etrace_path;
158+
break;
159+
case 'i':
160+
cfg.infile = optarg;
161+
break;
162+
case 't':
163+
cfg.trace_size = strtoul(optarg, NULL, 0);
164+
if (cfg.trace_size == ULONG_MAX) {
165+
fprintf(stderr, "[ERROR] Error parsing -t\n");
166+
ret = errno;
167+
goto main_out;
168+
}
169+
break;
170+
case 'b':
171+
cfg.buf_size = strtoul(optarg, NULL, 0);
172+
if (cfg.buf_size == ULONG_MAX) {
173+
fprintf(stderr, "[ERROR] Error parsing -b\n");
174+
ret = errno;
175+
goto main_out;
176+
}
177+
break;
178+
case 'n':
179+
cfg.interval_usecs = strtoul(optarg, NULL, 0);
180+
if (cfg.interval_usecs == ULONG_MAX) {
181+
fprintf(stderr, "[ERROR] Error parsing -n\n");
182+
ret = errno;
183+
goto main_out;
184+
}
185+
break;
186+
case 'h':
187+
default:
188+
usage(argv[0]);
189+
goto main_out;
190+
}
191+
}
192+
193+
fprintf(stdout, "[INFO ] Using %s as input file\n", cfg.infile);
194+
fprintf(stdout, "[INFO ] Trace buffer size: %lu\n", cfg.trace_size);
195+
fprintf(stdout, "[INFO ] Log line buffer size: %lu\n", cfg.buf_size);
196+
if (cfg.interval_usecs == 0) {
197+
fprintf(stdout, "[INFO ] Read once\n");
198+
} else {
199+
fprintf(stdout, "[INFO ] Update Interval: %lu\n",
200+
cfg.interval_usecs);
201+
}
202+
203+
ret = read_logs();
204+
205+
main_out:
206+
return ret;
207+
}

samples/audio/sof/prj.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CONFIG_SOF=y
22
CONFIG_LOG=y
33
CONFIG_LOG_BACKEND_XTENSA_SIM=y
4+
CONFIG_LOG_BACKEND_ADSP=y
45
CONFIG_LOG_IMMEDIATE=y
56
CONFIG_SOF_LOG_LEVEL=4
67
# SOF requires malloc/calloc

samples/hello_world/src/main.c

Lines changed: 1 addition & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -7,80 +7,7 @@
77
#include <zephyr.h>
88
#include <sys/printk.h>
99

10-
#include <stdint.h>
11-
12-
#include <xtensa/config/core.h>
13-
#include <xtensa/hal.h>
14-
15-
#define CONFIG_TRACE 1
16-
17-
/* SRAM window 0 FW "registers" */
18-
#define SRAM_REG_ROM_STATUS 0x0
19-
#define SRAM_REG_FW_STATUS 0x4
20-
#define SRAM_REG_FW_TRACEP 0x8
21-
#define SRAM_REG_FW_IPC_RECEIVED_COUNT 0xc
22-
#define SRAM_REG_FW_IPC_PROCESSED_COUNT 0x10
23-
#define SRAM_REG_FW_END 0x14
24-
25-
#define HP_SRAM_BASE 0xBE000000
26-
#define HEAP_HP_BUFFER_BASE HP_SRAM_BASE
27-
#define HEAP_HP_BUFFER_SIZE 0x8000
28-
#define SRAM_WND_BASE (HEAP_HP_BUFFER_BASE + HEAP_HP_BUFFER_SIZE)
29-
#define SRAM_SW_REG_BASE (SRAM_INBOX_BASE + SRAM_INBOX_SIZE)
30-
#define MAILBOX_SW_REG_BASE SRAM_SW_REG_BASE
31-
32-
#define SRAM_TRACE_BASE SRAM_WND_BASE
33-
#if CONFIG_TRACE
34-
#define SRAM_TRACE_SIZE 0x2000
35-
#else
36-
#define SRAM_TRACE_SIZE 0
37-
#endif
38-
#define SRAM_DEBUG_BASE (SRAM_TRACE_BASE + SRAM_TRACE_SIZE)
39-
#define SRAM_DEBUG_SIZE 0x800
40-
#define SRAM_EXCEPT_BASE (SRAM_DEBUG_BASE + SRAM_DEBUG_SIZE)
41-
#define SRAM_EXCEPT_SIZE 0x800
42-
#define SRAM_STREAM_BASE (SRAM_EXCEPT_BASE + SRAM_EXCEPT_SIZE)
43-
#define SRAM_STREAM_SIZE 0x1000
44-
#define SRAM_INBOX_BASE (SRAM_STREAM_BASE + SRAM_STREAM_SIZE)
45-
#define SRAM_INBOX_SIZE 0x2000
46-
47-
#define DCACHE_LINE_SIZE XCHAL_DCACHE_LINESIZE
48-
49-
static inline void dcache_writeback_region(void *addr, size_t size)
50-
{
51-
#if XCHAL_DCACHE_SIZE > 0
52-
xthal_dcache_region_writeback(addr, size);
53-
#endif
54-
}
55-
56-
static inline void mailbox_sw_reg_write(size_t offset, uint32_t src)
57-
{
58-
*((volatile uint32_t*)(MAILBOX_SW_REG_BASE + offset)) = src;
59-
dcache_writeback_region((void *)(MAILBOX_SW_REG_BASE + offset),
60-
sizeof(src));
61-
}
62-
63-
/* Platform defined trace code */
64-
#define platform_trace_point(__x) \
65-
mailbox_sw_reg_write(SRAM_REG_FW_TRACEP, (__x))
66-
67-
68-
#define SHIM_BASE 0x00001000
69-
70-
static inline uint32_t shim_read(uint32_t reg)
71-
{
72-
return *((volatile uint32_t*)(SHIM_BASE + reg));
73-
}
74-
75-
static inline void shim_write(uint32_t reg, uint32_t val)
76-
{
77-
*((volatile uint32_t*)(SHIM_BASE + reg)) = val;
78-
}
79-
8010
void main(void)
8111
{
82-
mailbox_sw_reg_write(SRAM_REG_ROM_STATUS, 0xabbac0fe);
83-
#if 0
84-
platform_trace_point(0xabbac0ffe);
85-
#endif
12+
printk("Hello World! %s\n", CONFIG_BOARD);
8613
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "sof_config.h"

0 commit comments

Comments
 (0)