From 1676b42d58b2813fb6af60038d2619b2223bb47f Mon Sep 17 00:00:00 2001 From: fastium Date: Thu, 2 Apr 2026 08:32:52 +0200 Subject: [PATCH] feat(lab03): refactor exrcice to make it in several files --- src/02-driver/exercice/ex1-memory-oriented.c | 56 +++++++++++++++++ src/02-driver/main.c | 66 ++++++-------------- 2 files changed, 75 insertions(+), 47 deletions(-) create mode 100644 src/02-driver/exercice/ex1-memory-oriented.c diff --git a/src/02-driver/exercice/ex1-memory-oriented.c b/src/02-driver/exercice/ex1-memory-oriented.c new file mode 100644 index 0000000..07b451d --- /dev/null +++ b/src/02-driver/exercice/ex1-memory-oriented.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int ex_memory_oriented(void) { + + int fd = open("/dev/mem", O_RDWR); + + if (fd < 0) { + printf("Failed to open /dev/mem: %s\n", strerror(errno)); + return 1; + } + + size_t page_size = getpagesize(); // return the number of byte in a page + off_t chip_id_addr = 0x01c14200; // physical address + off_t offset = chip_id_addr % page_size; // get the number of page until the chip is address + off_t start_page = chip_id_addr - offset; // align with pages + + printf("page_size=0x%x offset=0x%x offset_page=0x%x\n", (unsigned int) page_size, (unsigned int) offset, (unsigned int) start_page); + + // Get register virtual address from /dev/mem of the chip id + volatile uint32_t* regs = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, start_page); + + if (regs == MAP_FAILED) { + printf("Failed to mmap: %s\n", strerror(errno)); + return 1; + } + + + + uint32_t chipid[4] = {[0] = 0,}; + + // Read values - Chip ID + chipid[0] = *(regs + (0x00 + offset) / sizeof(uint32_t)); + chipid[1] = *(regs + (0x04 + offset) / sizeof(uint32_t)); + chipid[2] = *(regs + (0x08 + offset) / sizeof(uint32_t)); + chipid[3] = *(regs + (0x0c + offset) / sizeof(uint32_t)); + printf( + "chipid=%08x'%08x'%08x'%08x\n", + chipid[0], chipid[1], chipid[2], chipid[3] + ); + + // Free space memory of the user¨ + munmap((void*)regs, page_size); + + // Close the file + close(fd); + + + return 0; +} diff --git a/src/02-driver/main.c b/src/02-driver/main.c index d8c277b..b60e5ad 100644 --- a/src/02-driver/main.c +++ b/src/02-driver/main.c @@ -1,55 +1,27 @@ -#include -#include #include -#include -#include -#include -#include -#include + +#include "exercice/ex1-memory-oriented.c" +#define MEMORY_ORIENTED + +#include "exercice/ex2-charachter-oriented.c" +// #define CHARACTER_ORIENTED + int main() { + int ret = 0; - int fd = open("/dev/mem", O_RDWR); +#ifdef MEMORY_ORIENTED + printf("--------------------------------------\n"); + printf("Exercice 1: Memory oriented exercice\n"); + ret = ex_memory_oriented(); +#endif - if (fd < 0) { - printf("Failed to open /dev/mem: %s\n", strerror(errno)); - return 1; - } - - size_t page_size = getpagesize(); // return the number of byte in a page - off_t chip_id_addr = 0x01c14200; // physical address - off_t offset = chip_id_addr % page_size; // get the number of page until the chip is address - off_t start_page = chip_id_addr - offset; // align with pages - - printf("page_size=0x%x offset=0x%x offset_page=0x%x\n", (unsigned int) page_size, (unsigned int) offset, (unsigned int) start_page); - - // Get register virtual address from /dev/mem of the chip id - volatile uint32_t* regs = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, start_page); - - if (regs == MAP_FAILED) { - printf("Failed to mmap: %s\n", strerror(errno)); - return 1; - } +#ifdef CHARACTER_ORIENTED + printf("--------------------------------------\n"); + printf("Exercice 2: Character oriented exercice\n"); + ret = ex_character_oriented(); +#endif - - uint32_t chipid[4] = {[0] = 0,}; - - // Read values - Chip ID - chipid[0] = *(regs + (0x00 + offset) / sizeof(uint32_t)); - chipid[1] = *(regs + (0x04 + offset) / sizeof(uint32_t)); - chipid[2] = *(regs + (0x08 + offset) / sizeof(uint32_t)); - chipid[3] = *(regs + (0x0c + offset) / sizeof(uint32_t)); - printf( - "chipid=%08x'%08x'%08x'%08x\n", - chipid[0], chipid[1], chipid[2], chipid[3] - ); - - // Free space memory of the user¨ - munmap((void*)regs, page_size); - - // Close the file - close(fd); - - return 0; + return ret; }