Linux 标准输入struct input_event使用示例

Linux C语言键盘监听实战:从/dev/input到termios的两种实现方案 在Linux系统编程中,输入输出(I/O)管理是核心基础,其中键盘输入监听是实现交互式应用的关键技术。其原理在于Linux内核通过输入子系统将硬件事件抽象为统一的设备接口,用户空间程序可通过文件描述符读取原始事件数据。这项技术的工程价值在于能够绕过标准输入缓冲区的限制,实现实时、非阻塞的按键捕获,为开发高性能终端工具和系统级应用提供了底层支持。常见的应用场景包括命令行游戏开发、自定义快捷键工具、安全监控后台以及嵌入式设备的交互控制。本文聚焦于Linux环境下C语言实现键盘监听的两种主流方案:一是通过直接读取 阅读详情

Input_event使用示例

下面贴出一段代码,该代码完成的功能是循环扫描设备列表,寻找你要打开的设备名,打开后非阻塞式的读取输入设备的输入内容。本设备的输入的设备名为”WCH.CN”,具体的设备名可以使用命令查看input列表里找到你的设备名,这里我也只是获取了按键的按下消息,从这部分消息中获取我的文本内容

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <linux/input.h>


#define INPUT_NAME "WCH.CN"

const char chr_table[129] = {
[0] = '\0', [1] = '*', [2] = '1', [3] = '2', [4] = '3', 
[5] = '4', [6] = '5', [7] = '6', [8] = '7', [9] = '8',
[10] = '9',[11] = '0', [12] = '-', [13] = '=', [14] = '\b', 
[15] = '\t', [16] = 'q', [17] = 'w', [18] = 'e', [19] = 'r',
[20] = 't', [21] = 'y', [22] = 'u', [23] = 'i', [24] = 'o', 
[25] = 'p', [26] = '{', [27] = '}', [28] = '\n', [29] = '*',
[30] = 'a', [31] = 's', [32] = 'd', [33] = 'f', [34] = 'g', 
[35] = 'h', [36] = 'j', [37] = 'k', [38] = 'l', [39] = ':',
[40] = '"', [41] = '*', [42] = '*', [43] = '\\',
[44] = 'z', [45] = 'x', [46] = 'c', [47] = 'v', [48] = 'b', 
[49] = 'n', [50] = 'm', [51] = ',', [52] = '.', [53] = '/', 
[54] = '*', [55] = '*', [56] = '*', [57] = ' ', [58] = '*', 
[59] = '*', [60] = '*', [61] = '*', [62] = '*', [63] = '*',
[64] = '*', [65] = '*', [66] = '*', [67] = '*', [68] = '*', 
[69] = '*', [70] = '*', [71] = '*', [72] = '*', [73] = '*',
[74] = '*', [75] = '*', [76] = '*', [77] = '*', [78] = '*', [79] = '*',
[80] = '*', [81] = '*', [82] = '*', [83] = '*', [84] = '*',
[85] = '*', [86] = '*', [87] = '*', [88] = '*', [89] = '*', [90] = '*', 
[91] = '*', [92] = '*', [93] = '*', [94] = '*', [95] = '*', 
[96] = '*', [97] = '*', [98] = '*', [99] = '*', [100] = '*', 
[101] = '*', [102] = '*', [103] = '*', [104] = '*', [105] = '*',
[106] = '*', [107] = '*', [108] = '*',[109] = '*', [110] = '*',
[111] = '*', [112] = '*', [113] = '*', [114] = '*', [115] = '*',
[116] = '*', [117] = '*', [118] = '*', 119] = '*', [120] = '*',
[121] = '*', [122] = '*', [123] = '*', [124] = '*', [125] = '*', 
[126] = '*', [127] = '*', [128] = '*'
};


static int open_input( const char *input_name )
{
    char name[64];
    char buf[128];
    int fd, flags;
    int i = 0;
    for (i = 0; i < 32; i++) {
        sprintf(name, "/dev/input/event%d", i );
        if( access( name, F_OK ) != 0 )
            continue;
        if ((fd = open(name, O_RDONLY, 0)) >= 0) {
             ioctl(fd, EVIOCGNAME(sizeof(buf)), buf);
             printf("name:%s \r\n", buf );
             if( strstr( buf, input_name ) == NULL )
             {
                 close( fd );
                 continue;
             }
            flags = fcntl(fd,F_GETFL,0);  
            flags |= O_NONBLOCK;  
            if( 0 != fcntl(fd,F_SETFL,flags) )
                printf("fcntl failed!:%s \r\n", strerror( errno ));
            printf("open for device:%s \r\n", name );
            return fd;
        }
    }
    return -1;
}

static int input_ready( int fd, int tout )
{
    fd_set  rfd_set;
    struct  timeval tv, *ptv;
    int nsel;

    FD_ZERO( &rfd_set );
    FD_SET( fd, &rfd_set );
    if ( tout == -1 )
    {   
        ptv = NULL;
    }
    else
    {
        tv.tv_sec = 0;
        tv.tv_usec = tout * 1000;
        ptv = &tv;
    }
    nsel = select( fd+1, &rfd_set, NULL, NULL, ptv );
    if ( nsel > 0 && FD_ISSET( fd, &rfd_set ) ) 
        return 1;
    return 0;
}

static int read_input( int fd, char *buf , int maxsize )
{
    struct input_event event;
    int rc;
    int n = 0;
    char *ptr = buf;
    char ch;
    int index;
    int last_key;
    do{
        if( (rc = read(fd, &event, sizeof(event))) < 0)
            return -1;
        if( event.type == EV_KEY && event.value == 1 )
        {
            index = event.code & 0xff;
            if( index  == 42 )
            {
                last_key = 42;
                continue;
            }
            if( index < 128 )
            {
                ch = chr_table[index];
                if( ch != 0 && ch != '*' )
                {
                    // shift key then a -> 'A'
                    if( last_key == 42 )
                        *ptr++ = ch - ( 'a' - 'A' );
                    else
                        *ptr++ = ch;
                    last_key = 0;
                    n++;
                }
            }
        }
    }while( input_ready( fd, 200 ) > 0 && n < maxsize );
    *ptr = '\0';
    return n;
}

int main( int argc, char *argv[] )
{
    int fd = -1;
    int bRun = 1;
    char buffer[256];
    int len;
    while( bRun )
    {
        if( fd < 0 )
        {
            //try to open input dev
            fd  = open_input( INPUT_NAME );
            if( fd < 0 )
            {
                printf("无输入设备可打开!\r\n");
                sleep( 10 );
                continue;
            }
            printf("设备打开成功,开始接收数据...\r\n");
        }
        if( input_ready( fd, 200 ) > 0 )
        {
            len = read_input( fd, buffer, sizeof( buffer ));
            if( len < 0 )
            {
                printf("设备已断开!,关闭!\r\n");
                fd = -1;
                continue;
            }
        }
        printf("READ:%s \r\n", buffer);
    }
}

下面附上struct input_event结构的使用代码

/* 
 * Copyright 2002 Red Hat Inc., Durham, North Carolina. 
 * 
 * All Rights Reserved. 
 * 
 * Permission is hereby granted, free of charge, to any person obtaining 
 * a copy of this software and associated documentation files (the 
 * "Software"), to deal in the Software without restriction, including 
 * without limitation on the rights to use, copy, modify, merge, 
 * publish, distribute, sublicense, and/or sell copies of the Software, 
 * and to permit persons to whom the Software is furnished to do so, 
 * subject to the following conditions: 
 * 
 * The above copyright notice and this permission notice (including the 
 * next paragraph) shall be included in all copies or substantial 
 * portions of the Software. 
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS 
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
 * SOFTWARE. 
 * 
 * This is a simple test program that reads from /dev/input/event*, 
 * decoding events into a human readable form. 
 */  

/* 
 * Authors: 
 *   Rickard E. (Rik) Faith <faith@redhat.com> 
 * 
 */  

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <sys/types.h>  
#include <fcntl.h>  
#include <errno.h>  
#include <time.h>  
#include <linux/input.h>  

struct input_event event;  

int main(int argc, char **argv)  
{  
    char          name[64];           /* RATS: Use ok, but could be better */  
    char          buf[256] = { 0, };  /* RATS: Use ok */  
    unsigned char mask[EV_MAX/8 + 1]; /* RATS: Use ok */  
    int           version;  
    int           fd = 0;  
    int           rc;  
    int           i, j;  
    char          *tmp;  

#define test_bit(bit) (mask[(bit)/8] & (1 << ((bit)%8)))  

    for (i = 0; i < 32; i++) {  
        sprintf(name, "/dev/input/event%d", i);  
        if ((fd = open(name, O_RDONLY, 0)) >= 0) {  
            ioctl(fd, EVIOCGVERSION, &version);  
            ioctl(fd, EVIOCGNAME(sizeof(buf)), buf);  
            ioctl(fd, EVIOCGBIT(0, sizeof(mask)), mask);  
            printf("%s\n", name);  
            printf("    evdev version: %d.%d.%d\n",  
                   version >> 16, (version >> 8) & 0xff, version & 0xff);  
            printf("    name: %s\n", buf);  
            printf("    features:");  
            for (j = 0; j < EV_MAX; j++) {  
                if (test_bit(j)) {  
                    const char *type = "unknown";  
                    switch(j) {  
                    case EV_KEY: type = "keys/buttons"; break;  
                    case EV_REL: type = "relative";     break;  
                    case EV_ABS: type = "absolute";     break;  
                    case EV_MSC: type = "reserved";     break;  
                    case EV_LED: type = "leds";         break;  
                    case EV_SND: type = "sound";        break;  
                    case EV_REP: type = "repeat";       break;  
                    case EV_FF:  type = "feedback";     break;  
                    }  
                    printf(" %s", type);  
                }  
            }  
            printf("\n");  
            close(fd);  
        }  
    }  

    if (argc > 1) {  
        sprintf(name, "/dev/input/event%d", atoi(argv[1]));  
        if ((fd = open(name, O_RDWR, 0)) >= 0) {  
            printf("%s: open, fd = %d\n", name, fd);  
            for (i = 0; i < LED_MAX; i++) {  
                event.time.tv_sec  = time(0);  
                event.time.tv_usec = 0;  
                event.type         = EV_LED;  
                event.code         = i;  
                event.value        = 0;  
                write(fd, &event, sizeof(event));  
            }  

            while ((rc = read(fd, &event, sizeof(event))) > 0) {  
                printf("%-24.24s.%06lu type 0x%04x; code 0x%04x;"  
                       " value 0x%08x; ",  
                       ctime(&event.time.tv_sec),  
                       event.time.tv_usec,  
                       event.type, event.code, event.value);  
                switch (event.type) {  
                case EV_KEY:  
                    if (event.code > BTN_MISC) {  
                        printf("Button %d %s",  
                               event.code & 0xff,  
                               event.value ? "press" : "release");  
                    } else {  
                        printf("Key %d (0x%x) %s",  
                               event.code & 0xff,  
                               event.code & 0xff,  
                               event.value ? "press" : "release");  
                    }  
                    break;  
                case EV_REL:  
                    switch (event.code) {  
                    case REL_X:      tmp = "X";       break;  
                    case REL_Y:      tmp = "Y";       break;  
                    case REL_HWHEEL: tmp = "HWHEEL";  break;  
                    case REL_DIAL:   tmp = "DIAL";    break;  
                    case REL_WHEEL:  tmp = "WHEEL";   break;  
                    case REL_MISC:   tmp = "MISC";    break;  
                    default:         tmp = "UNKNOWN"; break;  
                    }  
                    printf("Relative %s %d", tmp, event.value);  
                    break;  
                case EV_ABS:  
                    switch (event.code) {  
                    case ABS_X:        tmp = "X";        break;  
                    case ABS_Y:        tmp = "Y";        break;  
                    case ABS_Z:        tmp = "Z";        break;  
                    case ABS_RX:       tmp = "RX";       break;  
                    case ABS_RY:       tmp = "RY";       break;  
                    case ABS_RZ:       tmp = "RZ";       break;  
                    case ABS_THROTTLE: tmp = "THROTTLE"; break;  
                    case ABS_RUDDER:   tmp = "RUDDER";   break;  
                    case ABS_WHEEL:    tmp = "WHEEL";    break;  
                    case ABS_GAS:      tmp = "GAS";      break;  
                    case ABS_BRAKE:    tmp = "BRAKE";    break;  
                    case ABS_HAT0X:    tmp = "HAT0X";    break;  
                    case ABS_HAT0Y:    tmp = "HAT0Y";    break;  
                    case ABS_HAT1X:    tmp = "HAT1X";    break;  
                    case ABS_HAT1Y:    tmp = "HAT1Y";    break;  
                    case ABS_HAT2X:    tmp = "HAT2X";    break;  
                    case ABS_HAT2Y:    tmp = "HAT2Y";    break;  
                    case ABS_HAT3X:    tmp = "HAT3X";    break;  
                    case ABS_HAT3Y:    tmp = "HAT3Y";    break;  
                    case ABS_PRESSURE: tmp = "PRESSURE"; break;  
                    case ABS_DISTANCE: tmp = "DISTANCE"; break;  
                    case ABS_TILT_X:   tmp = "TILT_X";   break;  
                    case ABS_TILT_Y:   tmp = "TILT_Y";   break;  
                    case ABS_MISC:     tmp = "MISC";     break;  
                    default:           tmp = "UNKNOWN";  break;  
                    }  
                    printf("Absolute %s %d", tmp, event.value);  
                    break;  
                case EV_MSC: printf("Misc"); break;  
                case EV_LED: printf("Led");  break;  
                case EV_SND: printf("Snd");  break;  
                case EV_REP: printf("Rep");  break;  
                case EV_FF:  printf("FF");   break;  
                    break;  
                }  
                printf("\n");  
            }  
            printf("rc = %d, (%s)\n", rc, strerror(errno));  
            close(fd);  
        }  
    }  
    return 0;  
}
嵌入式Linux键盘事件监听:从/dev/input到evdev的实战指南 在嵌入式Linux开发中,输入事件处理是连接用户交互与硬件控制的核心环节。Linux输入子系统通过扫描码、键码和输入事件将物理按键转换为标准数据结构,为上层应用提供统一的访问接口。理解键盘事件从硬件中断到字符流的转换原理,对于实现实时响应、非阻塞交互的嵌入式应用至关重要。通过直接读取/dev/input/event设备节点,开发者可以获取最原始的按键按下/释放状态,适用于机器人控制、交互式终端等需要精确输入捕获的场景。本文以Intel Edison平台为例,深入解析底层事件监听、termios终端控制及Py 阅读详情

相关推荐

嵌入式Linux触摸屏驱动与电子相册开发实战

在嵌入式Linux开发中,输入子系统是连接硬件与用户交互的核心桥梁,它负责管理键盘、鼠标、触摸屏等各类输入设备。其工作原理是通过内核驱动将硬件产生的原始信号转换为标准输入事件,经由设备节点(如/dev/input/eventX)上报给应用层。这项技术的价值在于为嵌入式设备提供了统一、高效的交互数据通道,是实现智能终端、工业HMI等设备自然交互的基础。典型的应用场景包括智能家居控制面板、便携式医疗设备和车载信息娱乐系统。本文以GEC6818开发板为平台,深入探讨如何从零驱动触摸屏,并综合运用libjpeg图片

weixin_33985507的博客 412

Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子

Linux系统是通过输入子系统来管理输入设备(如鼠标、键盘、触摸屏、游戏摇杆)的。配置了内核支持输入设备且有对应驱动的情况下,当系统接入输入设备,会在/dev目录或/dev/input下生成对应设备文件,下图是鼠标、键盘在不同情况下/dev/input的设备文件。每当输入设备有事件产生时,内核就会将事件上报到设备文件,事件数据以为单位存入设备文件,所以读取这些输入设备文件时使用结构体,这个结构体定义在input-event-codes.h。

wkd_007的博客 1万+

i.MX6ULL开发板按键驱动适配与设备树配置详解

在嵌入式Linux开发中,GPIO驱动是连接硬件与操作系统的关键组件。通过设备树(Device Tree)机制,开发者可以灵活描述硬件配置,实现驱动与硬件的解耦。本文以NXP i.MX6ULL处理器为例,详细讲解如何基于BSP进行GPIO按键驱动适配,包括引脚复用配置、设备树节点编写、内核编译等关键步骤。针对工业控制和智能家居等典型应用场景,特别介绍了低功耗设计、消抖处理等工程实践技巧,帮助开发者快速实现稳定可靠的按键功能。通过飞凌嵌入式ELF 1开发板的具体案例,演示了从原理图分析到功能验证的完整开发流程

weixin_33906657的博客 379

Linux下struct input_event结构体详解

linux 下 struct input_event结构体详解

weixin_47752005的博客 7791

Linux文件描述符原理与Shell重定向实现

文件描述符是Linux系统编程的核心概念之一,作为进程访问I/O资源的抽象句柄,其底层通过文件描述符表、文件表和inode表三级结构实现。理解描述符的复制(dup/dup2)与继承机制,是掌握Shell重定向、管道等高级特性的基础。本文以minishell开发为例,详解如何通过文件描述符操作实现输入输出重定向、描述符传递等关键功能,并探讨epoll监控、非阻塞IO等高性能场景下的最佳实践。

weixin_30887919的博客 423

Unity游戏接入穿山甲广告SDK全攻略:从零到上线的避坑指南

本文为Unity开发者提供了接入穿山甲广告SDK的完整实战指南。详细解析了从账号注册、应用创建到Unity插件集成、安卓与iOS平台打包配置的全流程,并重点分享了广告加载失败、展示异常等常见问题的排查与解决方案,帮助开发者高效实现游戏广告变现。

weixin_29015899的博客 536

struct input_event

struct input_event结构体是linux输入子系统的向应用层传递的接口。操作/dev/input/event1文件,写入个input_event结构体就可以模拟按键的输入。 #inlcude <linux/input.h> struct input_event { struct timeval time;//按键时间 __u16 type;//...

holyjw的博客 3338

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 404

input_event结构体详解

关键结构体input_event信息: struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value; }; type: 设备类型。可以设置为: #define EV_SYN          0x00    表示设备支持所有的事件 #define EV_KEY         

liwei405499的专栏 1万+

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 607

Tesseract OCR 字库训练教程:提高识别率进阶版

通过 Tesseract 字库训练,你可以提高 OCR 对特定文本或字体的识别能力。训练过程包括准备训练数据、生成标签文件、运行训练工具,以及将训练结果集成到实际项目中。虽然训练过程需要一些时间和精力,但对于需要高精度文本识别的场景来说,字库训练是非常有效的提升识别率的方法。

小蜗牛的珍贵百宝箱 1867

linux中event按键程序

嵌入式Linux设备中经常会使用按键,如果驱动遵循标准的linux input驱动,那么应用程序中该怎么获得按键的状态和键值呢?本文就来讲讲event input按键应用编程。 首先要包含头文件 #include 定义设备号 #define KEY_EVENT_DEV    "/dev/event0" 最重要的是struct input_event结构体 struct

cjyusha的专栏 3933

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1283

深入解析input_event结构体:触摸屏事件捕获与同步机制实战

本文深入解析Linux input_event结构体在触摸屏事件处理中的核心作用,详细介绍了EV_ABS、EV_KEY和EV_SYN等事件类型的实际应用与同步机制。通过实战代码示例,展示如何正确捕获和解析触摸屏事件,确保数据完整性和响应准确性,为嵌入式开发提供实用指导。

1048

window下迁移SVN仓库到新的windows服务器

window下迁移SVN仓库到新的windows服务器

Bertram的博客 4692

数据挖掘7、银行精准营销

利用数据挖掘技术,对银行已有数据进行分析,对客户进行识别,对客户是否能够进行存款精准营销Windows11。

m0_63099685的博客 394

嵌入式Linux输入子系统实战:在Intel Edison上监听键盘事件

在嵌入式Linux开发中,输入子系统是处理键盘、鼠标等外设的核心框架。其原理是通过内核驱动将硬件信号转换为标准输入事件,应用程序通过读取/dev/input/下的设备文件获取事件数据。这一机制为嵌入式设备提供了稳定、低延迟的输入处理能力,尤其适用于信息亭、智能控制面板等交互场景。本文以Intel Edison平台为例,深入探讨如何通过Python evdev库监听键盘事件,并解决设备权限、事件解析等常见问题,帮助开发者快速实现可靠的输入处理功能。

weixin_30756499的博客 369

ABAP CDS 视图参数 parameter_list 详解与最佳实践:从语法、作用域到可运行范例

本文系统梳理了ABAP CDS视图的WITH PARAMETERS定义与使用。主要内容包括:1)参数声明语法及其在整条SELECT语句中的贯穿使用;2)参数在WHERE/HAVING/ON等位置的多种写法(:pname和$parameters.pname);3)参数在航空公司航线筛选等实际业务场景中的应用;4)参数与会话变量的协作策略;5)在JOIN ON、HAVING、CASE等高级用法中的实践;6)提供完整的CDS视图与ABAP程序示例,展示参数声明、使用及Open SQL传参方式。所有内容均基于SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 372

input-wacom驱动架构解析:深入理解Linux内核与Wacom硬件通信原理

input-wacom是Linux内核中负责Wacom设备通信的核心驱动程序,它实现了从硬件数据采集到用户空间输入事件转换的完整流程。本文将通过剖析驱动的核心组件和工作机制,帮助读者理解Linux内核与Wacom设备交互的底层原理。 ## 驱动核心数据结构:连接硬件与内核的桥梁 input-wacom驱动通过精心设计的数据结构实现对Wacom设备的抽象和管理。在[4.18/wacom.h](h

gitblog_00622的博客 226

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

嵌入式Linux键盘事件监听:基于Intel Edison与python-evdev的实践指南

在嵌入式Linux系统中,输入设备编程是构建人机交互界面的基础。Linux输入子系统(Input Subsystem)作为内核核心组件,负责统一管理键盘、鼠标等设备,其原理是通过/dev/input/eventX设备节点传递标准化事件数据结构。掌握这一机制的技术价值在于能够实现低延迟、高可靠性的外设交互,尤其适用于物联网网关、工业控制面板等嵌入式应用场景。本文聚焦于Intel Edison平台,针对其Yocto系统环境特性,深入探讨如何利用python-evdev库高效捕获键盘事件。通过对比直接读取设备文件

weixin_30770783的博客 396

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

linux内核驱动开发

图省事、个人用,选。

2401_87196189的博客 419

xone驱动深度解析:Linux平台第三方Xbox控制器技术适配实战指南

在Linux游戏生态中,硬件设备兼容性一直是技术适配的核心挑战。当玩家尝试在Linux系统上使用PowerA、PDP等第三方Xbox兼容控制器时,往往会面临驱动缺失、功能不全的困境。xone项目作为开源驱动解决方案,通过深度技术整合实现了跨平台支持,为Linux用户提供了完整的设备兼容方案。 ## 场景需求与技术挑战 现代游戏外设生态系统日益复杂,第三方控制器厂商通过定制化硬件和协议扩展,为用

gitblog_00225的博客 393

操作系统键盘输入链路全解析:从硬件中断到用户空间

计算机输入系统是操作系统核心功能之一,其本质是硬件与软件协同工作的协议栈。当键盘触发硬件中断后,CPU通过中断描述符表(IDT)跳转到驱动处理程序,完成扫描码到ASCII的转换。Linux内核通过input子系统抽象输入设备,再经TTY子系统进行缓冲管理和进程通信,最终用户空间的终端模拟器通过文件描述符读取数据。理解这套机制对诊断输入无响应、中断风暴等问题至关重要,例如Ubuntu系统中可通过调整watchdog_thresh参数解决中断风暴。掌握键盘输入全链路原理,是开发高性能终端应用和排查底层问题的关键

weixin_34060299的博客 413

Linux

多线程、shell语句、网络编程、mysql数据库、git远程仓库以及redis数据库与缓存的总结性学习

2601_94965056的博客 575

Linux文件操作:从open()系统调用到文件描述符原理

在Linux系统编程中,文件操作是最基础且核心的技术之一。文件描述符作为进程与内核交互的关键抽象,本质上是一个整数值索引,指向内核维护的文件表项。通过open()系统调用,程序可以获取文件描述符,进而进行读写等操作。理解文件描述符的工作原理,对于掌握Linux I/O多路复用、进程间通信等高级特性至关重要。在实际工程中,合理使用O_NONBLOCK非阻塞标志和O_CLOEXEC等特性,能显著提升程序性能和安全性。本文深入分析从用户态open()调用到内核VFS处理的完整链路,揭示文件描述符背后的精妙设计。

weixin_34242331的博客 353
上一篇: Qt4.8编码转换之GBK2UTF8
西格蒙
博客等级 码龄14年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值