目的
学习并了解Linux驱动结构及应用
创建时间:2019年8月24日
LED控制DEMO学习记录如下
Matrix-gpio_out.c实例程序中头文件如下所示
头文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "libfahw.h"
其中libfahw.h为驱动总头文件。
libfahw.h 程序如下
#ifndef __FRIENDLYARM_HARDWARE_H__
#define __FRIENDLYARM_HARDWARE_H__#include "../common.h"
#include "libfahw-filectl.h"
#include "libfahw-gpio.h"
#include "libfahw-i2c.h"
#include "libfahw-iio.h"
#include "libfahw-pcf8591.h"
#include "libfahw-pcf8574.h"
#include "libfahw-adxl34x.h"
#include "libfahw-GPIOSensor.h"
#include "libfahw-hmc5883.h"
#include "libfahw-w1.h"
#include "libfahw-pwm.h"
#include "libfahw-mcp23017.h"
#include "libfahw-bmp180.h"
#include "libfahw-encoder.h"
#include "libfahw-spi.h"
#include "libfahw-oled.h"#endif
程序通过调用上图中不同硬件.h文件,实现对应控制。在此部分主要是使用了#include “libfahw-gpio.h”,gpio.c文件,其函数列表如下。
在gpio.c中调用common.c文件内的函数接口对Linux进行文件读写操作,最终间接使用到了4个函数fopen、fclose、fread、fwrite。
Damo程序主体部分
主体程序流程主要流程为:
1.读取板子型号
2.判断应用程序入口参数
3.写文件操作将使得该GPIO的操作接口从内核空间暴露到用户空间
4.写入IO的传输方向
5.写入IO的高低电平
程序及注释如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "libfahw.h"
//循环次数
#define STATUS_CHANGE_TIMES (5) int main(int argc, char ** argv)
{//GPIO_PIN() 在libfahw-gpio.h中有宏定义 #define GPIO_PIN(x) (x)int pin = GPIO_PIN(7); int i, value, board;int ret = -1;//读取板子型号if ((board = boardInit()) < 0) {printf("Fail to init board\n");return -1;}//判断板子,选择对应的IO,默认为GPIO_PIN(7)if (board == BOARD_NANOPC_T2 || board == BOARD_NANOPC_T3)pin = GPIO_PIN(15);//判断传入参数数量,第二的参数可用于自己选择IO输出。(wiki内教程无输入参数)if (argc == 2)pin = GPIO_PIN(atoi(argv[1]));//WIKI提供的API接口说明:通知系统需要导出控制的 GPIO 引脚编号//函数实质调用了 fwrite()向/sys/class/gpio/export写入GPIO_IO(PIN),写入失败返回-1,见下图if ((ret = exportGPIOPin(pin)) == -1) { printf("exportGPIOPin(%d) failed\n", pin);}//WIKI提供的API接口说明:配置引脚功能为输出或者输入//if ((ret = setGPIODirection(pin, GPIO_OUT)) == -1) {printf("setGPIODirection(%d) failed\n", pin);}for (i = 0; i < STATUS_CHANGE_TIMES; i++) {if (i % 2) {value = GPIO_HIGH;} else {value = GPIO_LOW;}//对某个引脚输出高或低电平if ((ret = setGPIOValue(pin, value)) > 0) {printf("%d: GPIO_PIN(%d) value is %d\n", i+1, pin, value);} else {printf("setGPIOValue(%d) failed\n", pin);}sleep(1);}//通知系统取消导出某个 GPIO 引脚,相当于执行命令 echo pin >/sys/class/gpio/unexportunexportGPIOPin(pin);return 0;
}
exportGPIOPin/unexportGPIOPin函数
exportGPIOPin函数实质是向/sys/class/gpio/export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间。其中unexportGPIOPin函数与之类似,是往/sys/class/gpio/unexport文件写入GPIO编号。
参考文档:
链接: https://blog.csdn.net/wangweiqiang1325/article/details/52209539.