#include <stdio.h>
#include <unistd.h>
#include "bonelib/gpio.hpp"
int
main(int argc, const char *argv[])
{
BeagleBone::gpio* IOP = BeagleBone::gpio::P8(3);
printf("Start Test IO Pin\n\r");
IOP->configure(BeagleBone::pin::OUT);
printf("After Configure\n\r");
IOP->set(1);
printf("After first set\n\r");
for (int i = 0; i < 8; i++) {
IOP->set(0);
printf("Off\n\r");
usleep(500*1000);
IOP->set(1);
printf("On\n\r");
usleep(500*1000);
}
return 1;
}
//define pin variablesint pin_number = 44, logic_status = 0;char* pin_direction = output;//establish a direction and value file within export for gpio44ofp_export = fopen("/sys/class/gpio/export", "w");
if(ofp_export == NULL)
printf("Unable to open export.\n");
fseek(ofp_export, 0, SEEK_SET);fprintf(ofp_export, "%d", pin_number);fflush(ofp_export);
//configure gpio44 for writingofp_gpio44_direction = fopen("/sys/class/gpio/gpio44/direction", "w");
if(ofp_gpio44_direction==NULL)
printf("Unable to open gpio44_direction.\n");
fseek(ofp_gpio44_direction, 0, SEEK_SET);fprintf(ofp_gpio44_direction, "%s", pin_direction);fflush(ofp_gpio44_direction);
//write a logic 1 to gpio44 to illuminate the LEDofp_gpio44_value = fopen("/sys/class/gpio/gpio44/value", "w");
if(ofp_gpio44_value == NULL)
printf("Unable to open gpio44_value.\n");
fseek(ofp_gpio44_value, 0, SEEK_SET);fprintf(ofp_gpio44_value, "%d", logic_status);fflush(ofp_gpio44_value);#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#define HIGH 0x1
#define LOW 0x0
#define INPUT 0x0
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2
#define true 0x1
#define false 0x0
extern void pinMode(uint8_t, uint8_t);
extern void digitalWrite(uint8_t, uint8_t);
extern int digitalRead(uint8_t);
void pinMode(uint8_t bPin, uint8_t bMode)
{
// First try to open Direction
FILE *pfileDir;
char abT[34];
sprintf(abT, "/sys/class/gpio/gpio%d/direction", bPin);
pfileDir = fopen(abT, "w");
if (pfileDir == NULL)
{
// Probably not exported...
FILE *pfileExport = fopen("/sys/class/gpio/export", "w");
if(pfileExport == NULL)
{
printf("Unable to open export.\n");
return;
}
fseek(pfileExport, 0, SEEK_SET);
fprintf(pfileExport, "%d", bPin);
fflush(pfileExport);
fclose(pfileExport);
// Again lets try to open the file direction
pfileDir = fopen(abT, "w");
if (pfileDir == NULL)
{
printf("Error opening: %s\n", abT);
return;
}
}
fseek(pfileDir, 0, SEEK_SET);
switch (bMode)
{
case INPUT:
fprintf(pfileDir, "in");
break;
case OUTPUT:
fprintf(pfileDir, "out");
break;
case INPUT_PULLUP:
// BUGBUG:: Have not done anything with pull up yet...
fprintf(pfileDir, "in");
break;
}
fflush(pfileDir);
fclose(pfileDir);
}
// We will cache out one pin for now... Probably not much use, but...
static uint8_t s_bDWPinLast = 0xff;
static FILE * s_pfileDW = NULL;
void digitalWrite(uint8_t bPin, uint8_t bVal)
{
char abT[32];
// This function assumes that pinMode was called, which made sure things were exported...
if (bPin != s_bDWPinLast)
{
if (s_pfileDW)
{
fclose(s_pfileDW);
}
sprintf(abT, "/sys/class/gpio/gpio%d/value", bPin);
s_pfileDW = fopen(abT, "w");
if (s_pfileDW == NULL)
{
s_bDWPinLast = 0xff;
printf("error opening %s\n", abT);
return;
}
s_bDWPinLast = bPin;
}
fseek(s_pfileDW, 0, SEEK_SET);
fprintf(s_pfileDW, "%d\n", (int)bVal);
fflush(s_pfileDW);
}
int digitalRead(uint8_t bPin)
{
return 0; // BUGBUG - Still need to do this...
}
#define LED_GPIOP 30
int main(int argc, const char *argv[])
{
printf("Start Test IO Pin\n\r");
pinMode(LED_GPIOP, OUTPUT); // set our pin as output
printf("After pinMode");
for (int i = 0; i < 8; i++)
{
printf("On\n\r");
digitalWrite(LED_GPIOP, HIGH);
usleep(1000*1000);
printf("Off\n\r");
digitalWrite(LED_GPIOP, LOW);
usleep(1000*1000);
}
return 1;
}
...
But assuming we are on our own here, I wish either the BBB reference manual (Table 10/11) or some external files, were updated to have some additional information, like: the pin address (or offset) and potentially the default/initial state of the pins. It would also be nice to have it printed out in a few different orders, like P8/P9 pin order, address order ... Maybe someone has already done this?
...
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <time.h>
s_pfileDW = fopen(abT, "r");
if (s_pfileDW == NULL)
{
s_bDWPinLast = 0xff;
printf("error opening %s\n", abT);
return -1;
}
s_bDWPinLast = bPin;
}
fseek(s_pfileDW, 0, SEEK_SET);
int iRet = fgetc(s_pfileDW);
if (iRet == '0')
return 0;
if (iRet == '1')
return 1;
return iRet; // ?????
}
unsigned long millis(void)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts );
return ( ts.tv_sec * 1000 + ts.tv_nsec / 1000000L );
}
#define LED1 30
#define LED2 60
#define BTN1 31
int main(int argc, const char *argv[])
{
printf("Start Test IO Pin\n\r");
pinMode(LED1, OUTPUT); // set our pin as output
pinMode(LED2, OUTPUT); //
pinMode(BTN1, INPUT);
printf("After pinMode");
// Will run for 10 seconds
unsigned long ulTimeStart = millis();
unsigned long ulTimePeriod = millis();
uint8_t bLED = 0;
int iBtn = digitalRead(BTN1);
while ((millis()-ulTimeStart) < 10000)
{
if ((millis()-ulTimePeriod) > 250)
{
bLED = !bLED ;
digitalWrite(LED1, bLED ? HIGH : LOW);
ulTimePeriod = millis();
}
// Now see the state of the button.
int iNewBtn = digitalRead(BTN1);
if (iBtn != iNewBtn)
{
iBtn = iNewBtn;
digitalWrite(LED2, iBtn ? LOW : HIGH); // invert as
printf("Button: %d\n", iBtn);
}
usleep(100); // give some time to the system
}
return 1;
}