STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
fake_regs.c
Go to the documentation of this file.
1#include "fake_regs.h"
2
3#include <string.h>
4
5void fake_regs_init(fake_regs_t* f, bool ms_bit) {
6 memset(f, 0, sizeof(*f));
7 f->ms_bit = ms_bit;
8 f->fail_after = -1;
9}
10
11static int xfer(void* ctx, const uint8_t* tx, uint8_t* rx, uint16_t len) {
12 fake_regs_t* f = ctx;
13 if (f->fail_after >= 0 && (int)f->transfers >= f->fail_after) {
14 return DEV_ERR_BUS;
15 }
16 f->transfers++;
17 if (!tx || len < 1) {
18 return DEV_OK;
19 }
20 bool read = (tx[0] & 0x80U) != 0;
21 uint8_t addr = (uint8_t)(tx[0] & (f->ms_bit ? 0x3FU : 0x7FU));
22 bool inc = f->ms_bit ? (tx[0] & 0x40U) != 0 : true;
23 if (rx) {
24 rx[0] = 0xEE;
25 }
26 for (uint16_t i = 1; i < len; ++i) {
27 uint8_t a = (uint8_t)((addr + (inc ? i - 1U : 0U)) & 0x7FU);
28 if (read) {
29 if (rx) {
30 rx[i] = f->regs[a];
31 }
32 if (a == f->self_clear_reg && f->self_clear_bits &&
33 f->clear_after_reads && --f->clear_after_reads == 0) {
34 f->regs[a] &= (uint8_t)~f->self_clear_bits;
35 }
36 } else {
37 uint8_t keep = f->stuck[a];
38 f->regs[a] = (uint8_t)((f->regs[a] & keep) | (tx[i] & ~keep));
39 /* A real self-clearing bit clears after every write that sets
40 * it (ISM330DHCX SW_RESET, p.51), not only the first. */
41 if (a == f->self_clear_reg && (tx[i] & f->self_clear_bits) &&
44 }
45 if (f->writes < sizeof(f->write_reg)) {
46 f->write_reg[f->writes] = a;
47 f->write_val[f->writes] = tx[i];
48 }
49 f->writes++;
50 }
51 }
52 return DEV_OK;
53}
54
55static void delay_ms(void* ctx, uint32_t ms) {
56 ((fake_regs_t*)ctx)->delays_ms += ms;
57}
58
60 dev_bus_t bus = {xfer, delay_ms, f};
61 return bus;
62}
static void delay_ms(void *ctx, uint32_t ms)
static int xfer(void *ctx, const uint8_t *tx, uint8_t *rx, uint16_t len)
@ DEV_OK
Definition dev_bus.h:17
@ DEV_ERR_BUS
Definition dev_bus.h:18
static bool keep(emmc_log_t *log, uint8_t type, uint32_t t_ms, const void *data, uint8_t len)
Definition emmc_log.c:146
dev_bus_t fake_regs_bus(fake_regs_t *f)
Definition fake_regs.c:59
static void delay_ms(void *ctx, uint32_t ms)
Definition fake_regs.c:55
void fake_regs_init(fake_regs_t *f, bool ms_bit)
Definition fake_regs.c:5
static int xfer(void *ctx, const uint8_t *tx, uint8_t *rx, uint16_t len)
Definition fake_regs.c:11
*brief create JSON pointer *sa reference_tokens const string_t & a
Definition json.hpp:13877
uint8_t self_clear_bits
Definition fake_regs.h:21
unsigned self_clear_rearm
Definition fake_regs.h:23
uint8_t regs[128]
Definition fake_regs.h:17
unsigned writes
Definition fake_regs.h:26
uint8_t self_clear_reg
Definition fake_regs.h:20
uint8_t stuck[128]
Definition fake_regs.h:24
uint8_t write_reg[64]
Definition fake_regs.h:27
bool ms_bit
Definition fake_regs.h:18
unsigned transfers
Definition fake_regs.h:25
int fail_after
Definition fake_regs.h:19
unsigned clear_after_reads
Definition fake_regs.h:22
uint8_t write_val[64]
Definition fake_regs.h:28
static double read(int32_t code)