Advertisement
AntonioVillanueva

RASPBERRY PI MCP23017 DRIVER LINUX TEST

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