查看: 959|回复: 0

Rico Board Linux应用程序开发之点亮LED

[复制链接]
  • TA的每日心情
    慵懒
    2024-5-20 16:09
  • 签到天数: 665 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2016-9-9 09:21:11 | 显示全部楼层 |阅读模式
    分享到:
    工欲善其事必先利其器,要想进行Linux应用程序的开发,需要搭载Linux开发环境。
          首先在VMware虚拟机中安装官方CD提供的Ubuntu系统,版本为10.04。
          
          然后将官方CD提供的交叉编译工具加入环境变量,这样系统就可以识别这些命令。

          接着还需要下载一些必要的工具。

          由于程序一般是在PC上进行交叉编译,生成最后可执行文件,因此需要通过TFTP、NFS或者SSH等方式将此执行文件传送到开发板上。这里推荐Windows下的"SSH Secure Shell"进行文件拷贝。

           将准备工作做完后,便可开始Linux应用程序的开发,这里基于官方的例程对Rico Board板上的LED和按键进行编程。
          在Linux下所有硬件资源都是以文件的形式存在。Rico Board共有4个LED,Linux内核的LED子系统为这4个LED提供了对应的操作接口,位于目录“/sys/class/leds/”下,分别为status_led0、status_led1、status_led2、status_led3。

          以status_led0为例,进入其目录,可以看到几个重要文件。
          “max_brightness”为LED的最大亮度;
          “brightness”控制着LED亮灭,“0”时LED熄灭,“1”时LED点亮;
          “trigger”为LED触发器,控制着LED亮灭方式,当前值为方括号内的“heartbeat”,即以类似心跳的方式进行闪烁。

          应用程序中关键代码如下,让4个LED依次亮灭1秒。此处“sprintf”函数用于生成命令字符串tmp,然后通过system函数将此命令发送到shell中执行。
            for(ledn=0;ledn<=3;ledn++)        {                sprintf(tmp,"echo 1 > /sys/class/leds/status_led%d/brightness",ledn);                printf("status led%d on\n",ledn);                system(tmp);                sleep(1);                sprintf(tmp,"echo 0 > /sys/class/leds/status_led%d/brightness",ledn);                printf("status led%d off\n",ledn);                system(tmp);                sleep(1);        }      接着,将LED0的触发方式变为心跳灯,让它自己在那闪。system("echo heartbeat > /sys/class/leds/status_led0/trigger");      对于按键,这里是基于Linux内核的输入子系统接口进行编程。输入子系统位于目录“/dev/input”下。其中“event0”对应中开发板上的SW3按键。
          要想使用输入子系统下的按键,首先需要以只读的方式打开event0设备。
    keys_fd = open("/dev/input/event0", O_RDONLY);      然后通过read函数读取此设备,如果此时读取值的type属性为EN_KEY,说明发生了按键事件,并通过判断value值来判断按键是按下还是松开。if (read(keys_fd, &t, sizeof(t)) == sizeof(t)){    if (t.type == EV_KEY)        if (t.value == 0 || t.value == 1)        {              printf ("key %d %s\n", t.code,(t.value) ? &quotressed" : "Released");              if(t.code==KEY_ESC)                break;         }}      总结,熟悉了Rico Board Linux应用程序开发的流程。最后附上整个源代码。/*********************************************************************                 copyright (C) 2014 all rights reserved*                         @file: key_led.c*                   @Created: 2014-7-28 14:00*                      @Author: conway chen*           @Description: test user keys and leds *          @Modify Date: 2014-7-28 14:00*********************************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ioctl.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/select.h>#include<sys/time.h>#include<fcntl.h>#include<errno.h>#include<linux/input.h>/** * @brief: main function   * @Param: argc: number of parameters * @Param: argv: parameters list */int main(int argc, char *argv[]){        int ledn;        char* tmp;        int keys_fd;        struct input_event t;                tmp = (unsigned char*)malloc(64);        for(ledn=0;ledn<=3;ledn++)        {                sprintf(tmp,"echo 1 > /sys/class/leds/status_led%d/brightness",ledn);                printf("status led%d on\n",ledn);                system(tmp);                sleep(1);                sprintf(tmp,"echo 0 > /sys/class/leds/status_led%d/brightness",ledn);                printf("status led%d off\n",ledn);                system(tmp);                sleep(1);        }                system("echo heartbeat > /sys/class/leds/status_led0/trigger");          keys_fd = open("/dev/input/event0", O_RDONLY);          if (keys_fd <= 0)          {              printf ("open /dev/input/event0 device error!\n");              return 0;          }        printf("Hit any key on board ......\n");          while(1)          {              if (read(keys_fd, &t, sizeof(t)) == sizeof(t))              {                  if (t.type == EV_KEY)                    if (t.value == 0 || t.value == 1)                   {                      printf ("key %d %s\n", t.code,(t.value) ? &quotressed" : "Released");                      if(t.code==KEY_ESC)                        break;                   }               }          }          close (keys_fd);}
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 12:34 , Processed in 0.119760 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.