From 30a90e990d9f8fbcf0945a0ed89b86c5ae0ef5f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Thu, 6 Jun 2013 18:23:40 +0200 Subject: [PATCH] add sample code to control the led --- diode_comtroller/Makefile | 2 + diode_comtroller/led.c | 81 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100755 diode_comtroller/Makefile create mode 100755 diode_comtroller/led.c diff --git a/diode_comtroller/Makefile b/diode_comtroller/Makefile new file mode 100755 index 0000000..da190d5 --- /dev/null +++ b/diode_comtroller/Makefile @@ -0,0 +1,2 @@ +led: led.c + gcc -ggdb -o led led.c diff --git a/diode_comtroller/led.c b/diode_comtroller/led.c new file mode 100755 index 0000000..c32f26a --- /dev/null +++ b/diode_comtroller/led.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* GPIO registers address */ +#define BCM2708_PERI_BASE 0x20000000 +#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */ +#define BLOCK_SIZE (256) + +/* GPIO setup macros. Always use GPIO_IN(x) before using GPIO_OUT(x) or GPIO_ALT(x,y) */ +#define GPIO_IN(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) +#define GPIO_OUT(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3)) +#define GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) + +#define GPIO_SET(g) *(gpio+7) = 1<<(g) /* sets bit which are 1, ignores bit which are 0 */ +#define GPIO_CLR(g) *(gpio+10) = 1<<(g) /* clears bit which are 1, ignores bit which are 0 */ +#define GPIO_LEV(g) (*(gpio+13) >> (g)) & 0x00000001 + + + +#define GPIO_4 4 + +int mem_fd; +void *gpio_map; +volatile uint32_t *gpio; + +int main(int argc, char* argv[]) +{ + int ret; + int i; + /* open /dev/mem */ + mem_fd = open("/dev/mem", O_RDWR|O_SYNC); + if (mem_fd == -1) { + perror("Cannot open /dev/mem"); + exit(1); + } + + /* mmap GPIO */ + gpio_map = mmap(NULL, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO_BASE); + if (gpio_map == MAP_FAILED) { + perror("mmap() failed"); + exit(1); + } + /* Always use volatile pointer! */ + gpio = (volatile uint32_t *)gpio_map; + + + GPIO_IN(GPIO_4); /* must use GPIO_IN before we can use GPIO_OUT */ + GPIO_OUT(GPIO_4); + + //Turn on led + while (1) { + printf("Enable LED\n"); + GPIO_SET(GPIO_4); + usleep(1000000); + printf("Disable GPIO\n"); // Does not seem to work? + GPIO_CLR(GPIO_4); + usleep(1000000); + } + /* Free up ressources */ + /* munmap GPIO */ + ret = munmap(gpio_map, BLOCK_SIZE); + if (ret == -1) { + perror("munmap() failed"); + exit(1); + } + /* close /dev/mem */ + ret = close(mem_fd); + if (ret == -1) { + perror("Cannot close /dev/mem"); + exit(1); + } + + return EXIT_SUCCESS; +}