s3c6410字符设备(二)按键驱动程序

linux设备驱动之我是led灯-基于OK6410开发板 原创作品转载请注明出处 http://blog.youkuaiyun.com/cediy2088long?viewmode=contents 学习嵌入式linux编程,我们接触到的大多是linux设备驱动程序的编程。今天我就给大家简单的分析一下飞凌的led驱动程序,有了我们前面led的裸机的程序的基础,这个led的驱动也就简单多了。 大家最好是看一下linux设备驱动程序一书的前六章,这 阅读详情

led驱动程序是向寄存器写入数据来控制灯的亮和来,而按键驱动则是从寄存器中读出数据,查看某个键是否按下。这是一个不相同的地方。

下面是键盘驱动:

#define DEVICE_NAME     "buttons"

struct button_irq_desc {
    int irq;
    int number;
    char *name;	
};

static struct button_irq_desc button_irqs [] = {
    {IRQ_EINT( 0), 0, "KEY0"},
    {IRQ_EINT( 1), 1, "KEY1"},
    {IRQ_EINT( 2), 2, "KEY2"},
    {IRQ_EINT( 3), 3, "KEY3"},
    {IRQ_EINT( 4), 4, "KEY4"},
    {IRQ_EINT( 5), 5, "KEY5"},
    {IRQ_EINT(19), 6, "KEY6"},
    {IRQ_EINT(20), 7, "KEY7"},
};
static volatile char key_values [] = {'0', '0', '0', '0', '0', '0', '0', '0'};

static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

static volatile int ev_press = 0;


static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
	struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;
	int down;
	int number;
	unsigned tmp;

	udelay(0);
	number = button_irqs->number;
	switch(number) {
	case 0: case 1: case 2: case 3: case 4: case 5:
		tmp = readl(S3C64XX_GPNDAT);
		down = !(tmp & (1<<number));
		break;
	case 6: case 7:
		tmp = readl(S3C64XX_GPLDAT);
		down = !(tmp & (1 << (number + 5)));
		break;
	default:
		down = 0;
	}

	if (down != (key_values[number] & 1)) {
		key_values[number] = '0' + down;

        	ev_press = 1;
        	wake_up_interruptible(&button_waitq);
    	}

    return IRQ_RETVAL(IRQ_HANDLED);
}


static int s3c64xx_buttons_open(struct inode *inode, struct file *file)
{
    int i;
    int err = 0;
    
    for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {
	if (button_irqs[i].irq < 0) {
		continue;
	}
        err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH, 
                          button_irqs[i].name, (void *)&button_irqs[i]);
        if (err)
            break;
    }

    if (err) {
        i--;
        for (; i >= 0; i--) {
	    if (button_irqs[i].irq < 0) {
		continue;
	    }
	    disable_irq(button_irqs[i].irq);
            free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
        }
        return -EBUSY;
    }

    ev_press = 1;
    
    return 0;
}


static int s3c64xx_buttons_close(struct inode *inode, struct file *file)
{
    int i;
    
    for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {
	if (button_irqs[i].irq < 0) {
	    continue;
	}
	free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
    }

    return 0;
}


static int s3c64xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
{
    unsigned long err;

    if (!ev_press) {
	if (filp->f_flags & O_NONBLOCK)
	    return -EAGAIN;
	else
	    wait_event_interruptible(button_waitq, ev_press);
    }
    
    ev_press = 0;

    err = copy_to_user((void *)buff, (const void *)(&key_values), min(sizeof(key_values), count));

    return err ? -EFAULT : min(sizeof(key_values), count);
}

static unsigned int s3c64xx_buttons_poll( struct file *file, struct poll_table_struct *wait)
{
    unsigned int mask = 0;
    poll_wait(file, &button_waitq, wait);
    if (ev_press)
        mask |= POLLIN | POLLRDNORM;
    return mask;
}


static struct file_operations dev_fops = {
    .owner   =   THIS_MODULE,
    .open    =   s3c64xx_buttons_open,
    .release =   s3c64xx_buttons_close, 
    .read    =   s3c64xx_buttons_read,
    .poll    =   s3c64xx_buttons_poll,
};

static struct miscdevice misc = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEVICE_NAME,
	.fops = &dev_fops,
};

static int __init dev_init(void)
{
	int ret;

	ret = misc_register(&misc);

	printk (DEVICE_NAME"\tinitialized\n");

	return ret;
}

static void __exit dev_exit(void)
{
	misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");
1.中断处理:

request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH, button_irqs[i].name, (void *)&button_irqs[i]);

第一个参数irq,要处理的中断号
第二个参数为中断发生时的回调函数
回调函数的三个参数分别为中断号irq,申请是告诉系统的设备标识dev_id,中断发生时寄存器内容regs
第三个参数flag,申请是的选项快速处理程序SA_INTERRUPT,共享此中断SA_SHIRQ
第四个参数区分处理程序dev_id

2.poll and poll_wait

1、对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应的等待队列头添加到poll_table;
2、返回表示是否对设备进行无阻塞读、写访问的掩码。 提供给内核信息用来使调用进程睡眠直到 I/O 变为可能

3.测试程序

在测试程序中我们把设备结点打开后,不断去读取状态就可以了。

S3C6410嵌入式Linux系统WiFi驱动开发教程 Linux驱动程序是操作系统的核心组件,它允许操作系统与硬件设备进行通信。驱动程序能够将硬件的细节抽象化,为上层应用提供统一的接口。随着Linux在嵌入式设备中的普及,编写高效的驱动程序成为了IT行业中的一个重要技能。S3C6410是三星电子推出的一款基于ARM1176JZF-S核心的高性能应用处理器,广泛应用于移动设备和智能设备中。它具备一系列的多媒体和外设接口功能,使其成为连接无线模块的理想选择。 阅读详情

相关推荐

S3C6410嵌入式系统开发:从裸机到驱动代码详解

S3C6410微处理器是三星电子推出的一款高性能、低功耗的ARM11架构处理器,广泛应用于移动设备和嵌入式系统中。它具有强大的图形处理能力和丰富的接口资源,可以支持Linux、Android等多种操作系统。S3C6410处理器搭载了ARM1176JZF-S核心,工作频率可达667MHz,具有32KB的指令缓存和32KB的数据缓存。此外,它集成了多种外设接口,如USB HOST/Device,SD/MMC等,使其在数据存储和传输方面具有优势。

weixin_42372837的博客 896

S3C6410按键驱动--中断方式

本文转自http://blog.youkuaiyun.com/pillar_zuo/article/details/8007738 [cpp] view plaincopy #include    #include    #include    #include    #include    #include    #include    #include  

u010088496的专栏 723

S3C6410开发板最简LED驱动与测试程序实战

完成了底层准备,接下来就要把你的LED接入Linux设备模型体系。为了让控制更结构化,我们定义自己的命令集:int mode;然后在驱动中处理:break;用户程序可以这样调用:// 启动5秒呼吸灯🎯 安全提醒:任何来自用户空间的数据都要视为潜在威胁!务必做边界检查:if (!防止恶意传参引发内核崩溃 💀经过无数个夜晚调试,我把最容易出问题的地方整理成一张表,供大家避雷👇问题现象根本原因解决方案。

weixin_28729843的博客 871

在S3C6410开发板上的LED驱动程序

这两天写了个LED驱动程序,网上也看了好多的帖子。 开始思路很清晰了,就是先看电路图,发现LED灯是接在GPM端口上的, 然后看S3C6410数据手册,先向GPMCON口写命令字,让GPM0-5设置为输出,再向GPMDAT口写数据字,在GPM0-5引脚拉低或拉高电平, 从而控制LED的亮灭。 1、电路图 很显然LED灯是接在GPM口引脚下面的 2、数据手册 3、L

wq897387的专栏 6700

S3C6410 USB 驱动

S3C6410 USB 驱动用于研究学习WINCE 驱动有较大帮助

六维力传感器选型指南:电阻式vs电容式,哪个更适合你的工业场景?

本文深入解析六维力传感器在工业自动化中的选型要点,重点对比电阻式与电容式传感器的核心原理、环境适应性及成本结构。针对不同工业场景(如高精度装配、重载机器人等),提供专业选型建议,帮助工程师优化系统性能与经济效益。

weixin_42525005的博客 395

OK6410之ADC驱动程序 字符设备驱动

驱动程序: /*  * A adc driver as an example of char device drivers * * The initial developer of the original code is Barry Song * . All Rights Reserved. */ #include #include #include #in

Sun_Rise2011的专栏 2424

ComfyUI+minimaxh3本地部署:漫剧分镜批量生成工作流全实操

视频生成模型正从云端API向本地化部署迁移,背后的技术逻辑是将扩散模型的文本编码、潜空间采样、VAE解码等阶段拆分为可编排的独立环节。ComfyUI作为节点化管线工具,恰好能以可视化连线方式管理这些阶段,让生成过程可控、可复用、可批量执行。minimaxh3模型支持本地推理,配合LoRA微调与参数优化,能够在保证角色一致性的前提下,从分镜脚本批量产出连续剧情片段,规避云端排队、成本高、素材不可控等工程问题。这套工作流广泛应用于漫剧、短剧和动态条漫的工业化生产,尤其适合需要高频迭代分镜草稿的内容团队。文本以零

weixin_29057065的博客 365

基于Linux的S3C6410模拟SPI的外围设备驱动程序、Makefile及测试程序的实现

一、前言 驱动一般分为字符设备驱动、块设备驱动与网络驱动三种类型。本文主要是一个简单字符驱动程序的实现,主要涉及三个部分,即外围驱动、Makefile以及测试程序的编写;在《LDD3》一书中有提到,用户空间的驱动程序有以下优缺点: 优势: ①可以和整个C库链接;②可使用普通的调试器调试驱动程序代码,不用调试正在运行的内核;③程序的崩溃不会影响系统的正常运行,简单地kill掉就OK;④和内...

psy6653的博客 1730

手把手教你用运放和基准源,把±10V信号变成ADC能吃的0-4V(附完整计算过程)

本文详细介绍了如何利用OP07运放和REF5040基准源设计工业级信号调理电路,将±10V传感器信号转换为0-4V ADC可接受范围。通过七步流程,包括需求分析、元器件选型、电路设计、理论计算、PCB布局、实测验证与性能优化,帮助工程师解决信号不匹配问题,提升系统精度与稳定性。

weixin_28731223的博客 468

无监督学习初探:K-Means聚类与主成分分析(PCA)

K-Means适用于快速分组,但对数据分布敏感,可结合轮廓系数评估质量。PCA通过特征值分解实现线性降维,需注意非线性场景的替代方案(如UMAP)。进阶方向:聚类:谱聚类、高斯混合模型(GMM)处理复杂形状。降维:t-SNE、自编码器处理非线性结构。

weixin_69882801的博客 1454

《OK6410-蜂鸣器驱动程序设计》之阻塞型字符设备

蜂鸣器是通过I/O 口GPF15来间接控制的,为了增加驱动能力,增加了三级管驱动电路。当三极管的基极(B)为高电平即GPF15 为高电平时,蜂鸣器会鸣叫,反之则不响。通过设置两者之间的时间(即改变频率)可以使蜂鸣器发出不同的声音,甚至播放乐曲。 OK6410蜂鸣器原理图: 通过I/O 口GPF15来控制: 查看s3c6410芯片手册,端口M对应的三个寄存器地址: 实

默念、情 1785

WebRTC TURN协议初识及turnserver实践

但是TURN协议对服务器有很高的依赖,服务器在带宽和集群上有很大的压力,所以TURN协议通常是当作ICE协议中的一部分来使用。ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number),每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。该relay地址是个公网地址,可以看作是客户端A在公网上的一个代理,任何想要联系A的客户端,只要将数据发送到A的relay地址就可以了。

yinshipin007的博客 566

Tiny6410 简单的LED字符设备驱动

转载注明出处:袁方的技术博客 http://blog.youkuaiyun.com/yf210yf/article/details/7360336 首先分析原来: 1.查看用户手册 led1、led2、led3、led4 连接的分别是 GPK4、GPK5、GPK6、GPK7 2、查询6410芯片手册 下面还需要3个步骤: 1、设置GPIO为OUTPUT。

奔跑的蜗牛 6409

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2096

为什么 ADT 在 SAP BTP ABAP environment 里认证成功却无法登录 Service Instance:根因拆解与一站式修复路线

摘要 ADT报错"认证成功但Service Instance登录失败"通常源于ABAP租户的权限或用户映射问题,而非账号密码错误。常见原因包括:1) ABAP租户内未创建对应业务用户;2) 业务用户缺少开发角色(如SAP_BR_DEVELOPER);3) BTP角色集合未分配或IdP组映射缺失;4) 浏览器会话混淆身份;5) 连接了非开发租户(如Customizing Tenant);6) 实例休眠导致误判。 解决方法:检查ABAP业务用户及角色分配,确认BTP角色集合映射,使用隐身窗口

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

tiny6410按键platform(平台)驱动的实现

tiny6410中的按键驱动没有提供按键的platform驱动,于是闲来无事把/drivers/char/mini6410_buttons.c给移植成platform驱动,下面是整个的移植过程:   1.首先在 /arch/arm/mach-s3c64xx 目录下添加我们的按键device,文件名定为dev-buttons.c,其源码为: #include  #include 

shuaishuai_1111的专栏 445

粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解

粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写为 PSO, 是近年来由J. Kennedy和R. C. Eberhart等开发的一种新的进化算法(Evolutionary Algorithm - EA)。

猫敷雪 893

第17章Linux音频设备驱动之S3C6410+WM9714 ASoC驱动实例

17.6 S3C6410+WM9714 ASoC驱动实例        LDD6410 开发板上为 S3C6410 的 AC97 接口上连接了 Wolfson 公司的 WM9714 Codec 芯片,其硬件连接如图 17.6 所示。WM9714 芯片主要外接了 Microphone、Line in 模拟输入和Headphone 模拟输出。而在数字接口方面,与 S3C6410 CPU 的连接包含了 ...

xiezhi123456的博客 604

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

基于arm11处理器S3C6410内核的linux下串口通信实现

基于arm的linux串口通信与独立按键的实验 最近正好在学习基于ARM的linux下串口通信,现将学习经验与大家共享。以本人刚刚做的例程来一步步讲解。 /*例程目的:通过向内核加载独立按键模块,串口通信模块,编写应用程序,使得当按键按下时,arm可以通过串口对外发送数据。已达到arm与其他设备间的串口通信的目的*/ 一、基础知识 1.串口基本知识:串口:计算机上一种非常通用设备通

方丈的寺院 3784

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

基于tiny6410的led驱动程序

今天弄了一个晚上了 终于弄懂了第一个简单的linux驱动感觉很多人编写的第一个驱动也是拿led开刀的吧。本文的led驱动是基于tiny6410的四个led驱动,用字符设备的驱动模块,而不是混杂设备驱动模块来编写,本人在使用混杂设备方法编写的时候led灯第二个始终无法实现控制开和关现在还在纠结中。 一下图片是开发板手册关于四个用户led的硬件介绍。 下面是s3c6410关于gpio的寄存

摸着石头过河 1114

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ok6410linux usb驱动,linux OK6410 LED驱动

之前都是做单片机开发,以为转到linux来写驱动程序会轻轻松松,当去真正写的时候才发现不是那么容易,就感觉东西太杂太多。所以还是注册了一个博客来记一下,方便查询。国嵌给的OK6410内核自带LED驱动,在内核目录的drivers/char/s3c6410_leds.c,他是直接操作的物理地址,而新的教学视频是通过虚拟地址映射来实现的,但是新的教学视频里给的led.c直接貌似不是6410的驱动,好吧...

weixin_34656543的博客 177

简单字符设备驱动——LED驱动

驱动程序ledkey_drv.c #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "ledke

Sun_Rise2011的专栏 1137

s3c6410的RTC在linux中的驱动(1)

s3c6410硬件RTC(实时时钟)的链接地址 如果对RTC硬件不熟悉的话,可以看上面这篇博客,讲述了硬件有关的内容。 1、先从整体上做些分析,大致看了下linux2.6.28\drivers\rtc文件中的kconfig和Makefile文件,在Makefile文件中有如下内容: ifeq ($(CONFIG_RTC_DEBUG),y) EXTRA_CFLAGS += -

思考的智慧,知识源于思考 3236
上一篇: s3c6410字符设备(一)led字符驱动与测试程序
下一篇: 动态设备处理
ecbtnrt
博客等级 码龄20年 92粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值