本帖最后由 jinyi7016 于 2015-12-28 00:58 编辑
上一篇,体验了Matrix的LCD驱动。又有源码,那当然要分析一下了。
一、源码路径:
matrix/demo/matrix-led/Matrix-led.c
二、main函数
打开这个文件后,可以看到,只有一个main函数。
- #include
- #include
- #include "libfahw.h"
- #define LED_BLINK_tiMES 10
- int main(int argc, char ** argv)
- {
- int ledPin = GPIO_PIN(7);
- int i = 0;
- int ret = -1;
- if ((ret = exportGPIOPin(ledPin)) == -1) {
- printf("exportGPIOPin(%d) failedn", ledPin);
- }
- if ((ret = setGPIODirection(ledPin, GPIO_OUT)) == -1) {
- printf("setGPIODirection(%d) failedn", ledPin);
- }
- for (i = 0; i < LED_BLINK_TIMES; i++) {
- if (i % 2) {
- ret = setGPIOValue(ledPin, GPIO_HIGH);
- } else {
- ret = setGPIOValue(ledPin, GPIO_LOW);
- }
- if (ret == -1) {
- printf("setGPIOValue(%d) failedn", ledPin);
- }
- printf("LED blinking times %dn", i);
- sleep(1);
- }
- unexportGPIOPin(ledPin);
- return 0;
- }
注意,这里的GPIO_PIN(7)是开发板上排针顺序的第7个引脚,并不是CPU的第7个IO口。
主要函数功能:
exportGPIOPin函数:导出对应GPIO号的GPIO。
setGPIODirection函数:设置GPIO是输出还是输入。
setGPIOValue函数:控制GPIO电平变化。
那么main函数的功能:就是配置好GPIO后,每1秒改变一次GPIO的电平,共10秒。
三、各子函数
1、exportGPIOPin函数
- EXPORT int setGPIOValue(int pin, int value)
- {
- clearLastError();
- int gpio = pintoGPIO(pin);
- GPIO_FILENAME_DEFINE(gpio, "value")
-
- return writeIntValueToFile(fileName, value);
- }
其中GPIO_FILENAME_DEFINE的定义在
libfahw-gpio.h中
- #define GPIO_FILENAME_DEFINE(pin,field) char fileName[255] = {0};
- sprintf(fileName, "/sys/class/gpio/gpio%d/%s", pin, field);
还有
writeIntValueToFile的定义在
common.c中。
- int writeIntValueToFile(char* fileName, int value) {
- char buff[50];
- sprintf(buff, "%d", value);
- return writeValueToFile(fileName, buff);
- }
最终实现的结果与以下命令是一样的。
在开发板上。
# cd /sys/class/gpio/
#echo 60 >export
2、setGPIODirection函数
- EXPORT int setGPIODirection(int pin, int direction)
- {
- clearLastError();
- int gpio = pintoGPIO(pin);
- char directionStr[10];
- GPIO_FILENAME_DEFINE(gpio, "direction")
-
- if (direction == GPIO_IN) {
- strcpy(directionStr, "in");
- } else if (direction == GPIO_OUT) {
- strcpy(directionStr, "out");
- } else {
- setLastError("direction must be 1 or 2, 1->in, 2->out");
- return -1;
- }
- return writeValueToFile(fileName, directionStr);
- }
一些函数定义已经可以找到了,其功能与在终端输入以下命令是等效的。
# echo out >direction
3、setGPIOValue函数
- EXPORT int setGPIOValue(int pin, int value)
- {
- clearLastError();
- int gpio = pintoGPIO(pin);
- GPIO_FILENAME_DEFINE(gpio, "value")
-
- return writeIntValueToFile(fileName, value);
- }
向value文件写入0或1 ;
写入0,LED灭
#echo 0 >value
写入1 ,LED亮
#echo 1 >value
征文活动,多多捧场:https://bbs.elecfans.com/jishu_531047_1_1.html