讯为4412蜂鸣器驱动实现
最近在搞讯为开发板的驱动,终于将讯为的蜂鸣器驱动搞定,现在进行一个总结。
编写流程:
(1)分析硬件原理图
要控制beep ----> gpd0_0 --->输出高:响;输出低:不响。
(2)分析该硬件所需配置的寄存器
物理地址:
con:0x114000a0 [0-3] 0x01(output)
dat:0x114000a4 [0] 1响 0灭
(3)搭建驱动框架
1)模块三要素
2)完成字符设备相关的操作
3)相关硬件的操作
3.1 完成映射
3.2 配置寄存器
驱动源码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/io.h>#define NAME "beep_demo"
#define GPD0CON 0x114000a0
#define GPD0DAT 0x114000a4void __iomem *gpd0con;
void __iomem *gpd0dat;int major = 0;int led_open(struct inode *inode, struct file *file)
{writel((0x1<<0),gpd0dat);printk("%s,%d\n",__func__,__LINE__);return 0;
}
int led_release(struct inode *inode, struct file *file)
{writel(~(0x1<<0),gpd0dat);printk("%s,%d\n",__func__,__LINE__);return 0;
}struct file_operations f_ops = {.owner = THIS_MODULE,.open = led_open,.release = led_release,};
int beep_init(void)
{int ret = 0;major = register_chrdev(major,NAME,&f_ops);if(major < 0){printk("%s,%d register_chrdev fail...\n",__func__,__LINE__);return -EINVAL;}gpd0con = ioremap(GPD0CON,4);if(gpd0con == NULL){printk("%s,%d ioremap gpd0con fail...\n",__func__,__LINE__);goto ERR_STEP1;}gpd0dat = ioremap(GPD0DAT,4);if(gpd0dat == NULL){printk("%s,%d ioremap gpd0dat fail...\n",__func__,__LINE__);goto ERR_STEP2;}writel((readl(gpd0con)&~(0xf<<0))|(0x1<<0),gpd0con);printk("%s,%d\n",__func__,__LINE__);return 0;
ERR_STEP2:iounmap(gpd0con);
ERR_STEP1:unregister_chrdev(major,NAME);return ret;
}void beep_exit(void)
{iounmap(gpd0con);iounmap(gpd0dat);unregister_chrdev(major,NAME);printk("%s,%d\n",__func__,__LINE__);
}module_init(beep_init);
module_exit(beep_exit);
MODULE_LICENSE("GPL");
编写Makefile
#!/bin/bash
$(warning KERNELRELEASE = $(KERNELRELEASE))ifeq ($(KERNELRELEASE),)#内核的源码路径, ?= 条件赋值, uname -r 得到内核版本号
KERNELDIR ?= /home/skyfall/iTOP4412/kernel/iTop4412_Kernel_3.0# := 立即赋值, 得到当前的绝对路径
PWD := $(shell pwd)# -C 切换工作路径, $(MAKE) = make
modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*.PHONY: modules cleanelse# 生成模块obj-m := beep_demo.o endif
交叉编译,生成驱动文件:
(3)编写上层的应用程序,实现的是响3s后停止。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, const char *argv[])
{int fd;fd = open("/dev/beep" , O_RDWR);if(fd < 0){perror("open");}sleep(3);return 0;
}
交叉编译,生成可执行文件:
arm-none-linux-gnueabi-gcc test.c -o test
将驱动文件与应用层文件拷贝至开板,首先加载驱动。
insmod beep_demo.ko
查看生成的设备号
创建设备节点
mknod /dev/beep c 248 0
应用层调用:
发现蜂鸣器响3s后停止。
最后卸载驱动模块:
整个蜂鸣器的驱动全部完成。
讯为4412蜂鸣器驱动实现相关推荐
- gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图
蜂鸣器驱动电路图一: 典型的蜂鸣器驱动电路,蜂鸣器驱动电路一般包含:一个三极管.一个蜂鸣器.一个续流二极管.一个滤波电容. 1.蜂鸣器:发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器 ...
- 【小月电子】安路国产FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动
无源蜂鸣器驱动实验例程讲解 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们可以省去虚线框里面的步骤,但是我们的入 ...
- 讯为4412环境搭建
ubuntu默认密码:topeet 1- 环境描述 讯为网盘资料: 链接:https://pan.baidu.com/s/1oGf9AkD_XD-vI6mtkJfc3A :提取码:ktqb PC: ...
- 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动
无源蜂鸣器驱动实验例程讲解 若要观看该博客配套的视频教程,可点击此链接 开发板实物图 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如 ...
- ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)
参考:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-16 14:47:23 网址:https://blog.csdn.net/ ...
- misc类设备与蜂鸣器驱动
以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 一.板载蜂鸣器驱动测试 1.驱动部分 (1)九鼎移植内核已经提供了蜂鸣器驱动源码,但如何查找是否已经有驱动文件? 法一 ...
- linux蜂鸣器驱动指令,linux蜂鸣器驱动 蜂鸣器--LINUX.doc
linux蜂鸣器驱动 蜂鸣器--LINUX 导读:就爱阅读网友为您分享以下"蜂鸣器--LINUX"的资讯,希望对您有所帮助,感谢您对92的支持! //mux = 1/16 tcfg ...
- exynos 4412 Framebuffer驱动详解
本文参考了http://blog.chinaunix.net/uid-28328633-id-3565345.html 文中牵扯到一些android fence的知识.这里不做赘述. 请参考相关文章 ...
- 讯为4412开发板Linux驱动学习笔记
驱动理论专题一 Linux驱动程序的基本认识 有了内存管理单元,就有虚拟地址,物理地址. 驱动理论专题二 学会查看原理图 以LED2为示例 通过原理图查看到KP_COL0,赋予高电平则能点亮LED2, ...
- 第八章 让开发板发出声音:蜂鸣器驱动读后感
蜂鸣器是s3c6410开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声. 在前面的章节编写了两个完整的linux驱动:word_count驱动和led驱动,两个有一共同点就 ...
最新文章
- HDU1568 Fibonacci
- django - 替换admin的textarea为 富文本
- DNS中的七大资源记录介绍
- 机器学习(十七)——决策树, 推荐系统进阶
- 反向代理与Real-IP和X-Forwarded-For(转)
- 这几天惨遭Delphi类型转换折磨,请问怎么把double转成int类型
- Linux命令(20)linux服务器之间复制文件和目录
- 华为经典面试题(敲黑板!!!)
- 程序员应该写文档吗?
- Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测
- ps如何图片调色教程及ps有哪些好用的调色滤镜插件
- 经济学家―狗屎―GDP
- 9月赠书活动名单公布啦!
- 哈代-温伯格平衡定律(The Hardy-Weinberg Equilibrium)
- 第127讲:Hadoop集群管理之安全模式解析及动手实战学习笔记
- Passage Re-ranking with BERT
- JSP--图文并茂(五)
- android集成保利威直播趟过的坑
- matlab函数randi,Matlab之rand(), randn(), randi()函数的使用方法
- 利用朴素贝叶斯进行新闻文本分类
热门文章
- OJ 2312 Problem B	Peach
- openCV 出现 0x770413C5 (ntdll.dll) 第一机会异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突 解决办法
- 腾讯视频没有了html分享代码,腾讯视频代码在哪里 腾讯视频嵌入网页的方法-电脑教程...
- 腾讯会议html代码,电脑端使用腾讯会议的加入会议步骤
- 靶机渗透练习99-hacksudo:FOG
- 纯干货,PSI 原理解析与应用
- PAT乙级题解——1093 字符串A+B (20分)
- nodejs代码将word转成图片
- diy 单片机 自动浇花_基于51单片机的自动浇花装置(很详细)
- 连接数据库显示: Access denied for user ‘root‘@‘locahost‘(using password:YES)解决方式。