最近在搞讯为开发板的驱动,终于将讯为的蜂鸣器驱动搞定,现在进行一个总结。

编写流程:

(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蜂鸣器驱动实现相关推荐

  1. gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图

    蜂鸣器驱动电路图一: 典型的蜂鸣器驱动电路,蜂鸣器驱动电路一般包含:一个三极管.一个蜂鸣器.一个续流二极管.一个滤波电容. 1.蜂鸣器:发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器 ...

  2. 【小月电子】安路国产FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动

    无源蜂鸣器驱动实验例程讲解 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们可以省去虚线框里面的步骤,但是我们的入 ...

  3. 讯为4412环境搭建

    ubuntu默认密码:topeet 1- 环境描述 讯为网盘资料: 链接:https://pan.baidu.com/s/1oGf9AkD_XD-vI6mtkJfc3A  :提取码:ktqb PC: ...

  4. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON10无源蜂鸣器驱动

    无源蜂鸣器驱动实验例程讲解 若要观看该博客配套的视频教程,可点击此链接 开发板实物图 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如 ...

  5. ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)

    参考:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-16 14:47:23 网址:https://blog.csdn.net/ ...

  6. misc类设备与蜂鸣器驱动

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 一.板载蜂鸣器驱动测试 1.驱动部分 (1)九鼎移植内核已经提供了蜂鸣器驱动源码,但如何查找是否已经有驱动文件? 法一 ...

  7. linux蜂鸣器驱动指令,linux蜂鸣器驱动 蜂鸣器--LINUX.doc

    linux蜂鸣器驱动 蜂鸣器--LINUX 导读:就爱阅读网友为您分享以下"蜂鸣器--LINUX"的资讯,希望对您有所帮助,感谢您对92的支持! //mux = 1/16 tcfg ...

  8. exynos 4412 Framebuffer驱动详解

    本文参考了http://blog.chinaunix.net/uid-28328633-id-3565345.html  文中牵扯到一些android fence的知识.这里不做赘述. 请参考相关文章 ...

  9. 讯为4412开发板Linux驱动学习笔记

    驱动理论专题一 Linux驱动程序的基本认识 有了内存管理单元,就有虚拟地址,物理地址. 驱动理论专题二 学会查看原理图 以LED2为示例 通过原理图查看到KP_COL0,赋予高电平则能点亮LED2, ...

  10. 第八章 让开发板发出声音:蜂鸣器驱动读后感

    蜂鸣器是s3c6410开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声. 在前面的章节编写了两个完整的linux驱动:word_count驱动和led驱动,两个有一共同点就 ...

最新文章

  1. HDU1568 Fibonacci
  2. django - 替换admin的textarea为 富文本
  3. DNS中的七大资源记录介绍
  4. 机器学习(十七)——决策树, 推荐系统进阶
  5. 反向代理与Real-IP和X-Forwarded-For(转)
  6. 这几天惨遭Delphi类型转换折磨,请问怎么把double转成int类型
  7. Linux命令(20)linux服务器之间复制文件和目录
  8. 华为经典面试题(敲黑板!!!)
  9. 程序员应该写文档吗?
  10. Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测
  11. ps如何图片调色教程及ps有哪些好用的调色滤镜插件
  12. 经济学家―狗屎―GDP
  13. 9月赠书活动名单公布啦!
  14. 哈代-温伯格平衡定律(The Hardy-Weinberg Equilibrium)
  15. 第127讲:Hadoop集群管理之安全模式解析及动手实战学习笔记
  16. Passage Re-ranking with BERT
  17. JSP--图文并茂(五)
  18. android集成保利威直播趟过的坑
  19. matlab函数randi,Matlab之rand(), randn(), randi()函数的使用方法
  20. 利用朴素贝叶斯进行新闻文本分类

热门文章

  1. OJ 2312 Problem B Peach
  2. openCV 出现 0x770413C5 (ntdll.dll) 第一机会异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突 解决办法
  3. 腾讯视频没有了html分享代码,腾讯视频代码在哪里 腾讯视频嵌入网页的方法-电脑教程...
  4. 腾讯会议html代码,电脑端使用腾讯会议的加入会议步骤
  5. 靶机渗透练习99-hacksudo:FOG
  6. 纯干货,PSI 原理解析与应用
  7. PAT乙级题解——1093 字符串A+B (20分)
  8. nodejs代码将word转成图片
  9. diy 单片机 自动浇花_基于51单片机的自动浇花装置(很详细)
  10. 连接数据库显示: Access denied for user ‘root‘@‘locahost‘(using password:YES)解决方式。