Get samples from device fifo

This commit is contained in:
grisel-davy 2021-02-17 11:37:06 +01:00
parent 1f92d206ed
commit 506893ab2b

View file

@ -66,6 +66,10 @@ static int fifo_full(struct Fifo *f) {
static void fifo_push(struct Fifo *f, struct Sample *s) { static void fifo_push(struct Fifo *f, struct Sample *s) {
f->content[f->write_idx] = *s; f->content[f->write_idx] = *s;
f->write_idx = (f->write_idx + 1) % FIFO_SIZE; f->write_idx = (f->write_idx + 1) % FIFO_SIZE;
// Push read index because we keep only the {FIFO_SIZE} last samples
if(f->write_idx == f->read_idx){
f->read_idx = (f->read_idx + 1) % FIFO_SIZE;
}
} }
static struct Sample fifo_pop(struct Fifo *f) { static struct Sample fifo_pop(struct Fifo *f) {
@ -104,43 +108,48 @@ ssize_t adxl345_read(struct file *file, char __user *buf, size_t count, loff_t *
irq_handler_t adxl345_int(int irq, struct adxl345_device * d){ irq_handler_t adxl345_int(int irq, struct adxl345_device * d){
int16_t x; struct Sample sample;
int16_t y;
int16_t z;
struct Sample sample = { char question[2];
.x = x, // TODO: changer le format de question
.y = y, question[0] = 0x39;
.z = z question[1] = 0x00;
}; unsigned char response[6];
char question = 0x00;
char response;
char ret_code[2]; char ret_code[2];
int nentries; char nentries;
int nsample; char nsample;
char i;
struct miscdevice miscdev = d->miscdev; struct miscdevice miscdev = d->miscdev;
struct i2c_client *ptrclient = container_of(miscdev.parent,struct i2c_client,dev); struct device *dev = miscdev.parent;
struct i2c_client *client; struct i2c_client *client = container_of(dev,struct i2c_client,dev);
copy_from_user(client,ptrclient,sizeof(ptrclient));
// Get number of entries in Hard FIFO
ret_code[0] = i2c_master_send(client,question,1); ret_code[0] = i2c_master_send(client,question,1);
ret_code[1] = i2c_master_recv(client,response,1); ret_code[1] = i2c_master_recv(client,response,1);
if(ret_code[0] < 0 || ret_code[1] < 0){ if(ret_code[0] < 0 || ret_code[1] < 0){
pr_info("Error in reading FIFO STATUS: %i %i\n",ret_code[0], ret_code[1]); pr_info("Error in reading FIFO STATUS: %i %i\n",ret_code[0], ret_code[1]);
} }
nentries = response >>2; nentries = response[0] & 0x3f;
pr_info("HARD FIFO entries: %x\n",nentries); //pr_info("Getting %i sample from the Hard FIFO:\n",nentries);
fifo_push(&(d->fifo), &sample); for(i=nentries; i>0; i--){
// Get entries from Hard FIFO
question[0] = 0x32;
ret_code[0] = i2c_master_send(client,question,1);
ret_code[1] = i2c_master_recv(client,response,6);
sample.x = (int16_t)(response[1]<<8 | response[0]);
sample.y = (int16_t)(response[3]<<8 | response[2]);
sample.z = (int16_t)(response[5]<<8 | response[4]);
//pr_info(" Nouveau Sample: X=%i Y=%i Z=%i\n",sample.x,sample.y,sample.z);
fifo_push(&(d->fifo), &sample);
}
nsample = fifo_len(&(d->fifo)); nsample = fifo_len(&(d->fifo));
pr_info("%i samples in SOFT FIFO\n",nsample); //pr_info("%i samples in Soft FIFO\n",nsample);
return IRQ_HANDLED; return IRQ_HANDLED;
} }