#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "platform.h"
volatile uint8_t *gpio_base = NULL;
#define REG_DEREF(x) (*((volatile uint32_t *)x))
#define GPFSEL0 (REG_DEREF(gpio_base + 0x00))
#define GPFSEL1 (REG_DEREF(gpio_base + 0x04))
#define GPFSEL2 (REG_DEREF(gpio_base + 0x08))
#define GPFSEL3 (REG_DEREF(gpio_base + 0x0C))
#define GPFSEL4 (REG_DEREF(gpio_base + 0x10))
#define GPFSEL5 (REG_DEREF(gpio_base + 0x14))
#define GPSET0 (REG_DEREF(gpio_base + 0x1C))
#define GPSET1 (REG_DEREF(gpio_base + 0x20))
#define GPCLR0 (REG_DEREF(gpio_base + 0x28))
#define GPCLR1 (REG_DEREF(gpio_base + 0x2C))
#define GPLEV0 (REG_DEREF(gpio_base + 0x34))
#define GPVEL1 (REG_DEREF(gpio_base + 0x38))
//TODO: add the rest of the gpio regs and move to header
int main()
{
printf("GPIO physical base: %p\n", (void *)GPIO_BASE
);
int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
if(mem_fd == -1)
{
printf("Failed to open /dev/mem\n"); }
// get a page aligned pointer to memory
uint8_t *aligned_buf;
if((uint32_t)buf % 4096 != 0)
{
aligned_buf = buf + (4096 - ((uint32_t)buf % 4096));
}
// map it
gpio_base = mmap(aligned_buf, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, GPIO_BASE);
if(gpio_base == NULL)
{
printf("Failed to map GPIO memory\n"); }
printf("gpio_base: %p\n", gpio_base
); printf("aligned_buf: %p\n", aligned_buf
);
// GPIO1 set to output
GPFSEL0 = 0x0;
// didn't fix it
usleep(10000);
// GPIO1 set to low
GPSET0 = 0x0;
// didn't fix it
usleep(10000);
// get GPIO1's state
uint32_t state = GPLEV0 & 0x1;
munmap(gpio_base, 4096);
close(mem_fd);
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvbW1hbi5oPgoKI2luY2x1ZGUgInBsYXRmb3JtLmgiCgp2b2xhdGlsZSB1aW50OF90ICpncGlvX2Jhc2UgPSBOVUxMOwoKI2RlZmluZSBSRUdfREVSRUYoeCkgKCooKHZvbGF0aWxlIHVpbnQzMl90ICopeCkpCiNkZWZpbmUgR1BGU0VMMCAoUkVHX0RFUkVGKGdwaW9fYmFzZSArIDB4MDApKQojZGVmaW5lIEdQRlNFTDEgKFJFR19ERVJFRihncGlvX2Jhc2UgKyAweDA0KSkKI2RlZmluZSBHUEZTRUwyIChSRUdfREVSRUYoZ3Bpb19iYXNlICsgMHgwOCkpCiNkZWZpbmUgR1BGU0VMMyAoUkVHX0RFUkVGKGdwaW9fYmFzZSArIDB4MEMpKQojZGVmaW5lIEdQRlNFTDQgKFJFR19ERVJFRihncGlvX2Jhc2UgKyAweDEwKSkKI2RlZmluZSBHUEZTRUw1IChSRUdfREVSRUYoZ3Bpb19iYXNlICsgMHgxNCkpCgojZGVmaW5lIEdQU0VUMCAoUkVHX0RFUkVGKGdwaW9fYmFzZSArIDB4MUMpKQojZGVmaW5lIEdQU0VUMSAoUkVHX0RFUkVGKGdwaW9fYmFzZSArIDB4MjApKQojZGVmaW5lIEdQQ0xSMCAoUkVHX0RFUkVGKGdwaW9fYmFzZSArIDB4MjgpKQojZGVmaW5lIEdQQ0xSMSAoUkVHX0RFUkVGKGdwaW9fYmFzZSArIDB4MkMpKQoKI2RlZmluZSBHUExFVjAgKFJFR19ERVJFRihncGlvX2Jhc2UgKyAweDM0KSkKI2RlZmluZSBHUFZFTDEgKFJFR19ERVJFRihncGlvX2Jhc2UgKyAweDM4KSkKCi8vVE9ETzogYWRkIHRoZSByZXN0IG9mIHRoZSBncGlvIHJlZ3MgYW5kIG1vdmUgdG8gaGVhZGVyCgppbnQgbWFpbigpCnsKICAgIHByaW50ZigiR1BJTyBwaHlzaWNhbCBiYXNlOiAlcFxuIiwgKHZvaWQgKilHUElPX0JBU0UpOwoKICAgIGludCBtZW1fZmQgPSBvcGVuKCIvZGV2L21lbSIsIE9fUkRXUiB8IE9fU1lOQyk7CiAgICBpZihtZW1fZmQgPT0gLTEpCiAgICB7CiAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gb3BlbiAvZGV2L21lbVxuIik7CiAgICB9CgogICAgLy8gZ2V0IGEgcGFnZSBhbGlnbmVkIHBvaW50ZXIgdG8gbWVtb3J5CiAgICB1aW50OF90ICpidWYgPSBtYWxsb2MoODE5Mik7CiAgICB1aW50OF90ICphbGlnbmVkX2J1ZjsKICAgIGlmKCh1aW50MzJfdClidWYgJSA0MDk2ICE9IDApCiAgICB7CiAgICAgICAgYWxpZ25lZF9idWYgPSBidWYgKyAoNDA5NiAtICgodWludDMyX3QpYnVmICUgNDA5NikpOwogICAgfQoKICAgIC8vIG1hcCBpdAogICAgZ3Bpb19iYXNlID0gbW1hcChhbGlnbmVkX2J1ZiwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgbWVtX2ZkLCBHUElPX0JBU0UpOwogICAgaWYoZ3Bpb19iYXNlID09IE5VTEwpCiAgICB7CiAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gbWFwIEdQSU8gbWVtb3J5XG4iKTsKICAgIH0KCiAgICBwcmludGYoImdwaW9fYmFzZTogJXBcbiIsIGdwaW9fYmFzZSk7CiAgICBwcmludGYoImJ1ZjogJXBcbiIsIGJ1Zik7CiAgICBwcmludGYoImFsaWduZWRfYnVmOiAlcFxuIiwgYWxpZ25lZF9idWYpOwoKICAgIC8vIEdQSU8xIHNldCB0byBvdXRwdXQKICAgIEdQRlNFTDAgPSAweDA7CgogICAgLy8gZGlkbid0IGZpeCBpdAogICAgdXNsZWVwKDEwMDAwKTsKCiAgICAvLyBHUElPMSBzZXQgdG8gbG93CiAgICBHUFNFVDAgPSAweDA7CgogICAgLy8gZGlkbid0IGZpeCBpdAogICAgdXNsZWVwKDEwMDAwKTsKCiAgICAvLyBnZXQgR1BJTzEncyBzdGF0ZQogICAgdWludDMyX3Qgc3RhdGUgPSBHUExFVjAgJiAweDE7CiAgICBwcmludGYoIkdQSU8xOiAldVxuIiwgc3RhdGUpOwoKICAgIG11bm1hcChncGlvX2Jhc2UsIDQwOTYpOwogICAgZnJlZShidWYpOwogICAgY2xvc2UobWVtX2ZkKTs=