Compare commits

...

6 commits

Author SHA1 Message Date
Stephan I. Böttcher
2d853d7804 uartterm: ucmd() and raise_e 2024-12-20 12:18:26 +01:00
Stephan I. Böttcher
c29c5a4a74 armlib: do not wait for Altera (DLRENA) 2024-12-20 12:17:40 +01:00
Stephan I. Böttcher
e07084356a ssp_isr: fix ssp_match.frame_count match 2024-12-18 22:28:51 +01:00
Stephan I. Böttcher
7473c73be6 ssp_run_batch: move ssp_b_job up, for speed 2024-12-11 21:12:51 +01:00
Stephan I. Böttcher
2174022a93 ads8688, ssp: fix ssp_buffer ?! 2024-12-10 13:40:24 +01:00
Stephan I. Böttcher
480574d902 ads8688: fix (de)assert_ssl 2024-12-10 12:02:29 +01:00
5 changed files with 44 additions and 38 deletions

View file

@ -27,15 +27,15 @@ static struct ads8688_control {
void ads8688_readings(struct ads8688_control *c, unsigned int cc, int i, int ii) void ads8688_readings(struct ads8688_control *c, unsigned int cc, int i, int ii)
{ {
unsigned short first = ssp_buffer[i]; unsigned short first = ssp_scratch[i];
unsigned int sum = first; unsigned int sum = first;
int square = 0; int square = 0;
int n = 1; int n = 1;
unsigned short sdo = 0; unsigned short sdo = 0;
if (!i && ii > 1) if (!i && ii > 1)
sdo = ssp_buffer[1]; sdo = ssp_scratch[1];
while ((i+=ii) < c->nbuf) { while ((i+=ii) < c->nbuf) {
int d = ssp_buffer[i]; int d = ssp_scratch[i];
sum += d; sum += d;
d -= first; d -= first;
square += d*d; square += d*d;
@ -83,6 +83,7 @@ static int read_cb(struct ads8688_control *c)
return alldone_cb(c); return alldone_cb(c);
c->frame = 0xc000 | cc << 10; c->frame = 0xc000 | cc << 10;
ssp_set_buffer(0, c->nbuf); ssp_set_buffer(0, c->nbuf);
ssp_assert_ssel();
return ssp_submit_batch(&c->frame, 1, 2, 0, 0); return ssp_submit_batch(&c->frame, 1, 2, 0, 0);
} }
@ -112,6 +113,7 @@ static int read_auto_cb(struct ads8688_control *c)
else else
return tcnh_cb(c); return tcnh_cb(c);
ssp_set_buffer(0, n); ssp_set_buffer(0, n);
ssp_assert_ssel();
return ssp_submit_batch(&c->frame, 1, 2, 0, 0); return ssp_submit_batch(&c->frame, 1, 2, 0, 0);
} }
@ -133,7 +135,7 @@ static int gains_cb(struct ads8688_control *c)
unsigned short f = c->frame; unsigned short f = c->frame;
if (f & 0xe000) if (f & 0xe000)
return tcnh_cb(c); return tcnh_cb(c);
unsigned int cc = save_gain(f, *ssp_buffer, &c->gains); unsigned int cc = save_gain(f, *ssp_scratch, &c->gains);
cc++; cc++;
if (cc == 12) if (cc == 12)
cc = 0; cc = 0;
@ -161,19 +163,18 @@ static const struct ssp_batch ads8688_batch[] = {
{ .ssel = &ssp_conf_adc }, { .ssel = &ssp_conf_adc },
}, },
[1] = { [1] = {
.flags = ssp_b_call .flags = ssp_b_call,
| ssp_b_deassert,
{ .callback = ads8688_cb }, { .callback = ads8688_cb },
{ .data = &ads8688_control }, { .data = &ads8688_control },
}, },
[2] { [2] = {
.flags = ssp_b_job .flags = ssp_b_job
| SSP_B_REPEAT(256) | ssp_b_whilebuf | SSP_B_REPEAT(256) | ssp_b_whilebuf
| ssp_b_assert | SSP_B_DELAY(10), | ssp_b_deassert | ssp_b_assert | SSP_B_DELAY(10),
{ .job = &ads8688_control.job}, { .job = &ads8688_control.job},
{ .match = &ads8688_control.match}, { .match = &ads8688_control.match},
}, },
[3] { [3] = {
.flags = ssp_b_goto .flags = ssp_b_goto
| ssp_b_stop | ssp_b_deassert, | ssp_b_stop | ssp_b_deassert,
{ .batch = 0 }, { .batch = 0 },

View file

@ -633,7 +633,6 @@ def init_irena(scope, name="xRENA", prod=None, options="", long_options=[]):
else: else:
_ifc_uart = uartterm.init_uart(scope=scope, prefix="serial_", dname=name, addr=v, isp=False) _ifc_uart = uartterm.init_uart(scope=scope, prefix="serial_", dname=name, addr=v, isp=False)
_ifc_uart._shell_scope = scope _ifc_uart._shell_scope = scope
_ifc_uart.uart.wait_for_message(b"Altera")
if o in "-N --network": if o in "-N --network":
import udpterm import udpterm
_ifc = udpterm.init_udp(scope=scope, dname=name, addr=v) _ifc = udpterm.init_udp(scope=scope, dname=name, addr=v)
@ -648,7 +647,7 @@ def init_irena(scope, name="xRENA", prod=None, options="", long_options=[]):
vvv=vv.split(".") vvv=vv.split(".")
bus = int(vvv[0]) if vvv[0] else None bus = int(vvv[0]) if vvv[0] else None
address = int(vvv[1]) if len(vvv)>1 and vvv[1] else None address = int(vvv[1]) if len(vvv)>1 and vvv[1] else None
if bus and _ifc_uart: if _ifc_uart:
address = _ifc_uart.uart.wait_for_usb() address = _ifc_uart.uart.wait_for_usb()
_ifc = usbterm.init_usb(scope=scope, dname=name, _ifc = usbterm.init_usb(scope=scope, dname=name,
prod=prod, bus=bus, address=address) prod=prod, bus=bus, address=address)

48
ssp.c
View file

@ -68,17 +68,19 @@ static void ssp_isr(void)
unsigned int dr = SSPDR; unsigned int dr = SSPDR;
sr=SSPSR; sr=SSPSR;
nread++; nread++;
fr++;
if (!rc if (!rc
&& fr >= ssp_match.frame_count && fr >= ssp_match.frame_count
&& (fr == ssp_match.frame_count || ssp_match.mask) && (fr == ssp_match.frame_count || ssp_match.mask)
&& (dr & ssp_match.mask) == ssp_match.value) { && (dr & ssp_match.mask) == ssp_match.value) {
rc = ssp_match.read_count; rc = ssp_match.read_count;
if (ssp_match.count) if (ssp_match.count) {
j->count = ssp_match.count int c = 1 + fr + ssp_match.count - ssp_frames_sent;
+ ssp_match.frame_count if (c < 0)
- ssp_frames_sent; c = 0;
j->count = c;
}
} }
fr++;
if (rc) { if (rc) {
rc--; rc--;
unsigned int bc = j->buf_count; unsigned int bc = j->buf_count;
@ -341,9 +343,6 @@ int ssp_run_batch()
if (f & ssp_b_scratch) if (f & ssp_b_scratch)
ssp_set_buffer(0, -1); ssp_set_buffer(0, -1);
if (c == ssp_b_buffer)
ssp_set_buffer(batch->buffer, f & 0xffff);
if (f & ssp_b_deassert) { if (f & ssp_b_deassert) {
ssp_deassert_ssel(); ssp_deassert_ssel();
ssel_delay(f); ssel_delay(f);
@ -374,12 +373,24 @@ int ssp_run_batch()
if (buffer_empty) if (buffer_empty)
continue; continue;
if (c == ssp_b_job) {
if (batch->match)
ssp_match = *batch->match;
else
memset(&ssp_match, 0, sizeof(ssp_match));
if (batch->job && batch->job->count)
return ssp_submit_job(batch->job);
}
if (c == ssp_b_buffer)
ssp_set_buffer(batch->buffer, f & 0xffff);
if (c == ssp_b_call) { if (c == ssp_b_call) {
int c = batch->callback(batch); int r = batch->callback(batch);
if (c != -1) { if (r != -1) {
if (c) if (r)
ssp_batch = 0; ssp_batch = 0;
return c; return r;
} }
} }
@ -395,15 +406,6 @@ int ssp_run_batch()
ssp_batch += batch->offset; ssp_batch += batch->offset;
} }
if (c == ssp_b_job) {
if (batch->match)
ssp_match = *batch->match;
else
memset(&ssp_match, 0, sizeof(ssp_match));
if (batch->job && batch->job->count)
return ssp_submit_job(batch->job);
}
if (c == ssp_b_wait) { if (c == ssp_b_wait) {
const struct timer_wait *wait = batch->wait; const struct timer_wait *wait = batch->wait;
if (!wait) { if (!wait) {
@ -666,8 +668,8 @@ int ssp_resp_cmd(struct command *cmd, const struct command_par *par)
if (what & 0x01000000 || r) { if (what & 0x01000000 || r) {
if (r) if (r)
code++; code++;
parser_format_message(cmd, "%03d ssp busy: 0x%x ssel 0x%08x mode 0x%04x\n", parser_format_message(cmd, "%03d ssp busy: 0x%x [%u] ssel 0x%08x mode 0x%04x\n",
code, r, ssp_config.ssel, ssp_config.mode); code, r, job.buf_count, ssp_config.ssel, ssp_config.mode);
return code; return code;
} }
} }

2
ssp.h
View file

@ -15,7 +15,7 @@ unsigned int ssp_busy(void);
int ssp_wait(int timeout); int ssp_wait(int timeout);
extern unsigned int ssp_bits; extern unsigned int ssp_bits;
unsigned short *ssp_buffer; extern unsigned short *ssp_buffer;
extern unsigned int ssp_ssel_mask; extern unsigned int ssp_ssel_mask;
extern unsigned int ssp_ssel; extern unsigned int ssp_ssel;
extern unsigned int ssp_read_size; extern unsigned int ssp_read_size;

View file

@ -872,7 +872,6 @@ class irena_uart(irena_ifc):
irena_ifc.__init__(self, dname=dname) irena_ifc.__init__(self, dname=dname)
self._data = uart(self, dev, baudrate) self._data = uart(self, dev, baudrate)
self.uart = self._data self.uart = self._data
self.resp = self._data.resp
if isp: if isp:
self._prompt += "-ISP" self._prompt += "-ISP"
self.uart.Init_ISP() self.uart.Init_ISP()
@ -881,14 +880,19 @@ class irena_uart(irena_ifc):
_CMDN = 1 # skip the first response character _CMDN = 1 # skip the first response character
def cmd(self, c, timeout=10000): def ucmd(self, c, timeout=10000, raise_e=None):
self._data.flush_responses() self._data.flush_responses()
self._data.serial.write(utf8_encode(c).strip()+b'\n') self._data.serial.write(utf8_encode(c).strip()+b'\n')
r = self._data.resp(timeout=timeout/1000.) r = self._data.resp(timeout=timeout/1000)
if self.verbosity >= 2: if self.verbosity >= 2:
sys.stderr.write("sent: %s recv: %s\n" % (repr(c),repr(r))) sys.stderr.write("sent: %s recv: %s\n" % (repr(c),repr(r)))
return r return r
def resp(self, timeout=1000, raise_e=None):
return self._data.resp(timeout = timeout/1000,
blocking = timeout > 0,
verbose = self.verbosity )
DataThread = None DataThread = None
class md3_gse(uart): class md3_gse(uart):