I am using C++ and mmap to access GPIO.  Following is the code I am using.

----------------------------------------------gpio.h 
--------------------------------------

> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <unistd.h>
> #include <fcntl.h>
> #include <sys/mman.h>
> #include "gpio.h"
>
> using namespace std;
>
> // The number is indicating which GPIO Module(0-3) of 
> // each pin belongs to.
> // 
> const int BeagleGPIO::pinBank[] = 
> {
>   -1, -1,  1,  1,  1, // P8_1  -> P8_5
>   1,  2,  2,  2,  2, // P8_6  -> P8_10
>   1,  1,  0,  0,  1, // P8_11 -> P8_15
>   1,  0,  2,  0,  1, // P8_16 -> P8_20
>   1,  1,  1,  1,  1, // P8_21 -> P8_25
>   1,  2,  2,  2,  2, // P8_26 -> P8_30
>   0,  0,  0,  2,  0, // P8_31 -> P9_35
>   2,  2,  2,  2,  2, // P8_36 -> P8_40
>   2,  2,  2,  2,  2, // P8_41 -> P8_45
>   2, // P8_46
>   -1, -1, -1, -1, -1, // P9_1  -> P9_5
>   -1, -1, -1, -1, -1, // P9_6  -> P9_10
>   0,  1,  0,  1,  1, // P9_11 -> P9_15
>   1,  0,  0,  0,  0, // P9_16 -> P9_20
>   0,  0,  1,  0,  3, // P9_21 -> P9_25
>   0,  3,  3,  3,  3, // P9_26 -> P9_30
>   3, -1, -1, -1, -1, // P9_31 -> P9_35
>   -1, -1, -1, -1, -1, // P9_36 -> P9_40
>   0,  0, -1, -1, -1, // P9_41 -> P9_45
>   -1 // P9_46
> };
>
> // Pin ID: if it is -1, it means that it is not a GPIO pin
> // If it is a GPIO Pin, the number is indicating the position 
> // of GPIO_DATAIN and GPIO_DATAOUT registers.
> const int BeagleGPIO::pinId[] = 
> {
>   -1, -1,  6,  7,  2, // P8_1  -> P8_5
>   3,  2,  3,  5,  4, // P8_6  -> P8_10
>   13, 12, 23, 26, 15, // P8_11 -> P8_15
>   14, 27,  1, 22, 31, // P8_16 -> P8_20
>   30,  5,  4,  1,  0, // P8_21 -> P8_25
>   29, 22, 24, 23, 25, // P8_26 -> P8_30
>   10, 11,  9, 17,  8, // P8_31 -> P9_35
>   16, 14, 15, 12, 13, // P8_36 -> P8_40
>   10, 11,  8,  9,  6, // P8_41 -> P8_45
>   7, // P8_46
>   -1, -1, -1, -1, -1, // P9_1  -> P9_5
>   -1, -1, -1, -1, -1, // P9_6  -> P9_10
>   30, 28, 31, 18, 16, // P9_11 -> P9_15
>   19,  5,  4, 13, 12, // P9_16 -> P9_20
>   3,  2, 17, 15, 21, // P9_21 -> P9_25
>   14, 19, 17, 15, 16, // P9_26 -> P9_30
>   14, -1, -1, -1, -1, // P9_31 -> P9_35
>   -1, -1, -1, -1, -1, // P9_36 -> P9_40
>   20,  7, -1, -1, -1, // P9_41 -> P9_45
>   -1 // P9_46
> };
>
>
> // Pad Control Register 
> // The addresses of registers, which control the Pin Mux of
> // each GPIO Pins
> const unsigned long BeagleGPIO::padControl[] =
> {
>   0x0000, 0x0000, 0x0818, 0x081C, 0x0808, // P8_1  -> P8_5
>   0x080C, 0x0890, 0x0894, 0x089C, 0x0898, // P8_6  -> P8_10
>   0x0834, 0x0830, 0x0824, 0x0828, 0x083C, // P8_11 -> P8_15
>   0x0838, 0x082C, 0x088C, 0x0820, 0x0884, // P8_16 -> P8_20
>   0x0880, 0x0814, 0x0810, 0x0804, 0x0800, // P8_21 -> P8_25
>   0x087C, 0x08E0, 0x08E8, 0x08E4, 0x08EC, // P8_26 -> P8_30
>   0x08D8, 0x08DC, 0x08D4, 0x08CC, 0x08D0, // P8_31 -> P8_35
>   0x08C8, 0x08C0, 0x08C4, 0x08B8, 0x08BC, // P8_36 -> P8_40
>   0x08B0, 0x08B4, 0x08A8, 0x08AC, 0x08A0, // P8_41 -> P8_45
>   0x08A4, // P8_46
>   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // P9_1  -> P9_5
>   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // P9_6  -> P9_10
>   0x0870, 0x0878, 0x0874, 0x0848, 0x0840, // P9_11 -> P9_15
>   0x084C, 0x095C, 0x0958, 0x097C, 0x0978, // P9_16 -> P9_20
>   0x0954, 0x0950, 0x0844, 0x0984, 0x09AC, // P9_21 -> P9_25
>   0x0980, 0x09A4, 0x099C, 0x0994, 0x0998, // P9_26 -> P9_30
>   0x0990, 0x0000, 0x0000, 0x0000, 0x0000, // P9_31 -> P9_35
>   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // P9_36 -> P9_40
>   0x09B4, 0x0964, 0x0000, 0x0000, 0x0000, // P9_41 -> P9_45
>   0x0000 // P9_46
> };
>
> // Control  Module Registers: Please refer to Memory Map of  
> // AM335x MCU
> const unsigned long BeagleGPIO::ctrlModuleReg = 0x44E10000;
>
> // GPIO Module registers 
> const unsigned long BeagleGPIO::GpioBaseReg[] = 
> {
>   0x44E07000, // GPIO0
>   0x4804C000, // GPIO1
>   0x481AC000, // GPIO2
>   0x481AE000 // GPIO3
> };
>
> //=======================================================
> //=======================================================
>
> BeagleGPIO::BeagleGPIO()
> {
>
>   // Not initialized by default
>   mActive = false;
>
>   system("echo 5 > /sys/class/gpio/export > /dev/null");
>   system("echo 65 > /sys/class/gpio/export > /dev/null");
>   system("echo 105 > /sys/class/gpio/export > /dev/null");
>
>   // Opening /dev/mem first
>   m_gpio_fd = open( "/dev/mem", O_RDWR | O_SYNC );
>   if ( m_gpio_fd < 0 )
>   {
>     GPIO_ERROR( "Cannot open /dev/mem" );
>     return;
>   }
>
>   // Map Control Module 
>   mControlModule = (unsigned long *)mmap( NULL, 0x1FFF, PROT_READ | 
> PROT_WRITE, MAP_SHARED, m_gpio_fd, ctrlModuleReg );
>   if ( mControlModule == MAP_FAILED )
>   {
>     GPIO_ERROR( "Control Module Mapping failed" );
>     return;
>   }
>
>   // Now mapping the GPIO registers
>   for ( int i=0; i<4; ++i)
>   {
>     // Map a GPIO bank
>     m_gpio[i] = (unsigned long *)mmap( NULL, 0xFFF, PROT_READ | 
> PROT_WRITE, MAP_SHARED, m_gpio_fd, GpioBaseReg[i] );
>     if ( m_gpio[i] == MAP_FAILED )
>     {
>       GPIO_ERROR( "GPIO Mapping failed for GPIO Module " << i );
>       return;
>     }
>   }
>
>   // Init complete and successfull
>   mActive = true;
>
> }
>
> //-------------------------------------------------------
> //
> //Disstructor
> //
> //-------------------------------------------------------
> BeagleGPIO::~BeagleGPIO()
> {
>   if ( mActive && m_gpio_fd)
>     close( m_gpio_fd );
> }
>
>
> //-------------------------------------------------------
> //
> // Configure pin as input/output
> //
> //-------------------------------------------------------
> BeagleGPIO::Status BeagleGPIO::configPin( unsigned short _pin, Direction 
> _direction )
> {
>   if ( !mActive )
>     return kFail;
>
>   //assert(pinBank[_pin]>=0);
>   //assert(pinId[_pin]>=0);
>
>   // Set Pin as GPIO on the pad control
>   mControlModule[padControl[_pin]/4] |= 0x07;
>
>   unsigned long v = 0x1 << pinId[_pin];
>
>   if ( _direction == kINPUT)
>   {
>     m_gpio[pinBank[_pin]][kOE/4] |= v;
>   }
>   else
>   {
>     m_gpio[pinBank[_pin]][kOE/4] &= ~v;
>   }
>
>   // Disable Interrupts by default
>   m_gpio[pinBank[_pin]][kIRQSTATUS_CLR_0/4] |= v;
>   m_gpio[pinBank[_pin]][kIRQSTATUS_CLR_1/4] |= v;
>
>   return kSuccess;
> }
>
> //-------------------------------------------------------
> //
> //!   Write a value to a Pin
> //
> //!   return status
> //
> //-------------------------------------------------------
> BeagleGPIO::Status BeagleGPIO::writePin( unsigned short _pin, unsigned 
> char _value )
> {
>   //assert(pinBank[_pin]>=0);
>   //assert(pinId[_pin]>=0);
>
>   unsigned long v = (_value & 0x01) << pinId[_pin];
>   unsigned long mask = 0x1 << pinId[_pin];
>
>   // Remove bit
>   m_gpio[pinBank[_pin]][kDATAOUT/4] &= ~mask;
>   // Assign new bit value
>   m_gpio[pinBank[_pin]][kDATAOUT/4] |= v;
>
>   return kSuccess;
> }
>
> //-------------------------------------------------------
> // 
> // Read a value from a pin
> // 
> //-------------------------------------------------------
> unsigned char BeagleGPIO::readPin( unsigned short _pin )
> {
>   //assert(pinBank[_pin]>=0);
>   //assert(pinId[_pin]>=0);
>
>   unsigned long bit = pinId[_pin];
>   return (m_gpio[pinBank[_pin]][kDATAIN/4] & (0x1 << bit)) >> bit;
> }
>
>





------------------------gpio,h -----------------------------------
//=======================================================
//=======================================================

#ifndef GPIO_H 
#define GPIO_H

//=======================================================
//=======================================================

#include <iostream>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

//=======================================================
//=======================================================

#define GPIO_ERROR(msg) std::cout << "[GPIO] Error : " << msg << std::endl;

#define GPIO_PRINT(msg)

//=======================================================
//=======================================================

class BeagleGPIO
{
  public:
    // Return status
    typedef enum
    {
      kFail = 0,
      kSuccess = 1
    } Status;

    // Beagle Bone GPIO Register Offsets
    enum
    {
      kREVISION = 0x0,
      kSYSCONFIG = 0x10,
      kIRQSTATUS_RAW_0 = 0x24,
      kIRQSTATUS_RAW_1 = 0x28,
      kIRQSTATUS_0 = 0x2C,
      kIRQSTATUS_1 = 0x30,
      kIRQSTATUS_SET_0 = 0x34,
      kIRQSTATUS_SET_1 = 0x38,
      kIRQSTATUS_CLR_0 = 0x3C,
      kIRQSTATUS_CLR_1 = 0x40,
      kIRQWAKEN_0 = 0x44,
      kIRQWAKEN_1 = 0x48,
      kSYSSTATUS = 0x114,
      kCTRL = 0x130,
      kOE = 0x134,
      kDATAIN = 0x138,
      kDATAOUT = 0x13C,
      kLEVELDETECT0 = 0x140,
      kLEVELDETECT1 = 0x144,
      kRISINGDETECT = 0x148,
      kFALLINGDETECT = 0x14C,
      kDEBOUNCEENABLE = 0x150,
      kDEBOUNCINGTIME = 0x154,
      kCLEARDATAOUT = 0x190,
      kSETDATAOUT = 0x194 
    } Registers;

    // Input/Output pin mode
    typedef enum
    {
      kINPUT = 0,
      kOUTPUT = 1
    } Direction;

    // GPIO Pins
    enum
    {
      P8_1,  P8_2,  P8_3,  P8_4,  P8_5,
      P8_6,  P8_7,  P8_8,  P8_9,  P8_10,
      P8_11, P8_12, P8_13, P8_14, P8_15,
      P8_16, P8_17, P8_18, P8_19, P8_20,
      P8_21, P8_22, P8_23, P8_24, P8_25,
      P8_26, P8_27, P8_28, P8_29, P8_30,
      P8_31, P8_32, P8_33, P8_34, P8_35,
      P8_36, P8_37, P8_38, P8_39, P8_40,
      P8_41, P8_42, P8_43, P8_44, P8_45,
      P8_46,
      P9_1,  P9_2,  P9_3,  P9_4,  P9_5,
      P9_6,  P9_7,  P9_8,  P9_9,  P9_10,
      P9_11, P9_12, P9_13, P9_14, P9_15,
      P9_16, P9_17, P9_18, P9_19, P9_20,
      P9_21, P9_22, P9_23, P9_24, P9_25,
      P9_26, P9_27, P9_28, P9_29, P9_30,
      P9_31, P9_32, P9_33, P9_34, P9_35,
      P9_36, P9_37, P9_38, P9_39, P9_40,
      P9_41, P9_42, P9_43, P9_44, P9_45,
      P9_46
    } GPIO_Pins;

    // IO Banks for GPIOs
    static const int pinBank[];

    // Pin Id for GPIOs
    static const int pinId[];

    // Pad Control Register
    static const unsigned long padControl[];

    // Base address of Control Module Registers
    static const unsigned long ctrlModuleReg;

    // Base addresses of GPIO Modules 
    static const unsigned long GpioBaseReg[];

  public:
    BeagleGPIO();
    ~BeagleGPIO();

  public:
    // Configure pin as input/output
    Status configPin( unsigned short _pin, Direction _direction );

    // Write a value to a pin
    Status writePin( unsigned short _pin, unsigned char _value );

    // Read a value from a pin
    unsigned char readPin( unsigned short _pin );

    // Is this Module active ?
    bool IsActive() { return mActive; }

  private:
    bool mActive;
    int m_gpio_fd;
    unsigned long * mControlModule;
    unsigned long * m_gpio[4];

};

//=======================================================
//=======================================================

#endif

//=======================================================
//=======================================================

 

-- 
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].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to