Hi, folks, I've been poking around to get GPIO to work via /dev/mem and mmap. After finally pushing a lot of things around, I finally managed to pull the various flavors of tutorials together into something I now understand (mostly).
However, what I *don't* understand is that when I put my scope on the pin, I see it toggle at 2.95MHz. That seems slow. This is the same frequency as here: http://chiragnagpal.com/examples.html The question is: Why? I could understand if it was something like 30MHz, but 3MHz seems off by an order of magnitude. And when something seems off in embedded programming, it's usually a bug waiting to bite you when you least need it. I'm on a BeagleBoard Black with Debian Jessie Linux arm 4.1.6-ti-r11 #1 SMP PREEMPT Tue Aug 18 21:36:11 UTC 2015 armv7l GNU/Linux Any suggestions? Given that the assembly seems to be spot on, *something* appears to be stalling the pipeline. Is the core being throttled? Is the peripheral bus at some strange frequency? Is the memory mapping hardware inserting cycles? I'm completely at a loss. Thanks for any advice. The assembly looks exactly optimal with a ldr/str sequence at maximum density (I'm using clang): .loc 2 83 9 @ gpi.c:83:9 ldr r1, [sp, #32] str r0, [r1] .loc 2 84 2 @ gpi.c:84:2 ldr r1, [sp, #28] str r0, [r1] .loc 2 85 9 @ gpi.c:85:9 ldr r1, [sp, #32] str r0, [r1] .loc 2 86 2 @ gpi.c:86:2 ldr r1, [sp, #28] str r0, [r1] And here's the C code I used to generate the pulse train on P9 Pin23 (GPIO1[17]) #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <assert.h> #define GPIO_OE 0x134 #define GPIO_SETDATAOUT 0x194 #define GPIO_CLEARDATAOUT 0x190 // Hunt these addresses down from ls -al /sys/devices/platform/ocp | grep gpio // You can also pull them from the TI manual (spruh73l.pdf) #define GPIO0_BASE 0x44E07000 #define GPIO1_BASE 0x4804C000 #define GPIO2_BASE 0x481AC000 #define GPIO3_BASE 0x481AE000 #define GPIO_SIZE 0x00001000 #define PIN_17 ((uint32_t)1<<17) uint32_t ui32Base[] = {GPIO0_BASE, GPIO1_BASE, GPIO2_BASE, GPIO3_BASE}; uint8_t volatile * bbGPIOMap[] = {0, 0, 0, 0}; int main(int argc, char *argv[]) { unsigned int ui; uint32_t volatile * gpio_oe_addr = NULL; uint32_t volatile * gpio_setdataout_addr = NULL; uint32_t volatile * gpio_cleardataout_addr = NULL; int fd = open("/dev/mem", O_RDWR); for(ui=0; ui<4; ++ui) { bbGPIOMap[ui] = mmap(0, GPIO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, ui32Base[ui]); assert(bbGPIOMap[ui] != MAP_FAILED); } gpio_oe_addr = (uint32_t volatile *)(bbGPIOMap[1] + GPIO_OE); gpio_setdataout_addr = (uint32_t volatile *)(bbGPIOMap[1] + GPIO_SETDATAOUT); gpio_cleardataout_addr = (uint32_t volatile *)(bbGPIOMap[1] + GPIO_CLEARDATAOUT); *gpio_oe_addr = *gpio_oe_addr & ~PIN_17; while(1) { *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; *gpio_setdataout_addr = PIN_17; *gpio_cleardataout_addr = PIN_17; } close(fd); return 0; } -- 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.