aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/devmem2/devmem2/devmem2-fixups-2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/devmem2/devmem2/devmem2-fixups-2.patch')
-rw-r--r--recipes/devmem2/devmem2/devmem2-fixups-2.patch182
1 files changed, 182 insertions, 0 deletions
diff --git a/recipes/devmem2/devmem2/devmem2-fixups-2.patch b/recipes/devmem2/devmem2/devmem2-fixups-2.patch
new file mode 100644
index 0000000000..fe66605477
--- /dev/null
+++ b/recipes/devmem2/devmem2/devmem2-fixups-2.patch
@@ -0,0 +1,182 @@
+--- devmem2/devmem2.c.orig 2006-08-31 17:21:45.000000000 -0600
++++ devmem2/devmem2.c 2006-09-02 09:09:29.000000000 -0600
+@@ -20,7 +20,7 @@
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+- *
++ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+@@ -38,84 +38,111 @@
+ #include <termios.h>
+ #include <sys/types.h>
+ #include <sys/mman.h>
+-
++
+ #define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
+ __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)
+-
++
+ #define MAP_SIZE 4096UL
+ #define MAP_MASK (MAP_SIZE - 1)
+
++static inline void *fixup_addr(void *addr, size_t size);
++
+ int main(int argc, char **argv) {
+ int fd;
+- void *map_base, *virt_addr;
+- unsigned long read_result, writeval;
+- off_t target;
+- int access_type = 'w';
+-
+- if(argc < 2) {
+- fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n"
+- "\taddress : memory address to act upon\n"
+- "\ttype : access operation type : [b]yte, [h]alfword, [w]ord\n"
+- "\tdata : data to be written\n\n",
+- argv[0]);
+- exit(1);
+- }
+- target = strtoul(argv[1], 0, 0);
+-
+- if(argc > 2)
+- access_type = tolower(argv[2][0]);
++ void *map_base, *virt_addr;
++ unsigned long read_result, write_val;
++ off_t target;
++ int access_type = 'w';
++ char fmt_str[128];
++ size_t data_size;
++
++ if(argc < 2) {
++ fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n"
++ "\taddress : memory address to act upon\n"
++ "\ttype : access operation type : [b]yte, [h]alfword, [w]ord\n"
++ "\tdata : data to be written\n\nWARNING: "
++ "Writing or reading memory locations may corrupt your system,\n"
++ "so please use this utility with extreme caution!\n", argv[0]);
++ exit(1);
++ }
++ target = strtoul(argv[1], 0, 0);
+
++ if(argc > 2) access_type = tolower(argv[2][0]);
+
+ if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
+- printf("/dev/mem opened.\n");
++ printf("/dev/mem opened.\n");
+ fflush(stdout);
+-
++
+ /* Map one page */
+- map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
+- if(map_base == (void *) -1) FATAL;
+- printf("Memory mapped at address %p.\n", map_base);
++ map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
++ target & ~MAP_MASK);
++ if(map_base == (void *)(-1)) FATAL;
++ printf("Memory mapped at address %p.\n", map_base);
+ fflush(stdout);
+-
++
+ virt_addr = map_base + (target & MAP_MASK);
+ switch(access_type) {
+- case 'b':
+- read_result = *((unsigned char *) virt_addr);
+- break;
+- case 'h':
+- read_result = *((unsigned short *) virt_addr);
+- break;
+- case 'w':
+- read_result = *((unsigned long *) virt_addr);
+- break;
+- default:
+- fprintf(stderr, "Illegal data type '%c'.\n", access_type);
+- exit(2);
+- }
+- printf("Value at address 0x%X (%p): 0x%X\n", target, virt_addr, read_result);
++ case 'b':
++ data_size = sizeof(unsigned char);
++ virt_addr = fixup_addr(virt_addr, data_size);
++ read_result = *((unsigned char *)virt_addr);
++ break;
++ case 'h':
++ data_size = sizeof(unsigned short);
++ virt_addr = fixup_addr(virt_addr, data_size);
++ read_result = *((unsigned short *)virt_addr);
++ break;
++ case 'w':
++ data_size = sizeof(unsigned long);
++ virt_addr = fixup_addr(virt_addr, data_size);
++ read_result = *((unsigned long *)virt_addr);
++ break;
++ default:
++ fprintf(stderr, "Illegal data type '%c'.\n", access_type);
++ exit(2);
++ }
++ sprintf(fmt_str, "Read at address 0x%%08lX (%%p): 0x%%0%dlX\n",
++ 2*data_size);
++ printf(fmt_str, (unsigned long)target, virt_addr, read_result);
+ fflush(stdout);
+
+- if(argc > 3) {
+- writeval = strtoul(argv[3], 0, 0);
+- switch(access_type) {
+- case 'b':
+- *((unsigned char *) virt_addr) = writeval;
+- read_result = *((unsigned char *) virt_addr);
+- break;
+- case 'h':
+- *((unsigned short *) virt_addr) = writeval;
+- read_result = *((unsigned short *) virt_addr);
+- break;
+- case 'w':
+- *((unsigned long *) virt_addr) = writeval;
+- read_result = *((unsigned long *) virt_addr);
+- break;
+- }
+- printf("Written 0x%X; readback 0x%X\n", writeval, read_result);
+- fflush(stdout);
++ if(argc > 3) {
++ write_val = strtoul(argv[3], 0, 0);
++ switch(access_type) {
++ case 'b':
++ virt_addr = fixup_addr(virt_addr, sizeof(unsigned char));
++ *((unsigned char *)virt_addr) = write_val;
++ read_result = *((unsigned char *)virt_addr);
++ break;
++ case 'h':
++ virt_addr = fixup_addr(virt_addr, sizeof(unsigned short));
++ *((unsigned short *)virt_addr) = write_val;
++ read_result = *((unsigned short *)virt_addr);
++ break;
++ case 'w':
++ virt_addr = fixup_addr(virt_addr, sizeof(unsigned long));
++// *((unsigned long *)virt_addr) = write_val;
++ read_result = *((unsigned long *)virt_addr);
++ break;
+ }
+-
+- if(munmap(map_base, MAP_SIZE) == -1) FATAL;
++ sprintf(fmt_str, "Write at address 0x%%08lX (%%p): 0x%%0%dlX, "
++ "readback 0x%%0%dlX\n", 2*data_size, 2*data_size);
++ printf(fmt_str, (unsigned long)target, virt_addr,
++ write_val, read_result);
++ fflush(stdout);
++ }
++
++ if(munmap(map_base, MAP_SIZE) == -1) FATAL;
+ close(fd);
+ return 0;
+ }
+
++static inline void *fixup_addr(void *addr, size_t size)
++{
++#ifdef FORCE_STRICT_ALIGNMENT
++ unsigned long aligned_addr = (unsigned long)addr;
++ aligned_addr &= ~(size - 1);
++ addr = (void *)aligned_addr;
++#endif
++ return addr;
++}