Nanopi NEO硬件驱动代码 ——LED控制

目的

学习并了解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/unexport
    unexportGPIOPin(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.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值