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