Nanopi NEO硬件驱动代码 ——按键输入

目的

学习并了解Linux驱动结构及应用
创建时间:2019年8月24日

按键控制DEMO学习记录如下

Matrix-gpio_int.c实例程序中头文件如下所示

#include <stdio.h>
#include <stdlib.h>
#include <signal.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

Damo程序主体部分

程序内已添加具体功能注释


#define DRIVER_MODULE "matrix_gpio_int"

//sensor变量类型在libfahw_GPIOSensor.h中定义,定义如下
//struct sensor {
//    int pin;
//    int intType;
//};
static struct sensor dev[] = {
        {
                GPIO_PIN(7),
                IRQ_TYPE_EDGE_FALLING,
        }
};
int devFD = -1;

void intHandler(int signNum)
{
    if (signNum == SIGINT) {
        printf("Clean up\n");
        sensorDeinit(devFD);
        system("rmmod "DRIVER_MODULE);
    }
    exit(0);
}

int main(int argc, char ** argv)
{
    int i, board;
    int retSize = -1;
	
	
	//ARRAY_SIZE:求设备结构体中设备的个数
    char value[ARRAY_SIZE(dev)];

	//初始化板子,返回值为板子型号
    if ((board = boardInit()) < 0) {
        printf("Fail to init board\n");
        return -1;
    }
    //判断入口参数个数
    if (argc == 2)
        dev[0].pin = atoi(argv[1]);
	//加载驱动?
	//函数功能对DRIVER_MODULE(matrix_gpio_int)文件执行modprobe 指令
    system("modprobe "DRIVER_MODULE);
	/*signal函数设置某一信号的对应动作
	/*第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。   
	/*第二个参数handler:描述了与信号关联的动作*/
	//intHandler函数见上方,函数功能为打印出Clean up后即卸载驱动
	//SIGINT 程序退出
    signal(SIGINT, intHandler);
	//根据板子型号确定对应的IO口,默认为GPIO_PIN(7)
    if (board == BOARD_NANOPC_T2 || board == BOARD_NANOPC_T3)
        dev[0].pin = GPIO_PIN(15);
	//打印使用的IO口
    printf("Use GPIO_PIN(%d)\n", dev[0].pin);
	//WIKI教程:初始化接入开发板的传感器
	//实质为调用ioctl对驱动进行操作
	//其中ARRAY_SIZE:求数组大小,防止误用
    if ((devFD =sensorInit(dev, ARRAY_SIZE(dev))) == -1) {
        printf("Fail to init sensor\n");
        goto err;
    }
    printf("Waiting event...\n");
	//WIKI教程:读取传感器数值
	//实质为调用read函数读取文件
    if ((retSize = sensorRead(devFD, value, ARRAY_SIZE(dev))) == -1) {
        printf("Fail to read sensors\n");
    }
    if (retSize > 0) {
        i = 0;
        for (i=0; i<retSize; i++) {
            printf("Device[%d] value is %d\n", i, value[i]);
        }
    }
	//WIKI教程:停止或关闭传感器
	//实质与sensorInit函数相同为调用ioctl对驱动进行操作
    sensorDeinit(devFD);
    //错误
err:    
    system("rmmod "DRIVER_MODULE);
    return 0;
}

疑问

在操作IO时,使用到了ioctl函数,查到说明指示函数专门向驱动层发送或者接收指令。那与Write函数差异?实现意义

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值