asix-sigma: Remove stack-based alloc in download_capture()

Avoid allocating 32KiB of data on stack in download_capture(). Instead,
do a glib-variant of calloc(1, ) to allocate the data for the samples
which will be downloaded. This avoids explosions of stack on systems
with tight stack limits.

Furthermore, define structures describing the organisation of Sigma's
DRAM memory and start using those instead of ad-hoc preprocessor macros
defining the sizes of various structures in memory.

Signed-off-by: Marek Vasut <marex@denx.de>
This commit is contained in:
Marek Vasut 2014-04-20 21:34:36 +02:00 committed by Bert Vermeulen
parent 462fe78664
commit fd830beb67
2 changed files with 29 additions and 1 deletions

View File

@ -1073,13 +1073,20 @@ static int download_capture(struct sr_dev_inst *sdi)
{ {
struct dev_context *devc = sdi->priv; struct dev_context *devc = sdi->priv;
const int chunks_per_read = 32; const int chunks_per_read = 32;
unsigned char buf[chunks_per_read * CHUNK_SIZE]; struct sigma_dram_line *dram_line;
unsigned char *buf;
int bufsz, i, numchunks, newchunks; int bufsz, i, numchunks, newchunks;
uint32_t stoppos, triggerpos; uint32_t stoppos, triggerpos;
int triggerchunk, chunks_downloaded; int triggerchunk, chunks_downloaded;
struct sr_datafeed_packet packet; struct sr_datafeed_packet packet;
uint8_t modestatus; uint8_t modestatus;
dram_line = g_try_malloc0(chunks_per_read * sizeof(*dram_line));
if (!dram_line)
return FALSE;
buf = (unsigned char *)dram_line;
sr_info("Downloading sample data."); sr_info("Downloading sample data.");
/* Stop acquisition. */ /* Stop acquisition. */
@ -1143,6 +1150,8 @@ static int download_capture(struct sr_dev_inst *sdi)
dev_acquisition_stop(sdi, sdi); dev_acquisition_stop(sdi, sdi);
g_free(dram_line);
return TRUE; return TRUE;
} }

View File

@ -76,6 +76,25 @@ enum sigma_read_register {
#define CHUNK_SIZE 1024 #define CHUNK_SIZE 1024
/*
* The entire ASIX Sigma DRAM is an array of struct sigma_dram_line[1024];
*/
/* One "DRAM cluster" contains a timestamp and 7 samples, 16b total. */
struct sigma_dram_cluster {
uint8_t timestamp_lo;
uint8_t timestamp_hi;
struct {
uint8_t sample_hi;
uint8_t sample_lo;
} samples[7];
};
/* One "DRAM line" contains 64 "DRAM clusters", 1024b total. */
struct sigma_dram_line {
struct sigma_dram_cluster cluster[64];
};
struct clockselect_50 { struct clockselect_50 {
uint8_t async; uint8_t async;
uint8_t fraction; uint8_t fraction;