Sure seems to indicate there is a bug in the gpio driver somewhere . . . it
does not get any faster than this, and yes, the sleep()s are required AGAIN.
root@wgd:~/dl-i2c-test# nano tst.c
root@wgd:~/dl-i2c-test# gcc -Wall -o tst tst.c
root@wgd:~/dl-i2c-test# ./tst
PWM1 1 Z1IN 0
PWM2 1 Z2IN 0
PWM3 1 Z3IN 0
PWM4 1 Z4IN 0
PWM5 1 Z5IN 0
PWM6 1 Z6IN 0
PWM1 0 Z1IN 1
PWM2 0 Z2IN 1
PWM3 0 Z3IN 1
PWM4 0 Z4IN 1
PWM5 0 Z5IN 1
PWM6 0 Z6IN 1
Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define GPIO0 (0x44E07000)
#define GPIO1 (0x4804C000)
#define GPIO2 (0x481AC000)
#define GPIO3 (0x481AE000)
#define GPIO_SIZE (0x2000)
#define GPIO_DATAOUT (0x13C)
#define GPIO_DATAIN (0x138)
#define PWM1 (1<<2) /*gpio_0*/
#define PWM2 (1<<3) /*gpio_0*/
#define PWM3 (1<<18) /*gpio_1*/
#define PWM4 (1<<22) /*gpio_0*/
#define PWM5 (1<<19) /*gpio_1*/
#define PWM6 (1<<23) /*gpio_0*/
#define Z1IN (1<<12) /*gpio_1*/
#define Z2IN (1<<13) /*gpio_1*/
#define Z3IN (1<<14) /*gpio_1*/
#define Z4IN (1<<15) /*gpio_1*/
#define Z5IN (1<<16) /*gpio_1*/
#define Z6IN (1<<17) /*gpio_1*/
int main(int argc, char *argv[])
{
void *gpio_addr;
unsigned int *gpio0_out;
unsigned int *gpio1_out, *gpio1_in;
int fd = open("/dev/mem", O_RDWR);
gpio_addr = mmap(0, GPIO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, GPIO0);
gpio0_out = gpio_addr + GPIO_DATAOUT;
gpio_addr = mmap(0, GPIO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, GPIO1);
gpio1_out = gpio_addr + GPIO_DATAOUT;
gpio1_in = gpio_addr + GPIO_DATAIN;
close(fd);
*gpio0_out |= PWM1 + PWM2 + PWM4 + PWM6;
*gpio1_out |= PWM3 + PWM5;
sleep(1);
printf("PWM1 %u Z1IN %u\n", !! (*gpio0_out & PWM1), !!(*gpio1_in &
Z1IN));
printf("PWM2 %u Z2IN %u\n", !! (*gpio0_out & PWM2), !!(*gpio1_in &
Z2IN));
printf("PWM3 %u Z3IN %u\n", !! (*gpio1_out & PWM3), !!(*gpio1_in &
Z3IN));
printf("PWM4 %u Z4IN %u\n", !! (*gpio0_out & PWM4), !!(*gpio1_in &
Z4IN));
printf("PWM5 %u Z5IN %u\n", !! (*gpio1_out & PWM5), !!(*gpio1_in &
Z5IN));
printf("PWM6 %u Z6IN %u\n", !! (*gpio0_out & PWM6), !!(*gpio1_in &
Z6IN));
printf("\n");
*gpio0_out &= ~(PWM1 + PWM2 + PWM4 + PWM6);
*gpio1_out &= ~(PWM3 + PWM5);
sleep(1);
printf("PWM1 %u Z1IN %u\n", !! (*gpio0_out & PWM1), !!(*gpio1_in &
Z1IN));
printf("PWM2 %u Z2IN %u\n", !! (*gpio0_out & PWM2), !!(*gpio1_in &
Z2IN));
printf("PWM3 %u Z3IN %u\n", !! (*gpio1_out & PWM3), !!(*gpio1_in &
Z3IN));
printf("PWM4 %u Z4IN %u\n", !! (*gpio0_out & PWM4), !!(*gpio1_in &
Z4IN));
printf("PWM5 %u Z5IN %u\n", !! (*gpio1_out & PWM5), !!(*gpio1_in &
Z5IN));
printf("PWM6 %u Z6IN %u\n", !! (*gpio0_out & PWM6), !!(*gpio1_in &
Z6IN));
return 0;
}
sleep()'s again at .2(200ms)
root@wgd:~/dl-i2c-test# nano tst.c
root@wgd:~/dl-i2c-test# gcc -Wall -o tst tst.c
root@wgd:~/dl-i2c-test# ./tst
PWM1 1 Z1IN 1
PWM2 1 Z2IN 0
PWM3 1 Z3IN 0
PWM4 1 Z4IN 0
PWM5 1 Z5IN 0
PWM6 1 Z6IN 0
PWM1 0 Z1IN 0
PWM2 0 Z2IN 1
PWM3 0 Z3IN 1
PWM4 0 Z4IN 1
PWM5 0 Z5IN 1
PWM6 0 Z6IN 1
Output to a file:
root@wgd:~/dl-i2c-test# ./tst >test.txt
root@wgd:~/dl-i2c-test# cat test.txt
PWM1 1 Z1IN 1
PWM2 1 Z2IN 1
PWM3 1 Z3IN 1
PWM4 1 Z4IN 1
PWM5 1 Z5IN 1
PWM6 1 Z6IN 1
PWM1 0 Z1IN 1
PWM2 0 Z2IN 1
PWM3 0 Z3IN 1
PWM4 0 Z4IN 1
PWM5 0 Z5IN 1
PWM6 0 Z6IN 1
Something's not right guys, and I'm pretty sure it's not me . . .
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/beagleboard/60583227-50df-4ef8-9258-87dc866dd6a4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.