The short answer
No, you (almost) don't. It's actually the other way around - you have to set them up not to be GPIO but to serve their special purpose. The only exception are UART pins. Also and I²C pins somehow special.
UART pins
UART pins are used by the kernel for the console. You will have to configure the system not to use them if you want them to be available for your usage:
Now the pins should not be used by the system and you can use them
I²C pins
I²C pins have on-board 1.8k pull-up resistors installed. They can't be disabled. This limits those pins usage in some situations (but can be handy in others).
Additional solutions
If running low on GPIO pins, you can sometimes easily extend it's number by using some additional (but simple) hardware. For output for example, you can use shift registers
or I²C I/O expanders
(also called `I²C bus expanders), both easily to buy and use. You can find example of it's usage here.
PFC8574
(or similar from this family) are so popular that there is a ready to use kernel module that handles all the communication for you (it's not enabled in the official RaspberryPi kernel, you will need to compile your own kernel to use it). The module is called gpio_pcf857x
, providing that you loaded it with modprobe
(along with I²C drivers) and that you have the chip connected to I²C
bus, you can activate it like this:
echo pcf8574 0x27 > /sys/class/i2c-adapter/i2c-0/new_device
where pcf8574
is your actual chip name (this module can handle few different chips like pca967x
and max732x
) and 0x27
is its address on I²C
(you can configure the address of the chip when wiring it).
This will create entries in /sys/class/gpio/
directory that will allow you to use them the same way as other GPIO ports in RaspberryPi, providing you are using sys
interface (for example wiringPiSetupSys()
in wiringPi). Unfortunately, Python's RPi.GPIO
module does not support this mode so it won't be able to use this pins with this library. The pins will have some high numbers like 248-255 or similar.
Note: PCF8574
is sinking current
- it can give drive sink (accept in low state) as much as 20mA but it can only source 0.1mA in high state. This means that you are usually going to use it in reverse logic, i.e. +3.3V -> LED -> RESISTOR -> PCF8574_PIN
.