A40i使用笔记:GPIO操作方式(用于测试设备io驱动性能)

一、前言

前文介绍了文件io的驱动方式,可以用于led点灯灭灯或者一些简单的不需求时序控制的ic操作,但是用于功能类ic,如AD采集芯片等时序控制需求高的,就不行了,这时候就需求高速io去实现指定的芯片手册时序逻辑,来完成ic的驱动。前文也介绍了一些高速io的驱动方式,如hx711芯片驱动,如未发布文章的AD7606驱动源码资源,都是使用高速io驱动的方式,但是经测试,io的速率还未开发到极致,是因为未直接操作底层寄存器的原因,还是经过包装,但是io速率已经满足大部分ic驱动开发,本编文章的目的也是介绍和详细写出各种方式io的速度测试方法,针对于不同的需求可以设计不同的驱动。

目前总结有io有几种驱动方式

1.应用层文件io驱动方式。优点:利用底层自带的gpio驱动,免去独立开发驱动。缺点:io驱动慢,无法适用于大部分ic,只能简单用于led操作,按键检测,和简单的ic

2.驱动层gpio操作方式。优点:简单一些。缺点:需要搭配复杂的开发环境,io速度也不是极限,仍然感觉有限制,如无延时的操作一个io高低电平,会有500ns的保持时间,怀疑包装函数中有保护延时。

3.驱动层寄存器操作方式。优点:速度快。缺点:需要搭配复杂的开发环境,操作麻烦一些。

二、环境

宿主机:window10,Ubuntu16.04

目标及:a40i,linux3.10

三、正文

主要说明3种方式种io操作的步骤和效果对比

1.应用层文件io驱动方式

程序如下,文件方式驱动一个io无限正反转

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    while(1)
    {
        system("echo 1 > /sys/class/gpio_sw/PG9/data");
        //usleep(10000);
        system("echo 0 > /sys/class/gpio_sw/PG9/data");
        //usleep(10000);
    }
    return 0;
}

适用逻辑分析仪测试io反转速率效果如下图所示

图1

结论:

2.驱动层gpio操作方式

程序如下,底层gpio封装函数驱动gpio方式

#include <linux/init.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/delay.h>
//#include <mach/platform.h> //PAD_GPIO_C

#define SUNXI_PA_BASE	0
#define SUNXI_PB_BASE	32
#define SUNXI_PC_BASE	64
#define SUNXI_PD_BASE	96
#define SUNXI_PE_BASE	128
#define SUNXI_PF_BASE	160
#define SUNXI_PG_BASE	192
#define SUNXI_PH_BASE	224
#define SUNXI_PI_BASE	256
#define SUNXI_PJ_BASE	288
#define SUNXI_PK_BASE	320
#define SUNXI_PL_BASE	352
#define SUNXI_PM_BASE	384
#define SUNXI_PN_BASE	416
#define SUNXI_PO_BASE	448
#define AXP_PIN_BASE	1024
/* sunxi gpio name space */
#define GPIOA(n)	(SUNXI_PA_BASE + (n))
#define GPIOB(n)	(SUNXI_PB_BASE + (n))
#define GPIOC(n)	(SUNXI_PC_BASE + (n))
#define GPIOD(n)	(SUNXI_PD_BASE + (n))
#define GPIOE(n)	(SUNXI_PE_BASE + (n))
#define GPIOF(n)	(SUNXI_PF_BASE + (n))
#define GPIOG(n)	(SUNXI_PG_BASE + (n))
#define GPIOH(n)	(SUNXI_PH_BASE + (n))
#define GPIOI(n)	(SUNXI_PI_BASE + (n))
#define GPIOJ(n)	(SUNXI_PJ_BASE + (n))
#define GPIOK(n)	(SUNXI_PK_BASE + (n))
#define GPIOL(n)	(SUNXI_PL_BASE + (n))
#define GPIOM(n)	(SUNXI_PM_BASE + (n))
#define GPION(n)	(SUNXI_PN_BASE + (n))
#define GPIOO(n)	(SUNXI_PO_BASE + (n))
#define GPIO_AXP(n)	(AXP_PIN_BASE  + (n))

//声明描述LED硬件相关的数据结构
struct led_resource {
    int gpio; //GPIO软件编号
    char *name; //LED的名称
};

//定义初始化LED灯的硬件信息对象
static struct led_resource led_info[] = {
    {
        .name = "SCL1",
        .gpio = GPIOG(2)
    },
    {
        .name = "SDA1",
        .gpio = GPIOG(0)
    },
};

//入口:insmod
static int led_init(void)
{
    int i;
    int num=1000;
    for(i = 0; i < ARRAY_SIZE(led_info); i++) {
        int result = gpio_request(led_info[i].gpio,led_info[i].name)//先向内核申请GPIO硬件资源;
		if(result!=0){//判断申请的GPIO资源是否成功,失败返回提示信息
			printk(KERN_ERR "GPIO%d has used...led init err!\n",led_info[i].gpio);//打印错误信息
			return -1;
		}
        gpio_direction_output(led_info[i].gpio, 0);//设置输入、输出GPIO方向,设置为输出功能,输出0
    }
    //2.然后配置GPIO为输出功能,输出0,开灯
	while(num--){
		gpio_set_value(194, 1);ndelay(500);
		gpio_set_value(192, 1);ndelay(500);
		gpio_set_value(194, 0);ndelay(500);
		gpio_set_value(192, 0);ndelay(500);
	}
    printk(KERN_INFO "led init ok...\n");//打印提示信息
    return 0;
}

//出口:rmmod
static void led_exit(void)
{
    int i;
    int num=1000;
	while(num--){
		gpio_set_value(led_info[0].gpio, 1);ndelay(500);
		gpio_set_value(led_info[1].gpio, 1);ndelay(500);
		gpio_set_value(led_info[0].gpio, 0);ndelay(500);
		gpio_set_value(led_info[1].gpio, 0);ndelay(500);
	}
    for(i = 0; i < ARRAY_SIZE(led_info); i++) {
        gpio_free(led_info[i].gpio);//释放GPIO硬件资源
    } 

    printk(KERN_INFO "led exit...\n");//打印提示信息
}
module_init(led_init);//三要素 必须有
module_exit(led_exit);//三要素 必须有
MODULE_LICENSE("GPL");//三要素 必须有
MODULE_AUTHOR("[email protected]");//模块作者的声明
MODULE_DESCRIPTION("HX711 Driver");//当前模块的功能描述

使用逻辑分析仪查看测试效果如下图所示

图2

结论:

3.驱动层寄存器操作方式

未完毕

四、结语

猜你喜欢

转载自blog.csdn.net/qq_37603131/article/details/121374434