Sigma: Support for low samplerates

Lowest samplerate supported in driver is 250 KHz
This commit is contained in:
Håvard Espeland 2010-04-28 22:45:13 +02:00
parent f78898e947
commit edca2c5c22
2 changed files with 44 additions and 8 deletions

View File

@ -48,6 +48,10 @@ static int num_probes = 0;
static int samples_per_event = 0;
static uint64_t supported_samplerates[] = {
KHZ(250),
MHZ(1),
MHZ(10),
MHZ(25),
MHZ(50),
MHZ(100),
MHZ(200),
@ -55,7 +59,7 @@ static uint64_t supported_samplerates[] = {
};
static struct samplerates samplerates = {
MHZ(50),
KHZ(250),
MHZ(200),
0,
supported_samplerates,
@ -470,7 +474,7 @@ static int set_samplerate(struct sigrok_device_instance *sdi, uint64_t samplerat
if (samplerate <= MHZ(50)) {
ret = upload_firmware(0);
num_probes = 16;
// XXX: Setup divider
// XXX: Setup divider if < 50 MHz
}
if (samplerate == MHZ(100)) {
ret = upload_firmware(1);
@ -515,7 +519,7 @@ static void *hw_get_device_info(int device_index, int device_info_id)
info = sdi;
break;
case DI_NUM_PROBES:
info = GINT_TO_POINTER(4);
info = GINT_TO_POINTER(16);
break;
case DI_SAMPLERATES:
info = &samplerates;
@ -618,8 +622,9 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts,
/* For each probe. */
for (l = 0; l < num_probes; ++l)
cur_sample |= (!!(event[j] &
(1 << (l * 2 + k)))) << l;
cur_sample |= (!!(event[j] & (1 << (l *
samples_per_event + k))))
<< l;
samples[n++] = cur_sample;
}
@ -741,8 +746,33 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
/* Trigger normal (falling edge). */
sigma_set_register(WRITE_TRIGGER_SELECT1, 0x08);
/* Enable pins (200 MHz, 4 pins). */
sigma_set_register(WRITE_CLOCK_SELECT, 0xf0);
/* Set clock select register. */
if (cur_samplerate == MHZ(200))
/* Enable 4 probes. */
sigma_set_register(WRITE_CLOCK_SELECT, 0xf0);
else if (cur_samplerate == MHZ(100))
/* Enable 8 probes. */
sigma_set_register(WRITE_CLOCK_SELECT, 0x00);
else {
/*
* 50 MHz mode (or fraction thereof)
* Any fraction down to 50 MHz / 256 can be used,
* but is not suppoted by Sigrok API.
*/
int frac = MHZ(50) / cur_samplerate - 1;
struct clockselect_50 clockselect = {
.async = 0,
.fraction = frac,
.disabled_probes = 0,
};
sigma_write_register(WRITE_CLOCK_SELECT,
(uint8_t *) &clockselect,
sizeof(clockselect));
}
/* Setup maximum post trigger time. */
sigma_set_register(WRITE_POST_TRIGGER, 0xff);
@ -764,7 +794,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
gettimeofday(&header.starttime, NULL);
header.samplerate = cur_samplerate;
header.protocol_id = PROTO_RAW;
header.num_probes = 4;
header.num_probes = num_probes;
session_bus(session_device_id, &packet);
return SIGROK_OK;

View File

@ -71,4 +71,10 @@ enum sigma_read_register {
#define CHUNK_SIZE 1024
struct clockselect_50 {
uint8_t async;
uint8_t fraction;
uint16_t disabled_probes;
};
#endif