1*daf7040cSXianjun Jiao // Author: Xianjun Jiao ([email protected]; [email protected])
2*daf7040cSXianjun Jiao // SPDX-FileCopyrightText: 2023 UGent
3*daf7040cSXianjun Jiao // SPDX-License-Identifier: AGPL-3.0-or-later
4*daf7040cSXianjun Jiao
5*daf7040cSXianjun Jiao // Use this example together with fast_reg_log_analyzer.m (notter release)
6*daf7040cSXianjun Jiao
7*daf7040cSXianjun Jiao #include <stdio.h>
8*daf7040cSXianjun Jiao #include <stdlib.h>
9*daf7040cSXianjun Jiao #include <string.h>
10*daf7040cSXianjun Jiao #include <unistd.h>
11*daf7040cSXianjun Jiao #include <fcntl.h>
12*daf7040cSXianjun Jiao #include <sys/mman.h>
13*daf7040cSXianjun Jiao #include <stdint.h>
14*daf7040cSXianjun Jiao
main()15*daf7040cSXianjun Jiao int main()
16*daf7040cSXianjun Jiao {
17*daf7040cSXianjun Jiao unsigned int bram_size = 0x10000; // 64KB, aligned with openwifi hw .bd and devicetree
18*daf7040cSXianjun Jiao off_t bram_pbase = 0x83c40000; // physical base address, aligned with openwifi hw .bd and devicetree (this example: xpu @ 32bit boards)
19*daf7040cSXianjun Jiao uint32_t *bram32_vptr;
20*daf7040cSXianjun Jiao int fd, i, j;
21*daf7040cSXianjun Jiao uint32_t tsf_reg[524288*2];
22*daf7040cSXianjun Jiao FILE *fp;
23*daf7040cSXianjun Jiao // Map the BRAM physical address into user space getting a virtual address for it
24*daf7040cSXianjun Jiao if ((fd = open("/dev/mem", O_RDONLY | O_SYNC)) != -1) {
25*daf7040cSXianjun Jiao bram32_vptr = (uint32_t *)mmap(NULL, bram_size, PROT_READ, MAP_SHARED, fd, bram_pbase);
26*daf7040cSXianjun Jiao
27*daf7040cSXianjun Jiao fp = fopen ("fast_reg_log.bin", "wb");
28*daf7040cSXianjun Jiao if (fp == NULL) {
29*daf7040cSXianjun Jiao printf("fopen fast_reg_log.bin failed! %d\n", (int)fp);
30*daf7040cSXianjun Jiao close(fd);
31*daf7040cSXianjun Jiao return(0);
32*daf7040cSXianjun Jiao }
33*daf7040cSXianjun Jiao
34*daf7040cSXianjun Jiao for (j=0; j<10; j++) {
35*daf7040cSXianjun Jiao for (i=0; i<(524288*2); i=i+2) {
36*daf7040cSXianjun Jiao tsf_reg[i+0] = (*(bram32_vptr+57)); // read xpu register 57: rssi trx agc cca status
37*daf7040cSXianjun Jiao tsf_reg[i+1] = (*(bram32_vptr+58)); // read xpu register 58: low 32bit of tsf
38*daf7040cSXianjun Jiao }
39*daf7040cSXianjun Jiao
40*daf7040cSXianjun Jiao // for (i=0; i<1024; i++) {
41*daf7040cSXianjun Jiao // printf("%d %x\n", tsf[i], reg[i]);
42*daf7040cSXianjun Jiao // }
43*daf7040cSXianjun Jiao // memcpy(buf, bram64_vptr, bram_size);
44*daf7040cSXianjun Jiao
45*daf7040cSXianjun Jiao fwrite(tsf_reg, sizeof(uint32_t), 524288*2, fp);
46*daf7040cSXianjun Jiao }
47*daf7040cSXianjun Jiao
48*daf7040cSXianjun Jiao fclose(fp);
49*daf7040cSXianjun Jiao // printf("%016llx\n", buf[65532]);
50*daf7040cSXianjun Jiao // printf("%016llx\n", buf[65533]);
51*daf7040cSXianjun Jiao // printf("%016llx\n", buf[65534]);
52*daf7040cSXianjun Jiao // printf("%016llx\n", buf[65535]);
53*daf7040cSXianjun Jiao // //for(i=0; i<32; i++) {
54*daf7040cSXianjun Jiao // // printf("0x%02x\n", buf[i]);
55*daf7040cSXianjun Jiao // //}
56*daf7040cSXianjun Jiao
57*daf7040cSXianjun Jiao close(fd);
58*daf7040cSXianjun Jiao }
59*daf7040cSXianjun Jiao return(0);
60*daf7040cSXianjun Jiao }
61