31 Linux input子系统按键驱动--4IO驱动16按键

矩阵键盘mega16 c语言程序,51单片机对矩阵键盘实现16个按键操作的电路设计 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。矩阵键盘的优点是节约单片机IO口,例如普通键盘8个IO口只能用作8个按键,而矩阵键盘能作16个按键。本文以51单片机为载体介绍一种4*4矩阵键盘实现16个按键操作的原理、电路和软件设计要点。1、 ... 阅读详情

31.1 前言

按键是设备中是最常见的人机交互方式,本节中将学习两部分。

(1)如何4个GPIO 16个按键的实现;

(2)Linux input按键驱动开发实例编程;

31.2 4个IO驱动16按键原理

在常见的按键驱动中,我们可以设计一个按键矩阵,给按键设定一个坐标。如由8个GPIO驱动的4x4矩阵按键,便是通过水平、垂直两个维度对按键进行坐标化。本节讲到的由4GPIO驱动16按键的设计,是GPIO按键驱动按键的一种优化,该方案需要软硬结合,在按键矩阵中添加晶体管,以完成4GPIO驱动16按键的方案。硬件实现如下示:

                                                    

 

如上图示,4个GPIO默认都是上拉输入(即默认在高电平状态),当有按键按下时,4个GPIO的某个就会被拉为低电平。读取数值的原理为通过扫描4个GPIO进行按键判断。

扫描方法如下:

(1)KEY1-4 设置为上拉输入,程序依次读取这四个IO的值,此时读取的到值是对应上图E列的按键,当发现某个IO为低电平时,返回此时扫描的序号,该序号可以辨别是哪个按键按下的;

(2)设KEY1输出低电平,KEY2-4设置为上拉输入,程序读取KEY2-4IO的值,此时对应的是A列IO

(3)设KEY2输出低电平,KEY1、KEY3-4设置为上拉输入,程序读取KEY1、KEY3-4IO的值,此时对应的是B列IO

(4)设KEY3输出低电平,KEY1-2、KEY-4设置为上拉输入,程序读取KEY1-2、KEY-4IO的值,此时对应的是C列IO

(5)设KEY4输出低电平,KEY1-3设置为上拉输入,程序读取KEY1-3IO的值,此时对应的是D列IO

读取按键代码实现:

static int read_kbd_key(void)  
{  
    int key_num = 0;  
    int i, j;  
      
    /*设GPIO全为上拉输入*/  
    if (gpio_direction_set(0x00) == -1)  
        goto err_direction_set;  
  
    /*读取E列IO*/  
    for (j = 0; j < 4; j++) {  
        if ((gpio_get_value(gpio_pin[j]) & 0x01) == 0)  
            return key_num;  
        key_num++;  
    }  
      
    /*读取A-D列IO*/  
    for (i = 0; i < 4; i++) {  
        for (j = 0; j < 4; j++) {  
            if (j == i)  
                continue;  
  
            if ((gpio_get_value(gpio_pin[j]) & 0x01) == 0)  
                return key_num;  
            key_num++;  
        }  
    }  
err_direction_set:  
    return -1;  
} 

31.3 Linux Input按键驱动实现

Linux驱动编程包含两个部分,第一个是对硬件设备初始化;第二个是根据Linux驱动框架填充驱动代码。

         对于Linux 3.x有引入设备树及gpiolib的内核,一般会在编译内核的时候已经配置好处理器的所有IO,并使用GPIOLib对所有GPIO进行统一管理,因此如需操作某个GPIO那么可以直接调用内核gpiolib库提供的操作函数库,申请对某IO的控制权。引入GPIOLib的目的是避免多个驱动控制一个IO所带来的混乱,gpiolib需要在编译内核的时候选上支持gpiolib。

         输入子系统由驱动层、输入子系统核心、事件处理层三部分组成。一个输入事件,如鼠标移动、键盘按下等通过Driver->Inputcore->Event handler->userspace的顺序到达用户控件的应用程序。

struct input_dev 结构数据说明:

struct input_dev {

 

const char *name

设备名

char *phys;

设备文件节点名

char *uniq

全球唯一的ID号

struct input_id id

设备id;用于匹配事件处理层handler

unsigned long evbit

表示设备支持的事件类型

unsigned long keybit

表示支持的按键类型

unsigned long relbit

支持相对坐标的值

unsigned long absbit

支持绝对坐标的值

………

 

 

相关函数说明

struct input_dev *input_allocate_device

动态分配一个struct input_dev 结构;返回一个指针

input_register_device(*dev)

注册input设备;dev为inputDev指针

input_unregister_device(*dev)

注销input设备;dev为inputDev指针

set_bit(event,bit)

设置input子系统支持哪些事件;参数为事件类型,设置位。如设置支持按键:set_bit(EV_KEY,input_dev->evbit);

input_report_key(*dev, code, value)

上报按键事件及值

input_report_rel(*dev, code, value)

上报相对值

input_report_abs (*dev, code, value)

上报绝对值

input_sync(*dev)

同步上报事件

 

 

31.4 Linux input子系统驱动示例

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/time.h>
#include <linux/slab.h> //kmalloc头文件
#include <linux/input.h>
#include <linux/sys_config.h>
#include <linux/gpio.h>
#include <asm/io.h>

struct input_dev *inputKeyDev;		/*input设备指针*/

//上报示例处理
static int inputDev_IRQHandler()
{
	input_report_key(inputKeyDev,KEY_1, !gpio_get_value(KEY_1));
	input_sync(inputKeyDev);		
	return 0;
}

static int __init inputDev_Init(void)
{
	int  nRet = -1;
	/*分配一个input结构*/
	inputKeyDev = input_allocate_device();
	if (!inputKeyDev) {
		nRet = -ENOMEM;
		goto iExit0;
	}
	/*设置支持事件类型*/
	set_bit(EV_SYN,inputKeyDev->evbit);
	set_bit(EV_KEY,inputKeyDev->evbit);
	set_bit(KEY_1,inputKeyDev->keybit);

	/*注册到输入子系统中*/
	nRet = input_register_device(inputKeyDev);
	 if(nRet)
		 goto iExit0;

	return nRet;
iExit0:	
	if(inputKeyDev!=NULL)  input_free_device(inputKeyDev);

	return nRet;
}

static void __exit inputDev_Exit(void)
{
	/*注销输入子系统设备*/
	input_unregister_device(inputKeyDev);
	/*释放申请的内存*/
	input_free_device(inputKeyDev);
}

module_init(inputDev_Init);
module_exit(inputDev_Exit);
MODULE_LICENSE("GPL");

31.5 Linux 16按键驱动实例

/*****************************************************************
* 包含头文件
******************************************************************/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/time.h>
#include <linux/slab.h> //kmalloc头文件
#include <linux/input.h>
#include <linux/sys_config.h>
#include <linux/gpio.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/hrtimer.h>  
#include <linux/sched.h>

/*****************************************************************
* 宏定义(仅在当前C文件使用的宏定义写在当前C文件中,否则需写在H文件中)
******************************************************************/
#define IKEY_PIN_1 (GPIOD(16))
#define IKEY_PIN_2 (GPIOD(17))
#define IKEY_PIN_3 (GPIOD(19))
#define IKEY_PIN_4 (GPIOD(22))

#define INPUT_IKEY_NAME "iKey"
#define IKEY_TIMEOUT_MS	(80)			/*80ms扫描一次按键*/
/*****************************************************************
* 结构定义(仅在当前C文件使用的结构体写在当前C文件中,否则需写在H文件中)
******************************************************************/
struct _iKeyInfoSt{
	int iKeyNum;						/*保存按键值*/	
	int iKeyUpFlag;						/*是否上报*/
	int nQueWaiting;					/*等待队列条件*/
	wait_queue_head_t iwaitQue;			/*等待队列*/
	struct hrtimer ihrtimer;			/*高精度定时器*/
	struct timer_list iKeyTimer;		/*轮询定制器,每隔50ms轮询一次键盘*/	
	struct work_struct iKeyDectWork;	/*键盘检测工作队列*/
	struct delayed_work iKeyDelayWork;/*键盘检测工作队列*/
	struct input_dev *inputKeyDev;		/*input设备指针*/
};

/*****************************************************************
* 全局变量定义
******************************************************************/
struct _iKeyInfoSt *piKeyInfoSt = NULL;

static unsigned int igpio_pin[] = {
	IKEY_PIN_1, IKEY_PIN_2, IKEY_PIN_3, IKEY_PIN_4,
};

/*键盘对应的上报的键值*/
static u32 iKeycodes[16] = {
	KEY_DOWN,
	KEY_F1,
	KEY_HOME,
	KEY_UP,
	KEY_8,
	KEY_0,
	KEY_1,
	KEY_5,
	KEY_BACKSPACE,
	KEY_2,
	KEY_6,
	KEY_9,
	KEY_3,
	KEY_4,
	KEY_7,
	KEY_KPASTERISK
};
/*****************************************************************
* 静态变量定义
******************************************************************/

/*****************************************************************
* 外部变量声明(如果全局变量没有在其它的H文件声明,引用时需在此处声明,
*如果已在其它H文件声明,则只需包含此H文件即可)
******************************************************************/
																						
/*****************************************************************
* 函数原型声明
******************************************************************/
static enum hrtimer_restart iKey_hrtimerHander(struct hrtimer *timer)  
{
	piKeyInfoSt->nQueWaiting = 1;
	wake_up(&piKeyInfoSt->iwaitQue);
	return HRTIMER_NORESTART;
}

static int iKey_gpioSetDirection(unsigned int ndir)
{
	unsigned int i = 0;	
	for (i = 0; i < 4; i++) {
		if (ndir & BIT(i)) {
			if (gpio_direction_output(igpio_pin[i], 0)) {
				return -1;
			}
		} else {
			if (gpio_direction_input(igpio_pin[i])) {
				return -1;
			}
		}
	}

	/*启动高精度定时器,结合等待队列延时1ms*/	
	hrtimer_start(&piKeyInfoSt->ihrtimer,ktime_set(0,1500*1000),HRTIMER_MODE_REL);
	wait_event(piKeyInfoSt->iwaitQue,piKeyInfoSt->nQueWaiting);
	piKeyInfoSt->nQueWaiting = 0;
	
	return 0;
}


static int iKey_readValue(void)
{
	int key_num = 0;
	int i, j;

	if (iKey_gpioSetDirection(0x00) == -1)
		goto iExit;

	for (j = 0; j < 4; j++)
	{
		if ((gpio_get_value(igpio_pin[j]) & 0x01) == 0)
			return key_num;
		key_num++;
	}

	for (i = 0; i < 4; i++) {
		if (iKey_gpioSetDirection(BIT(i)) == -1)
			goto iExit;

		for (j = 0; j < 4; j++)
		{
			if (j == i)
				continue;

			if ((gpio_get_value(igpio_pin[j]) & 0x01) == 0)
				return key_num;
			key_num++;
		}
	}

iExit:
	return -1;
}


static void iKey_delayWorkCallBack(struct work_struct *data)
{
	int key_num = 0;

	key_num = iKey_readValue();
	if (key_num == piKeyInfoSt->iKeyNum)
	{
		input_report_key(piKeyInfoSt->inputKeyDev, iKeycodes[piKeyInfoSt->iKeyNum], 1);
		input_sync(piKeyInfoSt->inputKeyDev);
		piKeyInfoSt->iKeyUpFlag = 1;
	}
}


static void iKey_dectWorkCallBack(struct work_struct *data)
{
	int key_num = 0;

	/*扫描读取按键值*/
	key_num = iKey_readValue();
	if (key_num != -1) 
	{
		if(piKeyInfoSt->iKeyUpFlag!=1) piKeyInfoSt->iKeyNum = key_num;
		/*延时20ms消抖*/
		schedule_delayed_work(&piKeyInfoSt->iKeyDelayWork, msecs_to_jiffies(20));
	}
	else if(piKeyInfoSt->iKeyUpFlag == 1)
	{
		input_report_key(piKeyInfoSt->inputKeyDev, iKeycodes[piKeyInfoSt->iKeyNum], 0);
		input_sync(piKeyInfoSt->inputKeyDev);		
		piKeyInfoSt->iKeyUpFlag = 0;
	}
	
	mod_timer(&piKeyInfoSt->iKeyTimer, jiffies + msecs_to_jiffies(IKEY_TIMEOUT_MS));
}

void iKey_timerCallBack(unsigned long arg)
{
	schedule_work(&piKeyInfoSt->iKeyDectWork);
}

static int iKey_gpioInit()
{
	int i = 0;
	char chlabel[16] ={0};
	
	for (i = 0; i < 4; i++)
	{
		if (gpio_is_valid(igpio_pin[i]))
		{
			memset(chlabel, 0, 16);
			sprintf(chlabel, "igpio_%d", i);
			if (gpio_request(igpio_pin[i], chlabel))
			{
				pr_err("gpio_request failed [%d]\n", igpio_pin[i]);
				goto iExit;
			}
		}
		else 
		{
			pr_err("wrong gpio num [%d]\n", igpio_pin[i]);
			goto iExit;
		}
	}

	return 0;
iExit:
	pr_err("gpio init failed\n");
	for (; i > 0; i--) {
		gpio_free(igpio_pin[i - 1]);
	}
	return -1;
}

static void iKey_gpioExit(void)
{
	unsigned int i = 0;
	for (i = 0; i < 4; i++)
	{
		gpio_free(igpio_pin[i]);
	}
}


static int __init iKey_Init(void)
{
	int  ni = 0;
	int  nRet = -1;
	
	/*分配内存保存结构*/
	piKeyInfoSt = kzalloc(sizeof(struct _iKeyInfoSt), GFP_KERNEL);
	if (!piKeyInfoSt){
		nRet = -ENOMEM;
		goto iExit0;
	}

	/*分配一个input结构*/
	piKeyInfoSt->inputKeyDev = input_allocate_device();
	if (!piKeyInfoSt->inputKeyDev) {
		nRet = -ENOMEM;
		goto iExit0;
	}
	
	/*填充对应结构的数据*/
	piKeyInfoSt->inputKeyDev->name			= INPUT_IKEY_NAME;
	piKeyInfoSt->inputKeyDev->phys			= "iKeyPhys";
	piKeyInfoSt->inputKeyDev->id.bustype	= BUS_HOST;
	piKeyInfoSt->inputKeyDev->id.vendor		= 0x0001;
	piKeyInfoSt->inputKeyDev->id.product	= 0x0001;
	piKeyInfoSt->inputKeyDev->id.version	= 0x0100;

	/*设置支持事件类型*/
	set_bit(EV_SYN,piKeyInfoSt->inputKeyDev->evbit);
	set_bit(EV_KEY,piKeyInfoSt->inputKeyDev->evbit);

	/*设置支持哪些按键*/
	for (ni = 0; ni < 16; ni++)
		set_bit(iKeycodes[ni], piKeyInfoSt->inputKeyDev->keybit);

	/*注册到输入子系统中*/
	nRet = input_register_device(piKeyInfoSt->inputKeyDev);
	 if(nRet)
		 goto iExit0;

	/*使用高精度定时器+等待队列进行延时*/
	piKeyInfoSt->iKeyUpFlag	= 0;
	piKeyInfoSt->nQueWaiting = 0;
	init_waitqueue_head(&piKeyInfoSt->iwaitQue);
	hrtimer_init(&piKeyInfoSt->ihrtimer,CLOCK_MONOTONIC,HRTIMER_MODE_REL);	
	piKeyInfoSt->ihrtimer.function = iKey_hrtimerHander;	/* 设置回调函数 */  

	/*初始化工作队列*/
	INIT_WORK(&piKeyInfoSt->iKeyDectWork, iKey_dectWorkCallBack);
	INIT_DELAYED_WORK(&piKeyInfoSt->iKeyDelayWork, iKey_delayWorkCallBack);

	/*Linux内核定时器初始化*/
	init_timer(&piKeyInfoSt->iKeyTimer);
	piKeyInfoSt->iKeyTimer.function= iKey_timerCallBack;
	piKeyInfoSt->iKeyTimer.expires = jiffies + msecs_to_jiffies(IKEY_TIMEOUT_MS);
	add_timer(&piKeyInfoSt->iKeyTimer);

	/*初始化GPIO*/
	nRet = iKey_gpioInit();
	if(nRet<0)
		goto iExit0;

	return 0;
iExit0:	
	if(piKeyInfoSt->inputKeyDev!=NULL)  input_free_device(piKeyInfoSt->inputKeyDev);
	if(piKeyInfoSt!=NULL) kfree(piKeyInfoSt);

	return nRet;
}

static void __exit iKey_Exit(void)
{
	/*注销输入子系统设备*/
	input_unregister_device(piKeyInfoSt->inputKeyDev);
	/*删除定时器*/
	del_timer(&piKeyInfoSt->iKeyTimer);	
	/*释放已申请的GPIO*/
	iKey_gpioExit();
	/*删除工作队列*/
	cancel_work_sync(&piKeyInfoSt->iKeyDectWork);
	cancel_delayed_work(&piKeyInfoSt->iKeyDelayWork);
	/*删除高精度定时器*/
	hrtimer_cancel(&piKeyInfoSt->ihrtimer);
	
	/*释放申请的内存*/
	if(piKeyInfoSt->inputKeyDev!=NULL)  input_free_device(piKeyInfoSt->inputKeyDev);
	if(piKeyInfoSt!=NULL) kfree(piKeyInfoSt);
}

module_init(iKey_Init);
module_exit(iKey_Exit);
MODULE_LICENSE("GPL");

 

四个IO口控制16个按键的程序 这个程序是配合上面的按键来写的,四个IO口控制16个按键,是配套的资源 立即下载

相关推荐

4个IO口控制16个按键

用四个IO口控制16个按键,可以大大的节省IO口,适用于接口较少的CPU

如何巧妙利用4个IO口驱动12个LED灯

在电路设计过程中有时经常遇到单片机的IO口不够用的情况。对于这样的问题,我们可以选择换单片机,也可以尝试一些巧妙的设计来避免IO口不够用的问题。例如当我们在设计中遇到许多LED灯需要控制的时候,而单片机的IO口又不够用,我们又不希望增加成本,此时我们可以采用“查理复用”(Charlieplexing)的方式去解决这个问题。 “查理复用”(Charlieplexing)作为一种LED显示器多路复用的方法,能够使人们利用少量的IO口控制很多的LED灯,在LED领域应用广泛。 当使用 Charlieplexi

三明治开发社区的博客 1万+

4按键控制16LED流水灯基于51

该文件是基于51单片设计的,4个按键控制十六个LED显示四种花样,LED以4*4方式排列,1用单片机连接16个流水灯,按*4矩阵排列; 2设置四个独立式按键;按下第一个按键,外圈流水灯闪烁,闪烁间隔为1秒, 按下第二个按键,内圈流水灯闪烁,闪烁间隔为2秒,当按下第三个按键时,对角线上的灯依次点亮,间隔时间为一秒当按下笫四个按键时,第一行闪烁三次后熄灭,第二行闪烁两次后熄灭,第三行闪烁四次后熄灭,第四行闪烁一次后熄灭,按此方式循环。

单片机按键连接方法总结(五种按键扩展方案详细介绍)

http://blog.sina.com.cn/s/blog_634771fd0100hd1h.html 单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。不同的设计方法,有着不同的优缺点。而又由于单片机I/O资源有限,如何用最少的I/O口扩展更多的按键是我所研究的问题。接下来我给大家展示几种自己觉得比较好的按键扩展方案,大家可以在以后的单片机电路设计中灵活运

zhouchibaooo的专栏 1万+

RK3588S开发板实战:手把手教你调试IMX415摄像头(附常见问题排查)

本文提供了基于RK3588S开发板调试IMX415摄像头的完整实战指南。从硬件连接到软件配置,详细解析了设备树(DTS)设置、驱动加载验证及V4L2工具链使用,并附带了常见问题排查方法,帮助开发者快速解决摄像头调试中的典型问题,实现图像采集与性能调优。

assembly8low的博客 596

AIDD-人工智能药物设计-构建基于机器学习方法的在线预测平台高准确预测药物诱导骨毒性

在此基础上,提取多种药物分子特征,包括分子指纹(如MACCS、Morgan、RDKit、TopologicalTorsion、AtomPairs与Descriptors)及分子图谱,通过Transformer编码器与神经网络进行机器学习模型训练。最后,将训练好的模型部署为在线Web服务器(BoneToxPD),供用户快速预测药物的骨毒性。本研究不仅在骨毒性预测的准确性方面取得了突破,还在模型解释性方面提供了新的视角,通过注意力机制精准识别出影响骨毒性的关键化学基团,推动药物研发领域更安全、更高效的发展。

itwangyang520的博客 1080

Linux 输入设备 自定义键盘 input输入子系统 gpio-keys按键驱动

文章目录 nano /proc/bus/input/devices

“逛丢一只鞋”的博客 7358

疲劳容器的定义_FKM规范针对非焊接构件疲劳强度评估实例介绍(下篇)

一、写在前面FKM Inside ANSYS软件,该软件是在FKM 规范的基础上,在ANSYS Workbench内开发的进行非焊接构件及焊缝静强度和疲劳强度评估的工具包。基于ANSYS计算模型的信息,在图形用户界面定义相关设置,利用有限元分析计算结果,自动嵌入FKM规范要求的静强度计算和疲劳强度计算流程和方法,自动将应力结果和相关物理量传递给工具包,无须手动预先选择评估的热点区域,可以...

weixin_35925298的博客 1885

Linux 外设驱动 应用 2 KEY 按键实验

按键是指轻触式按键开关,也称之为轻触开关。按键开关是一种电子开关,属于电子元器件类,最早出现在日本,称之为:敏感型开关,使用时以满足操作力的条件向开关操作方向施压开关功能闭合接通,当撤销压力时开关即断开,其内部结构是靠金属弹片受力变化来实现通断的。

huanghongqi11的博客 996

从CCS3.3到CCS10:工程迁移与开发环境升级全攻略

本文详细介绍了从CCS3.3迁移到CCS10的完整流程与实战指南。针对老旧DSP项目,阐述了升级的必要性,并逐步指导CCS10的安装配置、界面操作、核心的工程移植步骤,以及移植后常见的代码调整与问题解决方案,帮助开发者高效完成开发环境升级,充分利用新版本的工具链提升开发效率。

weixin_29304985的博客 377

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月13日-安全配置-准备工作

请遵循本规程将SABRE 3D/3DxT/3D Scimitar系统设置为安全配置,以便能够在电镀单元、APT模块、XMM(或SRD)模块、工厂接口(FI)外壳或中央通道内部及周边区域执行作业p104-p117。在生产过程中暂停调度程序存在一定风险:若待维护模块未离线且在其他模块完成处理前重启调度程序,可能对生产晶圆造成影响。维护人员需特别注意电镀模块内的晶圆状态,并尽可能快速地恢复调度程序。确认待维护模块内无晶圆滞留暂停调度程序并将相应模块设置为离线状态打开模块检修门并关闭安全盖板(槽位)

weixin_46735260的博客 1368

高通安卓12-Input子系统

1.Input输入子系统架构Input Driver(Input设备驱动层)->Input core(输入子系统核心层)->Event handler(事件处理层)->User space(用户空间)2.getevent获取Input事件的用法getevent 指令用于获取android系统中 input...

weixin_42355252的博客 172

EB tresos配置指南:CAN通信信号收发全流程解析

本文详细解析了使用EB tresos配置工具实现AUTOSAR架构下CAN通信信号收发功能的全流程。从环境准备、COM模块信号定义、PduR路由配置、CanIf硬件抽象到CAN驱动层设置,提供了清晰的步骤指南和关键配置要点,帮助开发者快速打通从应用层到物理层的数据链路,实现可靠的CAN通信。

weixin_29192141的博客 508

input子系统学习之三:设备层

设备层:直接操作硬件,所有事件上报核心层或者通过核心层得到需要硬件执行什么操作 input子系统按键驱动实例: 1 /* 参考drivers\input\keyboard\gpio_keys.c */ 2 3 #include <linux/module.h> 4 #include <linux/version.h> ...

dde42613的博客 128

【论文解读】Baidu Apollo EM Motion Planner

系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景;在车道轨迹生成器内部,迭代的解决基于Frenet坐标的路径和速度规划;针对路径和速度规划问题,提出了动态规划与基于样条的二次规划相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通规则、障碍物决策和平滑度问题。该规划器可扩展至高速公路和城市低速驾驶场景。高精地图模块提供了任何人都可以访问的高精地图。感知和定位模块提供了动态环境中必要的信息。运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行。

xiewf的博客 6093

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

i.MX6ULL终结者Linux INPUT子系统实验编写实验程序

文章目录1 编写驱动程序2 应用测试程序 在本实验中使用按键KEY0设备。所以设备树节点不用修改,直接使用前面章节创建的key节点即可。 1 编写驱动程序 本实验例程路径:i.MX6UL终结者光盘资料/06_Linux驱动例程/17_key_input 创建key_input.c文件,具体内容如下: 1 #include <linux/types.h> 2 #include <linux/kernel.h> 3 #include <linux/delay.h>

weixin_46635880的博客 202

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Linux网络】五种IO模型与非阻塞IO

本文聚焦操作系统与 Linux 网络编程核心 IO 体系,从 IO 最底层的本质概念入手,拆解 IO 执行的两大核心步骤,解释 IO 运行低效的根本原因,并给出优化 IO 效率的核心思路。为了降低抽象概念的理解难度,全文采用钓鱼生活化案例类比业界通用的五种经典 IO 模型,依次讲解阻塞 IO、非阻塞 IO、信号驱动 IO、IO 多路复用、异步 IO 的运行逻辑,同时精准界定同步 IO 与异步 IO的判定标准,搭配可直接编译运行的 C 语言代码完成信号驱动 IO、POSIX 异步 IO 的实操演示。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 2697

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

输入子系统简单(按键)测试

输入子系统简单(按键)测试  //input_key.c   1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include /* for

wenhui_的专栏 4769

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

正点原子 战舰原理图pcb_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(二)...

1)实验平台:正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子58.2 硬件原理图分析本章实验硬件原理图参考15.2小节即可。58.3实验程序编写本实验对应的例程路径为:开发板光盘->2、Linux驱动例程->20_input。58.3.1 修改设备树文件直接使用49.3.1小节创建的key节点即可。58....

weixin_39978257的博客 299

Linux GPIO子系统深度解析:从设备树到驱动开发与libgpiod实践

GPIO(通用输入输出)是嵌入式系统与物理世界交互的基础接口,其核心原理是通过软件控制硬件引脚的电平状态,实现数字信号的输入与输出。在Linux系统中,GPIO子系统作为内核框架,将不同芯片厂商的硬件操作抽象为统一API,为驱动和应用开发者提供了标准化的访问方式,其技术价值在于实现了硬件操作的抽象化、安全性与可移植性。该技术广泛应用于LED控制、按键检测、传感器读取等嵌入式场景。本文聚焦于Linux环境下GPIO的现代操作方法,深入探讨了设备树(Device Tree)中的资源定义、GPIO描述符(gpio

weixin_33908217的博客 291

飞腾FT2000/4 GPIO与中断驱动开发实战:从设备树到按键消抖

在ARM Linux平台的外设驱动开发中,GPIO与中断机制是工程师必须掌握的基础能力。飞腾FT2000/4作为国产化四核处理器,其GPIO控制器由多个bank组成,通过寄存器控制方向与电平,中断链路则涉及边沿检测、GIC映射和IRQ Domain转换。理解设备树对引脚的描述、pinctrl的复用管理以及gpiolib的统一接口,是高效开发的前提。与传统x86平台依赖BIOS不同,ARM平台需要开发者主动通过设备树和内核子系统掌控硬件逻辑。基于gpiod工具和线程化中断,可以实现可靠的按键消抖与中断响应。此

weixin_33866037的博客 317

Linux嵌入式驱动开发17——输入子系统

文章目录什么是输入子系统 什么是输入子系统 /* * Copyright (c) 1999-2002 Vojtech Pavlik * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foun

“逛丢一只鞋”的博客 910

spi子系统之驱动SSD1306 OLED

spi子系统之驱动SSD1306 OLED 接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了。主要原因是没理解透程序架构,各个模块之间的关系,如何联系在一起,再加上没有实例验证。后来逐渐发现,理解框架能达到事半功倍的效果,理解框架之后,反而代码也更容易看懂,甚至可以猜部分代码的...

a18653069363的博客 1210

linux mx53注册串口驱动,(转)i.MX53 GPIO 按键驱动

Freescale i.MX53 GPIO 按键驱动硬件平台:IMX53-QSB内核版本:LINUX-2.6.35.3系统版本:ANDROID 2.3.4一、GPIO的使用按键的处理需要读取相应IO 引脚的值,阅读 IMX53 处理器芯片手册,得知将 GPIO 读模式大的步骤如下:1. 通过设置 IOMUX 将相应引脚配置为 GPIO 模式,控制的寄存器是IOMUXC_SW_MUX_CTL_PAD...

weixin_34171095的博客 283

linux mx53注册串口驱动,i.MX53 GPIO 按键驱动

硬件平台:IMX53-QSB内核版本:LINUX-2.6.35.3系统版本:ANDROID 2.3.4一、GPIO 的使用按键的处理需要读取相应 IO 引脚的值,阅读 IMX53 处理器芯片手册,得知将 GPIO 读模式大的步骤如下:1. 通过设置 IOMUX 将相应引脚配置为 GPIO 模式,控制的寄存器是 IOMUXC_SW_MUX_CTL_PAD_XXX2. 配置 GPIO 的方向为输入,控...

weixin_39577052的博客 193
上一篇: 33 Linux内核高精度定时器实现延时
下一篇: Md5加密实现 C语言
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值