I am trying to figure out memory mappings in the PRU, and especially ddrMem vs extRAM, and although there is information here and there, I have yet to find a cohesive explanation. I have found a few things to share, and perhaps someone more knowledgeable can help fill in some unanswered questions. First, a small caution, the Makefiles in the individual directories of TI's three examples in their am335x_pru_package are missing the -V3 flags that should be passed to pasm_2; they are not missing in the Makefile one level up, since I used the lower level Makefiles, this error lost me almost a week. Irrespective, re memory.
It appears to me that ddrMem accessed at 0x80000000 in PRU space is different than extRAM that is accessed at an address in PRU space found from >cat /sys/class/uio/uio0/maps/map1/addr which for me gives 0x9f2c0000. The extRAM size is easily found using >cat /sys/class/uio/uio0/maps/map1/size (0x40000 for me as I haven't increased it yet). However, I can't find anywhere discussion on what the size of ddrMem can be safely used. In user space I map ddrMem in userspace using: mem_fd = open("/dev/mem", O_RDWR); /* map the DDR memory */ ddrMem = mmap(0, 0x0FFFFFFF, PROT_WRITE | PROT_READ, MAP_SHARED, mem_fd, DDR_BASEADDR); if (ddrMem == NULL) { printf("Failed to map the device (%s)\n", strerror(errno)); close(mem_fd); return -1; } ddrMem_int = (unsigned int*) ddrMem; memset(ddrMem, 0, 0x2000); where DDR_BASEADDR is 0x80000000. This is based on the TI example. It appears the size of the memory is 0x10000000 or about 256Mbytes. However, if one changes the memset to memset(ddrMem, 0, 0x0FFFFFFF); (DO NOT DO THIS), it renders the BBB unuseable; it needs to be powererd down, disconnected from power, and then powered back up before it is useable. It would be nice to know how ddrMem could be used. I am working on figuring out access speeds to each, and from various places, it appears extRAM is always at memory locations where it can be accessed using Direct Memory Access. Can someone tell me the maximum size that can be used when loading uio_pruss; I saw it somewhere, but can't find the posting again? Also, it would be nice if the size could be set in a uio_pruss device tree overlay at boot time; I can't find info re this at all. Accessing ddrMem using SBCO seems to take 4 cycles for the first register, and then one cycle per additional register; that is the command: SBCO r0, CONST_DDR, PARAM_OFFSET+0, 32 takes 11 cycles; I was expecting 9 cycles (SBCO and SBBO commands normally take 2 cycles for the first register and 1 for each additional register, as opposed to LBCO and LBBO commands which take 4 cycles for the first register, and 1 cycle per additional register - it sure would be nice if TI gave us a table for disassembling the op codes and how many cycles per code). I don't understand yet where I am losing the 2 cycles. Just for some more info re memory mapping, noting the pid of my user space process is 1354, then doing sudo cat /proc/1354/maps gives: 00008000-0000a000 r-xp 00000000 b3:02 14116 /home/martin/programming/pru/pru_test/logic_test 00012000-00013000 rw-p 00002000 b3:02 14116 /home/martin/programming/pru/pru_test/logic_test 00013000-00034000 rw-p 00000000 00:00 0 [heap] a6d00000-a6d40000 rw-s 00001000 00:05 5333 /dev/uio0 a6d40000-b6d40000 rw-s 80000000 00:05 2292 /dev/mem b6d40000-b6d80000 rw-s 00001000 00:05 5333 /dev/uio0 b6d80000-b6e00000 rw-s 00000000 00:05 5333 /dev/uio0 b6e00000-b6e40000 rw-s 00001000 00:05 5333 /dev/uio0 b6e40000-b6ec0000 rw-s 00000000 00:05 5333 /dev/uio0 b6ec0000-b6f98000 r-xp 00000000 b3:02 34894 /lib/arm-linux-gnueabihf/libc-2.13.so and so on. The pru base addresses are b6d80000-b6e00000 and the addresses of the ddrMem are a6d40000-b6d40000, but again do not assume you can use all of these. There are also a number of mappings that I don't understand (such as b6d40000-b6d80000, b6e00000-b6e40000, and b6e40000-b6ec0000). Finally, I have had some success with including: #include "/home/martin/programming/pru/am335x_pru_package/pru_sw/app_loader/interface/__prussdrv.h" extern tprussdrv prussdrv; to get at the prussdrv struct using gdb. This is quite helpful in understanding some of the PRU addresses. Also, including #include "logic_addresses.h" // for PRU relative addresses used in debug where logic_addresses.h has: #define PDATA0 0x00000 #define PINST0 0x34000 #define PCNTL0 0x22000 #define PDBUG0 0x22400 #define PDATA1 0x02000 #define PINST1 0x38000 #define PCNTL1 0x24000 #define PDBUG1 0x24400 #define PBASE 0x00000 #define PINSTC 0x20000 #define PIEP 0x2E000 #define PSHARE 0x10000 static unsigned int pdata0 = PDATA0; static unsigned int pinst0 = PINST0; static unsigned int pcntl0 = PCNTL0; static unsigned int pdbug0 = PDBUG0; static unsigned int pdata1 = PDATA1; static unsigned int pinst1 = PINST1; static unsigned int pcntl1 = PCNTL1; static unsigned int pdbug1 = PDBUG1; static unsigned int pbase = PBASE; static unsigned int pinstc = PINSTC; static unsigned int piep = PIEP; static unsigned int pshare = PSHARE; to allow one to get at the debug registers using gdb in user space (they are not accessible in PRU space as far as I can tell - if anyone knows how to get at them, please share it with us). It appears TI is not interested in supporting the PRU on BBB: "Hi, The PRU support package that you refer is not developed or supported by TI. You can ask for information about it at http://beagleboard.org/Community/Forums" so we are pretty well on our own; it would be a shame if after spending considerable time to understand and use the PRU's TI decided to drop them - we can only hope this would not be the case. It might be nice if the PRU info could be collected into one location or wiki, as currently it is spread over many different locations with much of the info in forum posts being simple one liners (with the notable exception being Derek Malloy's web site http://exploringbeaglebone.com/chapter13). My background is hardware, so I wouldn't know how to set a wiki up, but if someone could look after it, I would be able to contribute. Anyways, thanks for any help that experienced PRUers can give, especially with respect to a uio_pruss device tree overlay and the usable size of ddrMem. -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.