From fdd11425c4663a81baf6a20be600c81580753f6e Mon Sep 17 00:00:00 2001 From: 488_MP-4 <488_MP-4@iastate.edu> Date: Fri, 8 Mar 2024 02:16:47 +0100 Subject: [PATCH] working on shared mem buffer --- uboot-compiler/shmbuffer/main.c | 26 +------------ uboot-compiler/shmbuffer/memory.c | 36 +++++++++++++++++ uboot-compiler/shmbuffer/memory.h | 15 ++++++++ uboot-compiler/shmbuffer/packet.h | 12 ++++++ uboot-compiler/shmbuffer/queue.c | 64 +++++++++++++++++++++++++++++++ uboot-compiler/shmbuffer/queue.h | 25 ++++++++++++ 6 files changed, 153 insertions(+), 25 deletions(-) create mode 100644 uboot-compiler/shmbuffer/memory.c create mode 100644 uboot-compiler/shmbuffer/memory.h create mode 100644 uboot-compiler/shmbuffer/packet.h create mode 100644 uboot-compiler/shmbuffer/queue.c create mode 100644 uboot-compiler/shmbuffer/queue.h diff --git a/uboot-compiler/shmbuffer/main.c b/uboot-compiler/shmbuffer/main.c index 0aadcad45..8ded25ca1 100644 --- a/uboot-compiler/shmbuffer/main.c +++ b/uboot-compiler/shmbuffer/main.c @@ -1,31 +1,7 @@ -#include<stdio.h> -#include<stddef.h> -#include<sys/mman.h> -#include<fcntl.h> - -#define SHMADDR 0x3F000000 int main(int argc, char *argv[]) { - int fd; - int * memaddr; - - fd = open("/dev/mem", O_RDWR); - - if (fd == -1) - { - printf("can not access /dev/mem\n" ); - return -1; - } - - memaddr = - (int*)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, SHMADDR); - if (memaddr == MAP_FAILED) - { - printf("mmap failed\n" ); - return -1; - } - printf("value=%d\n", *memaddr); + } \ No newline at end of file diff --git a/uboot-compiler/shmbuffer/memory.c b/uboot-compiler/shmbuffer/memory.c new file mode 100644 index 000000000..4c6c595bd --- /dev/null +++ b/uboot-compiler/shmbuffer/memory.c @@ -0,0 +1,36 @@ +#include "memory.h" + +char* map_shared_mem() +{ + int fd; + char *memaddr; + + fd = open("/dev/mem", O_RDWR); + + if (fd == -1) + { + printf("can not access /dev/mem\n" ); + return NULL; + } + + memaddr = + (char *)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, SHMADDR); + if (memaddr == MAP_FAILED) + { + printf("mmap failed\n" ); + return NULL; + } + return memaddr; +} + +int write_shared_mem(char* memaddr, packet_t packet) +{ + *memaddr = 0xFF; + memcpy(*(memaddr + 1), packet.data, packet.len); + return 0; +} + +int shared_mem_loop(queue_t* queue) +{ + +} \ No newline at end of file diff --git a/uboot-compiler/shmbuffer/memory.h b/uboot-compiler/shmbuffer/memory.h new file mode 100644 index 000000000..e8dd66123 --- /dev/null +++ b/uboot-compiler/shmbuffer/memory.h @@ -0,0 +1,15 @@ +#ifndef MEMORY_H +#define MEMORY_H + +#include<stdio.h> +#include<stddef.h> +#include<sys/mman.h> +#include<fcntl.h> +#include<string.h> +#include<stdint.h> + +#include "queue.h" + +#define SHMADDR 0x3F000000 + +#endif \ No newline at end of file diff --git a/uboot-compiler/shmbuffer/packet.h b/uboot-compiler/shmbuffer/packet.h new file mode 100644 index 000000000..ca6d412d6 --- /dev/null +++ b/uboot-compiler/shmbuffer/packet.h @@ -0,0 +1,12 @@ +#ifndef PACKET_H +#define PACKET_H + +#include<stddef.h> + +typedef struct packet { + size_t len; + char * data; +} packet_t; + + +#endif \ No newline at end of file diff --git a/uboot-compiler/shmbuffer/queue.c b/uboot-compiler/shmbuffer/queue.c new file mode 100644 index 000000000..66047c5b5 --- /dev/null +++ b/uboot-compiler/shmbuffer/queue.c @@ -0,0 +1,64 @@ +#include "queue.h" + +/* +Author: Justin Kenny + +Creates a queue to hold packets for shared memory based on a linked list +*/ + +//Initializes the queue.s +void queue_init(queue_t *queue) +{ + queue->head = NULL; + queue->tail = NULL; + queue->size = 0; +} + +//Returns a pointer to the new queue node. If it return null, then malloc failed. +queue_node_t* enqueue(queue_t *queue, packet_t* packet) +{ + queue_node_t *n; + n = malloc(sizeof(*n)); + if(n) + { + n->data = packet; + if(queue->head) + { + queue->tail->next = n; + n->prev = queue->tail; + queue->tail = n; + } + else + { + //the queue is empty + queue->head = queue->tail = n; + } + queue->size++; + } + return n; +} + +packet_t* dequeue(queue_t *queue) +{ + queue_node_t *n; + if(!queue->head) + { + return NULL; + } + if(queue->head == queue->tail) + { + n = queue->head; + queue->head = queue->tail = NULL; + } + else + { + queue_node_t *next; + next = queue->head->next; + n = queue->head; + next->prev = NULL; + queue->head = next; + } + packet_t *packet = n->data; + free(n); + return packet; +} \ No newline at end of file diff --git a/uboot-compiler/shmbuffer/queue.h b/uboot-compiler/shmbuffer/queue.h new file mode 100644 index 000000000..70146f334 --- /dev/null +++ b/uboot-compiler/shmbuffer/queue.h @@ -0,0 +1,25 @@ +#ifndef QUEUE_H +#define QUEUE_H + +#include "packet.h" +#include <stdlib.h> + +typedef struct queue_node { + struct queue_node *next; + struct queue_node *prev; + packet_t *data; +} queue_node_t; + +typedef struct queue { + queue_node_t *head; + queue_node_t *tail; + int size; +} queue_t; + +void queue_init(queue_t *queue); + +queue_node_t* enqueue(queue_t *queue, packet_t* packet); + +packet_t* dequeue(queue_t *queue); + +#endif \ No newline at end of file -- GitLab