目标环境:搭载A20芯片的核心板Cubieboard2,使用522扩展板,用TF卡搭载cb2-dvk-sdcard-ubuntu-desktop-lcd-ctp-lvds-1024x600-v1.1.img系统
管脚图:http://docs.cubieboard.org/cubieboard1_and_cubieboard2_gpio_pin
GPIO是General Purpose Input/Output的简写,通用输入输出接口。GPIO是一种泛指,几乎所有MCU芯片都有GPIO。包括UART/SPI等接口管脚,也是一种GPIO。在中文上,我觉得用“输入输出管脚”的说法比较合适。。既然GPIO与硬件相关,那么必然厂家需要提供支持。
全志芯片的GPIO,由运行其上的Linux版本:linux-sunxi提供直接支持。可以用过两种方式操作GPIO。
一、设置linux-sunxi启动脚本配置文件,开启系统对gpio的支持,然后通过echo指令进行操作。优点:不用编程;缺点:改系统配置文件,重启系统后生效;
二、使用sunxi的相关驱动(C、python等)。优点:不论系统配置文件是否声明,均可操作;缺点:C语言需要编译对应系统的二进制文件。(Python可以绕开)
方法一、通过脚本配置文件和Linux指令操作GPIO
linux-sunxi有个配置文件script.bin,在系统启动时,通过该配置文件来设置全志芯片的各个管脚和操作参数。修改script.bin需要使用全志提供工具sunxi-tools。通过sunxi-tools将script.bin文件转换为script.fex文本文件,修改script.fex文件之后,再用sunxi-tools将其转换为script.bin文件,重启系统。系统将会开放对应设置的GPIO。我们常在各种文章看到“修改script.fex文件“,就是指这个。实际上,script.fex中,不仅仅只有对GPIO配置的声明。可参看全志资料:
Fex Guide:http://linux-sunxi.org/Fex_Guide#.5Bgpio_para.5D
GPIO:http://linux-sunxi.org/GPIO
1、script.bin在什么位置?
根据系统启动的方式不同,其位置不同:
1)TF启动:
/dev/目录下的mmcblk0p1包含uEnv.txt 、 script.bin和uImage;mmcblk0p2 是文件系统。挂载相应目录,可执行以下命令:
$mkdir /mnt/mmp1
$mkdir /mnt/mmp2
$mount /dev/mmcblk0p1 /mnt/mmp1
$mount /dev/mmcblk0p2 /mnt/mmp2
2)Nand启动:
/dev/目录下的nanda 包含boot.ini、sprite.axf、uEnv.txt、script.bin 和uImage 等;nandb 是文件系统。挂载相应目录,执行命令:
$mkdir /mnt/nanda
$mkdir /mnt/nandb
$mount /dev/nanda /mnt/nanda
$mount /dev/nandb /mnt/nandb
2、对script.bin操作
script.bin 为二进制文件,不可以直接更改,需要通过 bin2fex命令转换为 script.fex。 script.fex为文本格式,可以直接更改。更改后, 再通过fex2bin命令把script.fex转换成script.bin。 如果没有 bin2fex 和 fex2bin 命令,需要安装,在终端输入相应命令:
apt-get install git
git clone git://github.com/linux-sunxi/sunxi-tools.git
通过该命令,会在当前目录下得到安装文件 sunxi-tools。
cd sunxi-tools/
apt-get install make
apt-get install gcc
apt-get install libusb-1.0
make
sunxi-tools 目录下会产生 fex2bin 与 bin2fex两个工具。 把它们拷贝到/usr/bin目录下。
cp fex2bin bin2fex /usr/bin/
相应的转换操作如下:
fex2bin script.fex script.bin
bin2fex script.bin script.fex
修改script.fex 需要使用 vim,执行以下命令安装:
apt-get install vim
3、修改script.fex中
[gpio_para]
gpio_used = 1
gpio_num = 5
gpio_pin_1 = port:PH20<1><default><default><1>
gpio_pin_2 = port:PH21<1><default><default><1>
gpio_pin_3 = port:PH07<6><default><default><default>
gpio_pin_4 = port:PE10<1><default><default><0>
gpio_pin_5 = port:PE11<1><default><default><0>
说明:
1)script.fex中要按规定声明节段名,gpio是:[gpio_para]
2)script.fex中采用key=value的形式进行配置;
3)gpio_used:用于声明是否使用gpio,1标识使用,0标识不使用;
4)gpio_num:使用gpio的数量
5)gpio_pin_N=port:<port><mux feature><pullup/down><drive capability><output level>
<port>:端口编号
<mux feature>:0标识输入;1标识输出;2-7根据不同芯片定义不同;
<pullup/down>:0标识无效disabled;1标识“上升沿”有效;2标识“下降沿”有效;(仅当作为输入管脚时有用);default标识该选项采用默认值,可忽略;
<drive capability>:标识输出管脚的驱动能力(mA),0-3分别代表10mA、20mA、30mA和40mA;default标识该选项采用默认值,可忽略;
<output level>:标识输出管脚的初始电平,1标识高电平,0标识低电平(仅当作为输出管脚时有用);default标识该选项采用默认值,可忽略;
其中,PH20是核心板上的绿灯,PH21是核心板上的红灯,PE10和PE11是522扩展板上已经外接好的LED测试排灯。总共有8个,接核心板的PE4~PE11管脚。
4、将script.fex转换为script.bin并重启系统
fex2bin script.fex script.bin
reboot
5、启动好之后,用linux的echo指令打开系统对gpio的映射,对应我们新配置的script.fex,就是第4号和5号两个管脚:
root@cubieboard2:/# echo 4 > /sys/class/gpio/export
root@cubieboard2:/# echo 5 > /sys/class/gpio/export
然后我们就可以看到系统赋予的gpio名称:
root@cubieboard2:/# ls sys/class/gpio
export gpio4_pe10 gpio5_pe11 gpiochip1 unexport
操作gpio的势能方向:
root@cubieboard2:/# echo out > /sys/class/gpio/gpio4_pe10/direction
root@cubieboard2:/# echo out > /sys/class/gpio/gpio4_pe11/direction
操作gpio控制led灯的亮灭:
root@cubieboard2:/# echo 1 > /sys/class/gpio/gpio4_pe10/value
root@cubieboard2:/# echo 0 > /sys/class/gpio/gpio4_pe10/value
方法二、使用sunxi的相关驱动(C、python等)
附件分别是C和py的库文件。
1、C语言示例代码(只使用gpio_lib.c和gpio_lib.h):
#include <stdlib.h>
#include <stdio.h>
#include "gpio_lib.h"
#define PE5 SUNXI_GPE(5)
#define PE8 SUNXI_GPE(8)
#define PE9 SUNXI_GPE(9)
#define PE10 SUNXI_GPE(10)
#define PE11 SUNXI_GPE(11)
int main()
{
if(SETUP_OK!=sunxi_gpio_init()){
printf("Failed to initialize GPIO\n");
return -1;
}
if(SETUP_OK!=sunxi_gpio_set_cfgpin(PE5,OUTPUT)){
printf("Failed to config GPIO PE5 pin\n");
return -1;
}
if(SETUP_OK!=sunxi_gpio_set_cfgpin(PE8,OUTPUT)){
printf("Failed to config GPIO PE8 pin\n");
return -1;
}
if(SETUP_OK!=sunxi_gpio_set_cfgpin(PE9,OUTPUT)){
printf("Failed to config GPIO PE9 pin\n");
return -1;
}
if(SETUP_OK!=sunxi_gpio_set_cfgpin(PE10,OUTPUT)){
printf("Failed to config GPIO PE10 pin\n");
return -1;
}
if(SETUP_OK!=sunxi_gpio_set_cfgpin(PE11,OUTPUT)){
printf("Failed to config GPIO PE11 pin\n");
return -1;
}
while(1){
if(sunxi_gpio_output(PE5,HIGH)){
printf("Failed to set GPIO PE5 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE5,LOW)){
printf("Failed to set GPIO PE5 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE8,HIGH)){
printf("Failed to set GPIO PE8 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE8,LOW)){
printf("Failed to set GPIO PE8 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE9,HIGH)){
printf("Failed to set GPIO PE9 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE9,LOW)){
printf("Failed to set GPIO PE9 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE10,HIGH)){
printf("Failed to set GPIO PE10 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE10,LOW)){
printf("Failed to set GPIO PE10 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE11,HIGH)){
printf("Failed to set GPIO PE11 pin value\n");
return -1;
}
usleep(500000);
if(sunxi_gpio_output(PE11,LOW)){
printf("Failed to set GPIO PE11 pin value\n");
return -1;
}
usleep(500000);
}
sunxi_gpio_cleanup();
return 0;
}
可以在目标操作系统上直接编译:
$sudo apt-get install gcc build-essential
$tar -xf gpio.tar
$cd gpio/
$gcc gpio_lib.c -c
$gcc gpio.c -c
$gcc gpio.o gpio_lib.o -o gpio
$./gpio
也可以搭建交叉编译环境来编译:
$arm-linux-gnueabi-gcc gpio_lib.c gpio.c -static -o gpio
$./gpio
2、python代码示例
配置python
sudo apt-get install python-dev
wget http://dl.linux-sunxi.org/users/tom/pySUNXI-0.1.12.tar.gz
tar zxf pySUNXI-0.1.12.tar.gz
sudo python setup.py install
新建一个blink.py文件
#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time
RED_LED = GPIO.PE11
GPIO.init()
GPIO.setcfg(RED_LED, GPIO.OUT)
while True:
GPIO.output(RED_LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(RED_LED, GPIO.LOW)
time.sleep(1)
运行代码:
chmod +x blink.py
sudo ./blink.py
顺便补充一下,经过测试,本例中A20搭载的是ubuntu的一个精简版linaro 12.09。示例中交叉编译好的C语言执行文件,同样可以在cb2-dvk-nand-android-4.2.2-lcd-ctp-lvds-1024x600-v1.1.img中执行。
分享到:
相关推荐
全志平台的GPIO配置与管理是嵌入式系统开发中一个重要的环节,特别是在开发基于Allwinner A10芯片的应用时。了解和掌握这些知识点,有助于开发者更高效地开发硬件驱动和应用程序,从而实现更复杂的功能和更好的用户...
本文档适用于全志A20芯片平台下的GPIO配置与使用场景,包括但不限于嵌入式系统开发、硬件设计等领域。 #### 1.3 相关人员 - **硬件工程师**:负责硬件设计与调试,需要了解GPIO的基本特性及配置方式。 - **软件...
总的来说,香橙派Orangepi Zero结合Python GPIO编程,为开发者提供了一个强大且灵活的开发平台。尽管相关资料相对较少,但通过社区的共享和学习,我们可以不断探索和扩展其潜力。希望这个介绍能帮助你更好地理解和...
本篇文章将详细探讨如何使用C语言实现对GPIO的读写操作,以及涉及的底层寄存器原理。 首先,理解GPIO的工作原理至关重要。GPIO接口由一组可以配置为输入或输出的物理引脚组成。当配置为输出时,我们可以设置引脚的...
6. **I/O接口**:全志H2芯片可能包含多种接口,如UART、SPI、I2C、GPIO、USB Host/Device、PCIe等,以适应各种外设的连接需求。 7. **电源管理**:高效的电源管理单元(PMU)是关键,文档会详细描述如何优化芯片的...
### 基于C语言的GPIO编程 #### GPIO概述与基本概念 GPIO(General Purpose Input/Output,通用输入/输出)是一种广泛应用于嵌入式系统的硬件接口技术,它允许微控制器或其他数字设备通过简单的编程控制外部设备。...
·使用PyGame, ·编程“我的世界”游戏, ·编写Python脚本, ·理解传感器和GPIO, 本书深入浅出地介绍每条命令,并辅以生动的例子和源代码,可以帮助你学习Python编程所需的各种知识和技能,是开启Python编程之旅的...
《全志R333平台开发手册》是针对基于全志芯片进行开发的工程师们的重要参考资料,涵盖了Tina3.0系统在全志芯片上的应用和开发流程。这份手册旨在帮助开发者深入理解全志R333平台的功能特性,以及如何高效地利用这些...
本程序集包含了解决全志A13在Android 4.1及以上版本中GPIO控制缺失问题的相关代码。通过对Linux内核层和Android用户空间层的修改,开发者可以重新获得对GPIO的控制能力。以下是关于这个程序集的详细知识点: 1. **...
在本文中,我们将深入探讨如何使用VC++编程语言与7854芯片进行GPIO(通用输入/输出)操作。7854芯片是一款常见的微处理器或接口芯片,它提供了多种功能,包括GPIO接口,用于与外部设备进行通信。在Windows环境中,...
《全志XR819 WiFi芯片数据手册》深入解析 全志XR819是一款针对无线网络应用设计的高性能芯片,常用于嵌入式设备和物联网(IoT)解决方案。这款芯片的数据手册是理解其功能、性能和硬件设计的关键参考资料。下面我们将...
基于stm32的gpio程序控制led灯的亮灭调试成功
标题中的“GPIO.rar_DSP C语言编程_DSP GPIO_c++编程_dsp”表明了这个压缩包主要包含与数字信号处理器(DSP)相关的C语言和C++编程,特别是涉及到GPIO(General Purpose Input/Output)的使用。GPIO是微控制器或 DSP...
在本文中,我们将深入探讨基于ARM Cortex-M0架构的M051芯片的GPIO(通用输入/输出)功能,以及如何通过编程实现LED灯的闪烁实验。GPIO是微控制器与外部世界交互的重要接口,用于控制各种设备,如LED、开关等。在M051...
总结来说,"C语言编程操作GPIO"涉及的关键知识点有: - Linux GPIO的系统架构和操作模型。 - 使用C语言进行系统调用和文件操作。 - GPIO的读写、配置、边沿检测和中断处理。 - 编写和使用C语言库封装这些操作以提高...
对于软件开发,手册会涵盖编程语言的选择(如C、Python等)、开发工具的安装和使用,以及如何通过网络更新系统、安装额外软件包。同时,对于硬件驱动的编写和调试,手册也会给出具体的步骤和示例。 五、性能优化与...
Python GPIO包是树莓派社区广泛使用的库,使得用Python编程控制GPIO变得简单易行。本文将详细介绍如何使用Python GPIO包(RPi.GPIO)进行硬件交互,并探讨相关知识。 1. **Python GPIO库介绍** RPi.GPIO是Python的...
本书由树莓派基金会资深软件开发工程师亲笔撰写,是...·理解传感器和GPIO本书深入浅出地介绍每条命令,并辅以生动的例子和源代码,可以帮助你学习Python编程所需的各种知识和技能,是开启Python编程之旅的必备指南。