/* piBoardId * * Parameters: * - model: int * * - rev: int * * - mem: int * * - maker: int * * - overVolted: int * * Return Type: void */ mrb_value mrb_Pi_piBoardId(mrb_state* mrb, mrb_value self) { mrb_value model; mrb_value rev; mrb_value mem; mrb_value maker; mrb_value overVolted; /* Fetch the args */ mrb_get_args(mrb, "ooooo", &model, &rev, &mem, &maker, &overVolted); /* Type checking */ TODO_type_check_int_PTR(model); TODO_type_check_int_PTR(rev); TODO_type_check_int_PTR(mem); TODO_type_check_int_PTR(maker); TODO_type_check_int_PTR(overVolted); /* Unbox parameters */ int * native_model = TODO_mruby_unbox_int_PTR(model); int * native_rev = TODO_mruby_unbox_int_PTR(rev); int * native_mem = TODO_mruby_unbox_int_PTR(mem); int * native_maker = TODO_mruby_unbox_int_PTR(maker); int * native_overVolted = TODO_mruby_unbox_int_PTR(overVolted); /* Invocation */ piBoardId(native_model, native_rev, native_mem, native_maker, native_overVolted); return mrb_nil_value(); }
char InitGpio() { int rev, mem, maker, overVolted ; //printf("*********** Init GPIO *************\n"); piBoardId(&model,&rev,&mem,&maker,&overVolted); if (model==3) printf("Model B+ "); if(model<3) printf("Model B "); if(model>=4) { printf("\n Model 2"); BCM2708_PERI_BASE = 0x3F000000 ; dram_phys_base = 0xc0000000; mem_flag = 0x04; } else { printf("Model 1"); BCM2708_PERI_BASE = 0x20000000 ; dram_phys_base = 0x40000000; mem_flag = 0x0c; } dma_reg = map_peripheral(DMA_BASE, DMA_LEN); pwm_reg = map_peripheral(PWM_BASE, PWM_LEN); clk_reg = map_peripheral(CLK_BASE, CLK_LEN); pcm_reg = map_peripheral(PCM_BASE, PCM_LEN); gpio_reg = map_peripheral(GPIO_BASE, GPIO_LEN); pad_gpios_reg = map_peripheral(PADS_GPIO, PADS_GPIO_LEN); return 1; }
int cmReadall (void) { int model, rev, mem ; int pin ; char *maker ; piBoardId (&model, &rev, &mem, &maker) ; if (model != PI_MODEL_CM) return FALSE ; printf ("+-----+------+-------+ +-----+------+-------+\n") ; printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ; printf ("+-----+------+-------+ +-----+------+-------+\n") ; for (pin = 0 ; pin < 28 ; ++pin) { printf ("| %3d ", pin) ; printf ("| %-4s ", alts [getAlt (pin)]) ; printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; printf ("| ") ; printf ("| %3d ", pin + 28) ; printf ("| %-4s ", alts [getAlt (pin + 28)]) ; printf ("| %s ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ; printf ("|\n") ; } printf ("+-----+------+-------+ +-----+------+-------+\n") ; return TRUE ; }
int wiringPiSPISetup (int channel, int speed) { int fd ; int model, rev, mem, maker, overVolted ; piBoardId (&model, &rev, &mem, &maker, &overVolted) ; channel &= 1 ; if (model == PI_MODEL_ODROIDXU_34) { if (channel) return wiringPiFailure (WPI_ALMOST, "ODROID-XU3/4 cannot support spi-channel 1.\n") ; if ((fd = open (spiDev0_XU, O_RDWR)) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; } else if (model == PI_MODEL_ODROIDC) { if (channel) return wiringPiFailure (WPI_ALMOST, "ODROID-C1/C1+ cannot support spi-channel 1.\n") ; if ((fd = open (spiDev0, O_RDWR)) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; } else if (model == PI_MODEL_ODROIDC2) { return wiringPiFailure (WPI_ALMOST, "ODROID-C2 cannot support spi-channel\n") ; } else { if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; } spiSpeeds [channel] = speed ; spiFds [channel] = fd ; // Set SPI parameters. // Why are we reading it afterwriting it? I've no idea, but for now I'm blindly // copying example code I've seen online... if (ioctl (fd, SPI_IOC_WR_MODE, &spiMode) < 0) return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ; return fd ; }
static void doUsbP (int argc, char *argv []) { int model, rev, mem, maker, overVolted ; if (argc != 3) { fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; exit (1) ; } // Make sure we're on a B+ piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if (model != PI_MODEL_BP) { fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ; exit (1) ; } // Need to force BCM_GPIO mode: wiringPiSetupGpio () ; if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) { digitalWrite (PI_USB_POWER_CONTROL, 1) ; pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; printf ("Switched to HIGH current USB (1.2A)\n") ; return ; } if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0)) { digitalWrite (PI_USB_POWER_CONTROL, 0) ; pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; printf ("Switched to LOW current USB (600mA)\n") ; return ; } fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; exit (1) ; }
void doReadall (void) { int model, rev, mem, maker, overVolted ; if (wiringPiNodes != NULL) // External readall { doReadallExternal () ; return ; } piBoardId (&model, &rev, &mem, &maker, &overVolted) ; /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) abReadall (model, rev) ; else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || (model == PI_MODEL_2)) piPlusReadall (model) ; else if (model == PI_MODEL_CM) cmReadall () ; else printf ("Oops - unable to determine board type... model: %d\n", model) ; }
static int setup(void) { int fd; int boardRev; int model, rev, mem, maker, overVolted; boardRev = piBoardRev(); if(boardRev == 1) { pinToGpio = pinToGpioR1; physToGpio = physToGpioR1; } else { if(piModel2 == 1) { BCM2708_PERI_BASE = 0x3F000000; } pinToGpio = pinToGpioR2; physToGpio = physToGpioR2; } if((fd = open("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) { wiringXLog(LOG_ERR, "raspberrypi->setup: Unable to open /dev/mem: %s", strerror(errno)); return -1; } gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE); if((int32_t)gpio == -1) { wiringXLog(LOG_ERR, "raspberrypi->setup: mmap (GPIO) failed: %s", strerror(errno)); return -1; } if(piBoardId(&model, &rev, &mem, &maker, &overVolted) == -1) { return -1; } if(model == PI_MODEL_CM) { wiringPiMode = WPI_MODE_GPIO; } else { wiringPiMode = WPI_MODE_PINS; } return 0; }
int wiringPiI2CSetup (const int devId) { const char *device ; int model, rev, mem, maker, overVolted ; piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if ( model == PI_MODEL_ODROIDC ) device = "/dev/i2c-1" ; else if ( model == PI_MODEL_ODROIDXU_34 ) device = "/dev/i2c-3" ; else { rev = piBoardRev () ; if (rev == 1) device = "/dev/i2c-0" ; else device = "/dev/i2c-1" ; } return wiringPiI2CSetupInterface (device, devId) ; }
/** * -------------------------------------------------------- * GET EDGE GPIO PIN * -------------------------------------------------------- */ int getEdgePin(int pin) { int model, rev, mem, maker, overVolted ; // validate lower bounds if(pin < 0) return -1; // validate upper bounds if(pin >= MAX_GPIO_PINS) return -1; // return the edge pin index // (will return -1 for invalid pin) piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if (model == PI_MODEL_CM){ return pin; } else{ return wpiPinToGpio(pin); } }
void doReadall (void) { int model, rev, mem, maker, overVolted ; if (wiringPiNodes != NULL) // External readall { doReadallExternal () ; return ; } piBoardId (&model, &rev, &mem, &maker, &overVolted) ; /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) abReadall (model, rev) ; else if (model == PI_MODEL_BP) bPlusReadall () ; else if (model == PI_MODEL_CM) cmReadall () ; else if (model == PI_MODEL_BPR) //add for BananaPro by lemaker team OrangePiReadAll(); //guenter // guenter BPReadAll(); else printf ("Oops - unable to determine board type... model: %d\n", model) ; }
int main (int argc, char *argv []) { int i ; int model, rev, mem, maker, overVolted ; if (getenv ("WIRINGPI_DEBUG") != NULL) { printf ("gpio: wiringPi debug mode enabled\n") ; wiringPiDebug = TRUE ; } if (argc == 1) { fprintf (stderr, "%s\n", usage) ; return 1 ; } // Help if (strcasecmp (argv [1], "-h") == 0) { printf ("%s: %s\n", argv [0], usage) ; return 0 ; } // Sort of a special: if (strcmp (argv [1], "-R") == 0) { printf ("%d\n", piBoardRev ()) ; return 0 ; } // Version & Warranty if (strcmp (argv [1], "-V") == 0) { printf ("%d\n", piBoardRev ()) ; return 0 ; } if (strcmp (argv [1], "-v") == 0) { printf ("gpio version: %s\n", VERSION) ; printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ; printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; printf ("For details type: %s -warranty\n", argv [0]) ; printf ("\n") ; piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if (model == PI_MODEL_UNKNOWN) { printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ; printf (" [email protected]\n") ; printf ("with a copy of your /proc/cpuinfo if possible\n") ; } else { printf ("Banana Pro Details:\n") ; printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ; } return 0 ; } if (strcasecmp (argv [1], "-warranty") == 0) { printf ("gpio version: %s\n", VERSION) ; printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ; printf ("\n") ; printf (" This program is free software; you can redistribute it and/or modify\n") ; printf (" it under the terms of the GNU Leser General Public License as published\n") ; printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; printf (" (at your option) any later version.\n") ; printf ("\n") ; printf (" This program is distributed in the hope that it will be useful,\n") ; printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; printf (" GNU Lesser General Public License for more details.\n") ; printf ("\n") ; printf (" You should have received a copy of the GNU Lesser General Public License\n") ; printf (" along with this program. If not, see <http://www.gnu.org/licenses/>.\n") ; printf ("\n") ; return 0 ; } if (geteuid () != 0) { fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; return 1 ; } // Initial test for /sys/class/gpio operations: /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } // Check for load command: if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } // Check for -g argument if (strcasecmp (argv [1], "-g") == 0) { wiringPiSetupGpio () ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; wpMode = WPI_MODE_GPIO ; } // Check for -1 argument else if (strcasecmp (argv [1], "-1") == 0) { wiringPiSetupPhys () ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; wpMode = WPI_MODE_PHYS ; } // Default to wiringPi mode else { wiringPiSetup () ; wpMode = WPI_MODE_PINS ; } // Check for -x argument to load in a new extension if (strcasecmp (argv [1], "-x") == 0) { if (argc < 3) { fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ; exit (EXIT_FAILURE) ; } if (!doExtension (argv [0], argv [2])) // Prints its own error messages exit (EXIT_FAILURE) ; for (i = 3 ; i < argc ; ++i) argv [i - 2] = argv [i] ; argc -= 2 ; } if (argc <= 1) { fprintf (stderr, "%s: no command given\n", argv [0]) ; exit (EXIT_FAILURE) ; } // Core wiringPi functions /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ; else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; // GPIO Nicies else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; // Pi Specifics else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ; else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ; else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ; else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ; else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ; else if (strcasecmp (argv [1], "usbp" ) == 0) doUsbP (argc, argv) ; else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; else { fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; exit (EXIT_FAILURE) ; } return 0 ; }