#!/bin/bash # # pintest # Test the Pi's GPIO port # Copyright (c) 2013-2015 Gordon Henderson ################################################################################# # This file is part of wiringPi: # A "wiring" library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see <http://www.gnu.org/licenses/>. ################################################################################# # logErr pin, expected got ################################################################################ logErr () { if [ $errs = 0 ]; then echo "" fi echo " --> Pin $1 failure. Expected $2, got $3" let errs+=1 } # printErrorCount ################################################################################ printErrCount() { if [ $errs = 0 ]; then echo "No faults detected." elif [ $errs = 1 ]; then echo "One fault detected." else echo "$errs faults detected" fi } # testPins start end ################################################################################ testPins() { start=$1 end=$2 errs=0 printf "%30s %2d:%2d: " "$3" $1 $2 # Set range to inputs for i in `seq $start $end`; do gpio mode $i in done # Enable internal pull-ups and expect to read high for i in `seq $start $end`; do gpio mode $i up if [ `gpio read $i` = 0 ]; then logErr $i 1 0 fi done # Enable internal pull-downs and expect to read low for i in `seq $start $end`; do gpio mode $i down if [ `gpio read $i` = 1 ]; then echo "Pin $i failure - expected 0, got 1" let errs+=1 fi done # Remove the internal pull up/downs for i in `seq $start $end`; do gpio mode $i tri done if [ $errs = 0 ]; then echo " OK" else printErrCount fi let totErrs+=errs } intro() { cat <<EOF PinTest ======= This is a simple utility to test the GPIO pins on your Raspberry Pi. NOTE: All GPIO peripherals must be removed to perform this test. This includes serial, I2C and SPI connections. You may get incorrect results if something is connected and it interferes with the test. This test can only test the input side of things. It uses the internal pull-up and pull-down resistors to simulate inputs. It does not test the output drivers. You will need to reboot your Pi after this test if you wish to use the serial port as it will be left in GPIO mode rather than serial mode. This test only tests the original pins present on the Rev A and B. It does not test the extra pins on the Revision A2, B2 nor the A+ or B+ Please make sure everything is removed and press the ENTER key to continue, EOF echo -n "or Control-C to abort... " read a } # Start here ################################################################################ intro gpio unexportall errs=0 totErrs=0 echo "" # Main pins testPins 0 7 "The main 8 GPIO pins" # SPI testPins 10 14 "The 5 SPI pins" # Serial testPins 15 16 "The serial pins" # I2C - Needs somewhat different testing # due to the on-board pull-up's echo -n " The I2C pins 8: 9: " errs=0 gpio mode 8 in gpio mode 9 in if [ `gpio read 8` = 0 ]; then echo "Pin 8 failure - expected 1, got 0" let errs+=1 fi if [ `gpio read 9` = 0 ]; then echo "Pin 9 failure - expected 1, got 0" let errs+=1 fi if [ $errs = 0 ]; then echo " OK" else printErrCount fi echo "" if [ $totErrs != 0 ]; then echo "" echo "Faults detected! Output of 'readall':" gpio readall fi