Advertisement
AntonioVillanueva

PiFace Digital2 Raspberry Pi ctrl.kernel module mcp23017

Dec 22nd, 2016
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. //utilisse le driver mcp23017
  2. //  /boot/config.txt pour i2C  dtoverlay=mcp23017,addr=0x20,gpiopin=24
  3. // pour spi PiFace2 dtoverlay=mcp23s17:s17-spi0-0-present=1
  4. #include <iostream>
  5. #include <fstream>
  6. #include <string>
  7. #include <unistd.h>
  8.  
  9. #define GPIO_DIR "/sys/class/gpio"
  10. #define GPIO_ADDR 496 //Addresse base pour le driver mcp23017 496 , le fin 511
  11.  
  12. using namespace std;
  13. class mcp23017{
  14.     public:
  15.     mcp23017 ();
  16.     ~mcp23017();   
  17.     void gpioSet(int gpio, int value);
  18.     int gpioRead(int gpio);
  19.     void gpioUnexport();//Delete All PORTS GPIO dans /sys/class/gpio
  20.     enum  {INPUT,OUTPUT};
  21.     enum  {ON,OFF};
  22.    
  23.     private:
  24.     void configureMcp23017();//Configure PORTA,B Axisat 8IN & 8OUT
  25.     void gpioExport(int gpio);//Cree gpioNNN ,miroir PORTA,B dans sys/class/gpio
  26.     void gpioDirection(int gpio, int direction); //0 INPUT 1 OUTPUT
  27.     bool error(bool ok,string dir);
  28.     int read;
  29. };
  30. //----------------------------------------------------------------------
  31. mcp23017::mcp23017(){read=0;configureMcp23017();}//Constructeur
  32. //mcp23017::~mcp23017(){gpioUnexport();}//Destructeur de la classe efface PORTs
  33. mcp23017::~mcp23017(){}//Destructeur de la classe efface PORTs
  34. void mcp23017::configureMcp23017(){//Configure PORTA,B Axisat 8IN & 8OUT
  35.     size_t offset(0);
  36.     do{
  37.         gpioExport(GPIO_ADDR+offset);//Cree miroir PORTA,B dans sys/class/gpio
  38.         //usleep(5000);
  39.         sleep(1);
  40.         gpioDirection ( GPIO_ADDR+offset ,offset <8 ?OUTPUT:INPUT);//configure PORTA,B
  41.     }while (offset++ <15); 
  42. }
  43. void mcp23017::gpioExport(int gpio){//Cree gpioNNN ,miroir PORTA,B dans sys/class/gpio
  44.         std::fstream buf;
  45.         string dir(GPIO_DIR"/export");
  46.         buf.open (dir,std::fstream::out);
  47.         if (!error(!buf.fail()," EXPORT "+dir+to_string(gpio)) ){return ;}         
  48.         buf<<gpio;
  49.         buf.close();
  50. }
  51. void mcp23017::gpioDirection(int gpio, int direction){//0 INPUT 1 OUTPUT
  52.         std::fstream buf;
  53.         string dir(GPIO_DIR+string("/gpio")+to_string(gpio)+string("/direction"));
  54.         buf.open (dir,std::fstream::out);
  55.         if (!error(!buf.fail()," DIR "+dir) ){return ;}
  56.         buf<<string ((direction==OUTPUT) ? "out":"in");
  57.         buf.close();
  58. }
  59. void mcp23017::gpioSet(int gpio, int value){
  60.         std::fstream buf;
  61.         string dir(GPIO_DIR+string("/gpio")+to_string(gpio)+string("/value"));
  62.         buf.open (dir, std::fstream::out);
  63.         if (!error(!buf.fail()," SET "+dir) ){return ;}    
  64.         buf<<value;
  65.         buf.close();
  66. }
  67. int mcp23017::gpioRead(int gpio){
  68.         std::fstream buf;
  69.         string dir(GPIO_DIR+string("/gpio")+to_string(gpio)+string("/value"));
  70.         buf.open (dir, std::fstream::in );
  71.         if (!error(!buf.fail()," READ "+dir) ){return -1;} 
  72.         buf>>read;
  73.         buf.close();
  74.         return read;       
  75. }
  76. void mcp23017::gpioUnexport(){//Delete All PORTS GPIO dans /sys/class/gpio
  77.         std::fstream buf;
  78.         int offset(0);     
  79.         string dir(GPIO_DIR"/unexport");
  80.         do{
  81.             buf.open ( dir,std::fstream::out);// Overture /sys/class/gpio/unexport         
  82.             if (!error(!buf.fail()," DEL "+dir+to_string(GPIO_ADDR+offset)) ){return ;}                
  83.             buf<<(to_string(GPIO_ADDR+offset));//Ecrire dans unexport le Num à effacer gpioNNN
  84.             buf.close();
  85.         }while ((offset++)<15);
  86. }
  87. bool mcp23017::error(bool ok,string dir){
  88.     if (ok) {cout<<endl<<" OPEN OK "<<dir<<endl;return true;}//OK
  89.     else {cout<<endl<<" Error OPEN!!! "<<dir<<endl;return false;}
  90. }
  91. //----------------------------------------------------------------------
  92. //----------------------------------------------------------------------
  93.  
  94. int main (){   
  95.     mcp23017 mcp;//Configure 1 MCP23017 pour Axisat...cree sys/class/gpio
  96.  
  97.     for (int offset=15;offset >=0;offset--){    //Test IN & OUT
  98.         if (offset>7){//Read
  99.             cout<<mcp.gpioRead(GPIO_ADDR+offset)<<" = IN"<<offset<<endl;
  100.         }else{ mcp.gpioSet(GPIO_ADDR+offset,1);}//Sortie =1
  101.     }
  102.    
  103.     mcp.gpioUnexport();//Efface ports crees aver export dans sys/class/gpio
  104.         return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement