1
0

feat(lab03): refactor exrcice to make it in several files

This commit is contained in:
2026-04-02 08:32:52 +02:00
parent a6d7b86637
commit 1676b42d58
2 changed files with 75 additions and 47 deletions

View File

@@ -0,0 +1,56 @@
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
#include <sys/mman.h>
#include <unistd.h>
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;
}

View File

@@ -1,55 +1,27 @@
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
#include <sys/mman.h>
#include <unistd.h>
#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;
}