Controlling GPIO from Linux User Space
来源:互联网 发布:ubuntu 16.04 安装完 编辑:程序博客网 时间:2024/06/06 15:01
This application note explains how to drive GPIO outputs and read the state of GPIO inputs from the Linux user-space on the STM32F429.
The API that is used to control GPIO is the standard Linux GPIOLIB interface. The API is described in the Linux documenation available in the kernel tree from the following file: linux/Documentation/gpio.txt.
Alternatively, the same document can be found in the Internet, for instance here:
http://lxr.free-electrons.com/source/Documentation/gpio/sysfs.txt
To enable the generic GPIO interface in the kernel, you need to enable certain build-time configuration options. Specifically, from the kernel configuration menu, go to Device Drivers, enable GPIO Support(CONFIG_GPIOLIB), and then from the GPIO Support menu enable the sysfs interface item (CONFIG_GPIO_SYSFS):
Now, most of the STM32F4 GPIO pins can be used in different multiplexed I/O roles (for instance, some GPIO pins can be also configured as an SPI interface, etc). Depending on specific requirements of your applications, you need to configure those pins that you want to use as GPIO for the GPIO role and other pins as an alternative I/O function.
For the purposes of this application note, we want to configure two pins as GPIO, specifically:
- PA0 is connected to the User Push button on the STM32F429 Discovery board;
- PE3 is hand-wired to the User LED (LED_3) on my STM32F429 Discovery board.
In the STM32F4 kernel, the I/O functions of the STM32F429 pins are defined in the following file:
linux/arch/arm/mach-stm32/iomux.c.
Here is the code that is responsible for configuring the above two pins for the GPIO function:
/*
* Pin configuration for the User Push Button and User LEDs
* on the STM32F429 Discovery board.
* !!! That GPIO may have other connections on other boards.
*/
if (platform == PLATFORM_STM32_STM_DISCO) {
/* PA0 = User Push Button */
gpio_dsc.port = 0;
gpio_dsc.pin = 0;
stm32f2_gpio_config(&gpio_dsc, STM32F2_GPIO_ROLE_IN);
/* PE3 = LED_3
* Here, things are tricky. The default hardware routes
* the LED to a pin that interferes with RMII. The config
* below assumes that the RMII signal is disconnected from
* the LED and instead the LED is connected to the PE3 GPIO.
*/
gpio_dsc.port = 4;
gpio_dsc.pin = 3;
stm32f2_gpio_config(&gpio_dsc, STM32F2_GPIO_ROLE_OUT);
}
If you need to define some other pins as GPIO, add appropriate code to the above section.
Having configured the kernel as described above, build the Linux image and load it to the STM32F429 Discovery board.
On the Linux running on the STM32F429 target, each GPIO is assigned a unique integer GPIO number within the GPIO chip range of 0 to 143:
/sys/class/gpio # cd /sys/class/gpio
/sys/class/gpio # ls
export gpiochip0 unexport
/sys/class/gpio # cat gpiochip0/ngpio
144
To calculate the GPIO number for a specific GPIO, use the following formula:
gpio = (bank * 16) + pin
Bank numbers start with 0 (corresponding to Bank A), pin numbers start with 0 (corresponding to pin 0, etc).
For the User Push Button the specific pin is PA0, which corresponds to the following GPIO number:
(0 * 16) + 0 = 0
First step is to add (export) the pin to the GPIO array and define it as an intput. This is done as follows:
/sys/class/gpio # echo 0 > export
/sys/class/gpio # echo in > gpio0/direction
/sys/class/gpio #
Now, all is ready to read the value of the User Push button. First, leave the button unpressed on the board and make sure the GPIO value reads as 0:
/sys/class/gpio # cat gpio0/value
0
/sys/class/gpio # cat gpio0/value
0
Push the button and make sure the GPIO value reads back as 1:
/sys/class/gpio # cat gpio0/value
1
/sys/class/gpio # cat gpio0/value
1
Release the button and validate that the value has returned to 0:
/sys/class/gpio # cat gpio0/value
0
/sys/class/gpio # cat gpio0/value
0
For the User LED the specific pin is PE3, which corresponds to the following GPIO number:
(4 * 16) + 3 = 67
Export the GPIO and define it as an output:
/sys/class/gpio # echo 67 > export
/sys/class/gpio # echo out > gpio67/direction
Now run the following shell commands to turn the LED on and off at a 1Hz frequency:
/sys/class/gpio # while busybox echo hey > /dev/null
> do
> echo 1 > gpio67/value; sleep 1
> echo 0 > gpio67/value; sleep 1
> done
If you need to control GPIO from C / C++ code, it is probably a good idea to perform the GPIO setup (export, define direction, etc) from a start-up script (eg. in /etc/rc). You can then use the standard POSIX APIs such asopen, read, write, etc on gpioxx/value files to control your GPIO from C code.
Note: The GPIO interrupt capability allowing a user application to block on a GPIO IRQ using the POSIX pollinterface is not yet implemented in the STM32F4 BSP. If someone adds this capability to the BSP, we will be happy to review your code and integrate it to the kernel tree.
- Controlling GPIO from Linux User Space
- how to disable alignment trap from user space in linux
- LINUX GPIO Kernel/User API
- Linux callstack 使用 [User space]
- Controlling User Logging in Hadoop
- Linux-System-Call and User Space
- Kernel Space - User Space Interfaces_Mmap
- user space to kernel space
- Kernel Space - User Space Interfaces
- Kernel Space - User Space Interfaces
- kernel space vs user space
- kernel space and user space
- User space和Kernel space
- Linux 2.6.38 User-space interface for Crypto API
- linux i2c access in kernel and user space
- Manipulating I2C Peripheral Directly in Linux User Space
- Controlling navigation options from the onet.xml
- iframe 项目总结 how to use UIImagepickerController read image from user space
- 查找输入整数二进制中1的个数
- Target runtime Apache Tomcat 6.0 is not defined 解决方法
- linux启动后自动执行某个脚本
- 单例设计模式的两种方式
- GPIO Sysfs Interface for Userspace
- Controlling GPIO from Linux User Space
- HDU 2037 今年暑假不AC
- 网络聊天室
- 搜索分词技术
- ConcurrentHashMap原理分析
- 程序包com.sun.image.codec.jpeg不存在 问题的完美解决
- [机器学习]overfitting 和regularization
- HDU 1032 The 3n + 1 problem
- LeetCode Add Digits