当前位置: 代码迷 >> 综合 >> Nanopi NEO硬件驱动代码 ——按键输入
  详细解决方案

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

热度:97   发布时间:2023-10-15 22:05:23.0

目的

学习并了解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函数差异?实现意义