1.1 Release
[allwinner_tvout_manipulator.git] / src / devmem2.c
index abcd7e3..720aab5 100644 (file)
@@ -3,8 +3,8 @@
 // Author: Jan-Derk Bakker, Daniel Giritzer
 // Date: 2017-06-02
 // Description: Simple module to read/write from/to any location in memory.
-// Remarks: -
-// Revision: 1
+// Remarks: assumes a 4k page size and that sizeof(unsigned long) == 4
+// Revision: 1.2
 // Copyright (C) 2000, Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
 // Copyright (C) 2017, Daniel Giritzer (giri@nwrk.biz)
 ///////////////////////////////////////////////////////////////////////////
@@ -12,7 +12,6 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
-#include <string.h>
 #include <errno.h>
 #include <signal.h>
 #include <fcntl.h>
 #define MAP_SIZE 4096UL
 #define MAP_MASK (MAP_SIZE - 1)
 
+
+/////////////////////////////////////////////////
+/// \brief This function is called by the module
+///        if an error occurs.
+///
+/// \param char* Custom error Message.
+/////////////////////////////////////////////////
 static void ERROR(char* custom)
 {
+    //print custom error message
     fprintf(stderr, "Error: %s \n", custom);
+
+    //print further information
     fprintf(stderr, "Info: %d, %s\n",
             errno, strerror(errno));
 }
 
-int writemem(char* address, char* value, int access_type)
+/////////////////////////////////////////////////
+/// \brief This function allows writing to memory
+///        on the specified address.
+///
+/// \param unsigned long Address to write to
+/// \param unsigned long Value to write
+/// \param int Access type, should be 'w' (word),
+///        'h' (halfword), 'b'(byte)
+/////////////////////////////////////////////////
+int writemem(unsigned long address, unsigned long writeval, int access_type)
 {
     int fd;
     void *map_base = 0;
     void *virt_addr = 0;
-    unsigned long writeval = 0;
-
-    off_t target = strtoul(address, 0, 0);
 
+    off_t target = address;
 
+    // Try to open /dev/mem
     if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
     {
         ERROR("Opening /dev/mem/ failed!");
@@ -52,14 +69,18 @@ int writemem(char* address, char* value, int access_type)
     // Map one page
     map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
 
+    // Check if mapping was successful
     if(map_base == (void *) -1)
     {
+        //Print error on failure
         ERROR("Mapping Memory Page Failed!");
         return EXIT_FAILURE;
     }
 
+    //calculate virtual address
+    virt_addr = map_base + (target & MAP_MASK);
 
-    writeval = strtoul(value, 0, 0);
+    //write value to memory
     switch(access_type)
     {
     case 'b':
@@ -76,7 +97,7 @@ int writemem(char* address, char* value, int access_type)
         break;
     }
 
-
+    //unmap memory
     if(munmap(map_base, MAP_SIZE) == -1)
     {
         ERROR("Unmapping Memory Page Failed!");
@@ -87,15 +108,24 @@ int writemem(char* address, char* value, int access_type)
     return EXIT_SUCCESS;
 }
 
-int readmem(char* address, int access_type, unsigned long *result)
+/////////////////////////////////////////////////
+/// \brief This function allows reading the memory
+///        on the specified address.
+///
+/// \param unsigned long Address to read from
+/// \param int Access type, should be 'w' (word),
+///        'h' (halfword), 'b'(byte)
+/// \param unsigned long* pointer result variable
+/////////////////////////////////////////////////
+int readmem(unsigned long address, int access_type, unsigned long *result)
 {
     int fd;
     void *map_base, *virt_addr;
-    off_t target;
     unsigned long read_result = 0;
 
-    target = strtoul(address, 0, 0);
+    off_t target = address;
 
+    //check if result variable is a nullpointer
     if(result == NULL)
     {
         //Print error on failure
@@ -122,7 +152,10 @@ int readmem(char* address, int access_type, unsigned long *result)
         return EXIT_FAILURE;
     }
 
+    //calculate virtual address
     virt_addr = map_base + (target & MAP_MASK);
+
+    //read value
     switch(access_type)
     {
     case 'b':
@@ -139,12 +172,14 @@ int readmem(char* address, int access_type, unsigned long *result)
         break;
     }
 
+    // unmap memory
     if(munmap(map_base, MAP_SIZE) == -1)
     {
         ERROR("Unmapping Memory Page Failed!");
         return EXIT_FAILURE;
     }
 
+    // return result
     *result = read_result;
 
     close(fd);