1,将驱动中产生的大量数据通过mmap传递到用户空间
构造一个ringbuffer,驱动中将产生的数据放入ringbuffer,用户空间将ringbuffer中的数据读走存在文件中
2,driver
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/version.h>
#include <linux/kfifo.h>
#include <linux/miscdevice.h>
#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/mman.h>
#define LOG_FIFO_SIZE 8172
#define LOG_DEVICE_NAME "tp_tools"
#define LOG_RINGBUFFER_SIZE 8192
#define GTP_MMAP_PAGE_ORDER 3
struct ringbuffer {
unsigned int in;
unsigned int out;
unsigned int size;
unsigned char buffer[LOG_RINGBUFFER_SIZE];
};
struct good_ts_log {
struct kfifo fifo;
wait_queue_head_t wq;
struct miscdevice miscdev;
struct ringbuffer *rbuffer;
};
static struct good_ts_log ts_log_dev;
ringbuffer start///
int _ringbuffer_init(struct ringbuffer *rbuffer, unsigned int size)
{
/* size must be a power of 2 */
BUG_ON(size & (size -1));
rbuffer->size = size;
rbuffer->in = rbuffer->out = 0;
ts_info("_ringbuffer_init success");
return 0;
}
/* puts some data into the ringbuffer, no locking version */
unsigned int _ringbuffer_put(struct ringbuffer *rbuffer,
unsigned char *buffer, unsigned int len)
{
unsigned int l;
len = min(len, rbuffer->size - rbuffer->in + rbuffer->out);
/* first put the data starting from rbuffer->in to buffer end */
l = min(len, rbuffer->size - (rbuffer->in & (rbuffer->size -1)));
memcpy(rbuffer->buffer + (rbuffer->in & (rbuffer->size -1)), buffer, l);
/* then put the reset (if any) at the beginging of the buffer */
memcpy(rbuffer->buffer, buffer + l, len -l);
rbuffer->in += len;
return len;
}
/* gets some data from the ringbuffer, no locking version */
__maybe_unused unsigned int ringbuffer_get(struct ringbuffer *rbuffer, unsigned char *buffer,
unsigned int len)
{
unsigned int l;
len = min(len, rbuffer->in - rbuffer->out);
/* first get the data from rbuffer->out until the end of the buffer */
l = min(len, rbuffer->size - (rbuffer->out & (rbuffer->size -1)));
memcpy(buffer, rbuffer->buffer + (rbuffer->out & (rbuffer->size -1)), l);
/* then get the reset (if any) from the beginning of the buffer */
memcpy(buffer + l, rbuffer->buffer, len - l);
rbuffer->out += len;
return len;
}
/* check if ringbuffer is full or empty
* return 0: empty
* return length ==