0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术GPIO应用于Linux LED子系统和输入事件侦测介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-06 11:30 次阅读

GPIO(General-purpose input/output)即通用输入输出,根据名字就能够了解到在实际应用中可以有很多种用途,最常见的便是用来控制LED灯的亮灭,或用来侦测输入信号的高低变化。英创工控主板都给用户提供了丰富的GPIO资源,ESMARC系列的板卡拥有32位GPIO,为了方便用户能够更方便的进行开发,英创公司进一步在软件上也增加了一些实用的功能。在GPIO用作控制LED灯的时候,用户可以直接使用Linux的LED子系统来对指定的GPIO口进行设置和操作,比如LED的亮灭或者设置触发方式等。如果是将GPIO设置为输入状态侦测输入信号的高低变化,一旦电平发生变化,内核就会通知应用程序,这时使用select函数就可以接收到内核发出的消息,不用再通过while或者for函数不断的轮询,实际的功能已经在ESMARC系列的ESM6800主板上通过测试和验证了。下面就针对两个功能来介绍一下具体的使用方法。

用户使用GPIO控制LED灯,可以直接调用英创公司提供的API函数,将GPIO置为输出然后置高或者置低。不过Linux系统将控制LED灯的这部分功能整合起来,设计成了一个标准的LED子系统,对LED子系统的操作在shell环境中就能完成。英创公司也将这部分功能的支持加入到了板卡中,如果熟悉使用LED子系统来控制的用户,就可以选用这种方式。通过加载一个内核模块led-emtronix.ko来启用LED子系统,加载的时候通过参数gpios来设置需要使用LED子系统操作的GPIO,gpios参数为一个32位的整数,代表32位GPIO,1表示enable而0表示disable。所以当我们选用GPIO0~GPIO3时,加载内核模块的命令如下:insmode led-emtronix.ko gpios=0x0f,加载完成后,用户可以在/sys/class/leds/目录下看到新生成了四个对应的文件夹LED1、LED2、LED3和LED4,注意,为了方便用户区分,LED子文件夹的标号和GPIO的标号是一一对应的,比如GPIO10生成的子文件夹为LED10。

加载内核模块

我们选择LED0这个目录进入,可以看到里面有许多文件,我们要使用到的文件为brightness和trigger这两个。

文件列表

brightness这个文件用来控制LED的开关,对应板卡的GPIO电平高低,当brightness文件的值为0时,GPIO输出低电平,当brightness文件的值为1时GPIO则输出高电平,需要注意的是,加载内核模块后,默认情况为输出低电平即brightness文件的值为0。在shell中需要查看brightness的值可以使用命令cat brightness:

查看brightness文件

如果是需要设置brightness文件的值,则可以使用echo命令:

设置brightness文件的值

另一个文件trigger的作用是设置触发方式,默认为none即没有触发方式。使用cat命令读取trigger文件可以得到支持的所有触发方式,如下图看到有磁盘,定时器,心跳,背光等多种触发方式:

查看触发方式

有方括号的表示为现在的有效触发方式,如果要选用heartbeat作为触发方式,还是使用echo命令来进行设置:

设置trigger

设置之后可以通过示波器看到对应的GPIO像心跳一样,每秒会进行一次拉高拉底。按照上面所介绍的方法,就能够使用LED子系统来对板卡的GPIO进行控制。

接下来介绍一下输入事件通知的功能,英创板卡的GPIO上电是默认都为输入状态(有3.3V上拉),在默认状态下是不会响应输入电平变化进行事件通知的。要启用这一功能,需要调用英创公司提供的,设置GPIO输入状态的API来实现。也就是在程序中需要调用一次API,设置GPIO为输入,才会使能这一位GPIO的输入事件通知功能,代码如下:

int GPIO_OutDisable(int fd, unsigned int dwDisBits)

{

int rc;

struct double_pars dpars;

dpars.par1 = ESM6800_GPIO_OUTPUT_DISABLE;

dpars.par2 = dwDisBits;

rc = write(fd, &dpars, sizeof(struct double_pars));

return rc;

}

rc = GPIO_OutDisable(fd, i1); //set GPIO as input

if(rc < 0)

{

printf("GPIO_OutEnable::failed %d\n", rc);

return rc;

}

当设置完成后,GPIO作为输入状态,同时内核会在输入的电平变化时通知应用层,使用select函数来监听GPIO的句柄的读事件就能够获取到通知,用户可以通过多线程的方式来实现,代码如下:

while( 1 )

{

//设置读事件

FD_ZERO(&fdRead);

FD_SET(fd,&fdRead);

//设置超时时间

aTime.tv_sec = 0;

aTime.tv_usec = 20000;

ret = select(fd+1,&fdRead,NULL,NULL,&aTime);

//printf( "select ret = %d\n", ret);

if (ret < 0 )

{

printf("error!\n");

break;

}

if (ret > 0)

{

//判断是否读事件

if (FD_ISSET(fd,&fdRead))

{

//读事件触发,进行相应的动作

dwPinState = 0xffffffff;

rc = GPIO_PinState(fd, &dwPinState);

if(rc < 0)

{

printf("GPIO_PinState::failed %d\n", rc);

return rc;

}

printf("PinState = 0x%08x\n", dwPinState);

}

}

}

当输入电平发生变化,select侦测到读事件,就可以进行相应的操作,示例代码只是简单的读取了当前GPIO的输入电平状态,用户可以根据实际的应用来修改。当有多路GPIO用于侦测输入电平变化的时候,在接收到读事件后,如果需要判断是哪一位GPIO侦测到电平变化,就要立刻读取当前GPIO的状态来以此进行判断。对于不需要这一功能的用户也不会有什么影响,当调用函数将GPIO设置为输入后,不使用select函数去监听GPIO的句柄即可,其他功能都和原来一致。

英创公司希望通过增加一些类似的实用功能,让用户的开发能够更加方便,如果在使用过程中遇到任何问题,可以和英创公司的工程师联系寻求技术支持。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11215

    浏览量

    208754
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6084

    浏览量

    35164
收藏 人收藏

    评论

    相关推荐

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 343次阅读

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-应用编程示例控制LED灯之sysfs文件系统

    上下拉即可。也可以通过Linux中的pinctrl子系统GPIO子系统,通过配置引脚和系统提供的API进行控制。而
    发表于 10-21 09:52

    飞凌嵌入式ElfBoard ELF 1板卡-应用编程示例控制LED灯之sysfs文件系统

    上下拉即可。也可以通过Linux中的pinctrl子系统GPIO子系统,通过配置引脚和系统提供的API进行控制。 而
    发表于 10-18 09:31

    gpio接口是干什么的 gpio四种输入输出模式怎么选择

    GPIO接口的作用 GPIO(General Purpose Input/Output)接口,即通用输入输出接口,是一种用于连接和控制各种外部设备的数字接口。它由一组引脚组成,可以通过
    的头像 发表于 10-06 16:07 1560次阅读

    深度解析linux时钟子系统

    linux内核中实现了一个CLK子系统用于对上层提供各模块(例如需要时钟信号的外设,USB等)的时钟驱动接口,对下层提供具体SOC的时钟操作细节。
    的头像 发表于 09-29 16:46 251次阅读
    深度解析<b class='flag-5'>linux</b>时钟<b class='flag-5'>子系统</b>

    锐恩科技引领微控制器MCU技术创新,赋能多元化应用!

    行业取得了显著成绩。例如,锐恩的MCU被广泛应用于消费电子、工业控制、仪表仪器、数码电子、安防监控、智能家居、医疗设备、照明控制、汽车电子等,在汽车电子领域为汽车智能化提供了坚实的硬件基础。在安防
    发表于 09-29 13:40

    【龙芯2K0300蜂鸟板试用】龙芯2K0300蜂鸟开发板上GPIO的驱动及使用

    集成设计,功能扩展等,可广泛应用于电力、交通、医疗、金融、通信、能源、信息家电和物联网等领域。 下面通过一个具体的例子——LED灯的控制,来说明龙芯2K0300的GPIO如何使用。
    发表于 09-05 20:35

    【龙芯2K0300蜂鸟板试用】第四篇 龙芯2K0300蜂鸟板--继续点灯

    通过GPIO子系统便可以控制类似LED、BEEP、KEY、红外发射对管等这类硬件模块。 通常在各个linux开发板装载的默认镜像中,LED
    发表于 08-15 16:52

    全志模块设备开发之GPIO编程基础介绍

    9.1 GPIO编程基础介绍GPIO(General-Purpose IO Ports),即通用IO接口。GPIO的使用较为简单,主要分为输入
    发表于 08-05 13:33

    linux--LED子系统一文读懂

    Linux内核中,LED子系统扮演着控制LED灯的核心角色,它通过一套规范化的驱动架构,简化了LED驱动程序的开发流程,让开发者能够更专注
    的头像 发表于 08-02 16:09 2164次阅读
    <b class='flag-5'>linux--LED</b><b class='flag-5'>子系统</b>一文读懂

    实测14us,Linux-RT实时性能及开发案例分享—基于全志T507-H国产平台

    事件触发LED电平翻转的实际耗时结合系统延时与GPIO输出延时得出数据;(2)系统延迟:根据Linux-RT性能测试平均值得出数据;(3)
    发表于 07-25 15:58

    实测14us,Linux-RT实时性能及开发案例分享—基于全志T507-H国产平台

    ,仅供参考。 测试结果如下表所示: (1)GPIO输入延时:通过使用示波器测量按键事件触发LED电平翻转的实际耗时结合系统延时与GPIO
    发表于 04-18 10:21

    龙教仪基于瑞芯微3568的ARM Cortex A-55教学实验箱 适用于人工智能 传感器 物联网等领域

    适用课程 Cortex-A55 ARM嵌入式实验箱主要用于《ARM 系统开发》、《ARM 应用开发》《物联网通信技术》、《嵌入式系统设计》、《移动互联网
    发表于 03-22 14:29

    简述智能制造系统的组成 智能制造系统子系统包括哪些

    智能制造系统是一种基于先进技术和智能化的制造方式,它包括多个子系统,每个子系统都扮演着重要的角色。下面详细介绍智能制造
    的头像 发表于 01-19 10:36 2490次阅读

    linux系统基础入门教程

    Linux是一种开源的操作系统,它被广泛应用于服务器、嵌入式系统以及个人电脑上。本篇文章将带领读者从入门的角度,详细介绍
    的头像 发表于 11-16 16:45 999次阅读