TQ2440外接GPIO蜂鸣器驱动程序

2023-05-16

       本文通过TQ2440开发板上可外接的GPIO口GPG14连接蜂鸣器,通过控制GPG14引脚的高低电平的输出和高低电平输出之间的时间间隔来使蜂鸣器发出不同的声音。

       1.打开S3C2440的底板原理图找到GPIO,如下图所示:

        

        使用万用表先找到VDD5V那个引脚,然后对照图找到GPG14,将蜂鸣器的正极连上GPG14,负极连上GND接地。

        2.蜂鸣器驱动程序源代码My_Beep.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h> //定义s3c2410的GPIO
#include <mach/hardware.h> //定义操作s3c2410的GPIO的函数  
#include <linux/device.h> //自动创建设备文件应该包含的头文件 

#define DEVICE_NAME  "My_Beep" //加载模块后执行cat/proc/devices中看到的设备名称
#define Beep_MAJOR        104        //主设备号
#define Beep_High        1
#define Beep_Low      0

static int My_Beep_open(struct inode *inode,struct file *file)
{
    s3c2410_gpio_cfgpin(S3C2410_GPG14,S3C2410_GPG14_OUTP);//配置GPG14为输出功能   
    printk("My_Beep  open\n");
    return 0;
}

static int My_Beep_ioctl(struct inode * inode, struct file * file,unsigned int cmd)
{
    switch(cmd)
    {
       case Beep_High:
            s3c2410_gpio_setpin(S3C2410_GPG14, 1);//设置GPG14引脚为输出电平为1
            return 0;
       case Beep_Low:
            s3c2410_gpio_setpin(S3C2410_GPG14, 0);//设置GPG14引脚为输出电平为0
            return 0;
    default:
    return  -1;
    }
}

//定义文件操作 file_operations
static struct file_operations My_Beep_fops =
{
  .owner = THIS_MODULE,
  .open = My_Beep_open,
  .ioctl = My_Beep_ioctl,
};


static struct class *Beep_class;

static int __init My_Beep_init(void)
{
   int ret;
   printk("My_Beep start\n");

   //注册字符设备驱动程序
   //参数为主设备号、设备名字、file_operations结构
   //这样主设备号就与file_operations联系起来
   ret = register_chrdev(Beep_MAJOR, DEVICE_NAME, &My_Beep_fops);
   if(ret < 0)
   {
       printk("can't register major number\n");
       return ret;
   }

   //注册一个类,使mdev可以在"/dev/目录下建立设备节点"
   Beep_class = class_create(THIS_MODULE, DEVICE_NAME);
   if(IS_ERR(Beep_class))
   {
      printk("failed in My_Beep class.\n");
      return -1;
   }
   device_create(Beep_class, NULL, MKDEV(Beep_MAJOR,0), NULL, DEVICE_NAME);
   printk(DEVICE_NAME "initialized\n");
   return 0;
}

static void __exit My_Beep_exit(void)
{
   unregister_chrdev(Beep_MAJOR, DEVICE_NAME);
   device_destroy(Beep_class, MKDEV(Beep_MAJOR,0));//注销设备节点
   class_destroy(Beep_class);//注销类
}

module_init(My_Beep_init);
module_exit(My_Beep_exit);

MODULE_LICENSE("GPL");

            源码分析:

        本驱动程序通过linux系统内核中对S3C2410 GPIO操作的函数来实现对GPG14引脚输出功能和引脚高低电平输出功能的配置。s3c2410_gpio_cfgpin(S3C2410_GPG14,S3C2410_GPG14_OUTP) 这行代码实现了配置GPG14为输出模式的功能。s3c2410_gpio_cfgpin这个函数定义在内核源码中的hardware.h头文件中,使用此函数需要包含头文件 #include<mach/hardware.h> ,S3C2410_GPG14是GPIO的编号,S3C2410_GPG14_OUTP是端口的功能,他们都定义在内核源码的regs-gpio.h头文件中,源码路径为 :arch/arm/mach-s3c2410/include/mach/regs-gpio.h ,打开源码来看下他们的定义:

      #define S3C2410_GPG14         S3C2410_GPIONO(S3C2410_GPIO_BANKG, 14)
      #define S3C2410_GPG14_INP     (0x00 << 28)
      #define S3C2410_GPG14_OUTP    (0x01 << 28)

      在源码中我们可以看到其实S3C2410_GPG14_OUTP就是一个二进制数,再打开S3C2440的芯片手册找到端口GPG14,如下图所示:

       

     可以知道,只要将GPG14的二进制位的29位和28位分别配置成0和1,这个端口便被设置成了输出模式,S3C2410_GPG14_OUTP就实现了二进制29位和28位的正确配置,所以他实现了对GPG14配置成输出模式的功能。

     s3c2410_gpio_setpin函数同样定义在hardware.h头文件中,此函数实现了对GPG14输出高低电平的功能。

     说到这干脆来系统整理下常用的S3C2410 GPIO的操作函数:

      在hardware.h文件(源码路径:arch/arm/mach-s3c2410/include/mach/hardware.h)中有:

       void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) //配置端口的GPIO的功能  

       其中pin为端口的编号,function为端口的功能。
       unsigned int s3c2410_gpio_getcfg(unsigned int pin)    //读取功能配置

      void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)    //配置上拉电阻

      unsigned int s3c2410_modify_misccr(unsigned int clr, unsigned int chg)  //杂项配置

      int s3c2410_gpio_getirq(unsigned int pin)  //给定端口,转换出IRQ号

      int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, unsigned int config);   //配置IRQ过滤使能与否

      void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)    //写数据到端口

      其中pin为端口的编号,to为你想要写进端口的数据。
      unsigned int s3c2410_gpio_getpin(unsigned int pin)    //从端口读数据

      3.Makefile文件:

obj-m:=My_Beep.o
CC=arm-linux-gcc
KERNELDIR=/usr/local/opt/EmbedSky/linux-2.6.30.4
PWD:=$(shell pwd)
default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

      4.驱动程序对应的上层应用程序源码My_Beep_Test.c

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>      
#include <sys/types.h>    
#include <sys/stat.h>  
#include <fcntl.h>    

int main()  
{  
    int fd,i,cmd=0;
    long t;      
    fd=open("/dev/My_Beep",0); 
    if (fd<0)  
    {  
        printf("open Beep_driver error");  
        exit(1);  
    }
    printf("please input t\n");
    scanf("%ld",&t);
    while(1)
    {
       switch(cmd)
       {
          case 0:
          printf("Beep Low \n");
          ioctl(fd,0); 
          for(i=0;i<t;++i);
          
          case 1:
          printf("Beep High \n");
          ioctl(fd,1); 
          for(i=0;i<t;++i);          
       }
    }  
    return 0;  
} 

             这个应用程序是我前面写的那篇《TQ2440上LED灯闪烁效果的驱动程序实现》里面的那个上层应用程序改编而来的, 比较简单, 运行程序时可以通过scanf("%ld",&t)来设置不同的t,从而实现高低电平之间的时间间隔的变化,最终实现蜂鸣器发出不同声音的功能,本人经过尝试发现只要t的值取得恰当,你甚至可以使蜂鸣器发出美妙的音乐出来 大笑

      


      




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TQ2440外接GPIO蜂鸣器驱动程序 的相关文章

  • Nvidia Xavier GPIO 输入输出 中断 PWM

    文章目录 前言Jetson GPIO安装可用引脚点亮LEDGPIO输出示例GPIO输入示例GPIO EventGPIO InterruptPWM微信公众号 前言 Nvidia Jetson AGX Xavier 硬件相关 这篇讲到Xavie
  • 使用 FreeRTOS 时使用 GPIO 监控 CPU 负载的正确方法?

    总目录链接 61 61 gt gt AutoSAR入门和实战系列总目录 总目录链接 61 61 gt gt AutoSAR BSW高阶配置系列总目录 文章目录 我想切换一些 GPIO 以监控 CPU 活动和 FreeRTOS 上下文 更具体
  • TX2/Xavier Linux GPIO 计算

    目录 Linux GPIO子系统TX2 Linux GPIO计算Xavier Linux GPIO计算参考用C快捷计算TX2 Linux GPIO用C快捷计算Xavier Linux GPIODebug微信公众号 Linux GPIO子系统
  • 通信方式梳理:GPIO,I2C,SPI,UART,USART,USB的区别

    GPIO xff0c I2C xff0c SPI xff0c UART xff0c USART xff0c USB的区别 1 简单区别 xff1a 1 xff09 GPIO xff08 General Purpose Input Outpu
  • Jetson Xavier gpio编程 (8)

    GPIO lines are attached to gpiochips Look in sys class gpio and you should see gpiochip240 248 and 288 I haven t yet det
  • GPIO

    一 什么是GPIO xff1f 首先应该理解什么是GPIO GPIO xff0c 英文全称为General Purpose IO ports xff0c 也就是通用IO口 在嵌入式系统中常常有数量众多 xff0c 但是结构却比较简单的外部设
  • GPIO模式

    开漏输出 只能输出低电平 xff0c 不能输出高电
  • 浅析TMS320F28035的GPIO模块

    目录 GPIO简介硬件电路软件代码总结 通用输入输出端口 General Purpose Input Output GPIO 几乎是学习包括DSP xff0c 单片机在内的微处理器的第一步 GPIO的功能包括基本的输入 xff0c 输出 x
  • 【树莓派】error: command ‘/usr/bin/arm-linux-gnueabihf-gcc‘ failed with exit code 1(已解决)

    输入以下命令 export CFLAGS fcommon pip3 install RPi GPIO 参考网址 https askubuntu com questions 1290037 error while installing rpi
  • GPIO模拟脉冲驱动步进电机

    引脚 PUL lt gt VCC 3 3v PUL lt gt PA6 DIR lt gt VCC 3 3v DIR lt gt PB12 ENA lt gt VCC 3 3v ENA lt gt PB15 按键 控制使能 PE6 控制方向
  • 【自我提高】树莓派GPIO的几种语言控制方法 C 篇

    使用C语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 C 语言下使用 wiringPi GPIO 进行编程 要安装 wiringPi pi raspberrypi sud
  • Raspberry Pi 上 ROS 服务器/客户端通过GPIO 驱动硬件

    ROS 服务 现在 想象一下你在你的电脑后面 你想从这个服务中获取天气 你 在你身边 被认为是客户端 在线天气服务是服务器 您将能够通过带有 URL 的 HTTP 请求访问服务器 将 HTTP URL 视为 ROS 服务 首先 您的计算机将
  • Python 按键和按键释放监听器

    我正在使用 python 代码控制一辆遥控玩具车 截至目前 代码如下 def getkey fd sys stdin fileno old termios tcgetattr fd new termios tcgetattr fd new
  • 如何设置虚拟 GPIO 环回

    我目前正在开发一个应该在 Net 中使用 gpio 引脚的程序 我想在虚拟 GPIO 引脚上测试我的程序 但我不知道该怎么做 我想做一个环回 将虚拟 GPIO 1 连接到另一个虚拟 GPIO 2 我已经对串口和 tty0tty 做了类似的事
  • Raspberry Pi RPi.GPIO 错误并带有威胁回调

    我被 Python 包中的 wait for edge 函数困住了RPi http sourceforge net p raspberry gpio python wiki Inputs 我为 GPIO 下降添加了多个事件检测 只要回调函数
  • Sphinx:如何排除自动模块中的导入?

    我有一个用 Python 编写的 Raspberry Pi 项目 它使用 RPi GPIO 模块 代码上的所有工作都是在 Windows 机器上完成的 其中 RPi GPIO 不会安装 每次我尝试运行 autodoc 时 它都会崩溃 说它无
  • 从内核模块向用户空间通知 GPIO 中断[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一段代码可以检测内核模块中的 GPIO 中断 现在 我正在寻找一种机制 在检测到来自内核模块的 gpio 中断时通知用户空间 任何与不同选项
  • Python使用sudo启动时找不到模块

    我有一个使用 Google Assistant 库的脚本 并且必须从那里导入一些模块 我发现这只适用于 Python 虚拟环境 这真的很奇怪 在同一个文件夹中 我有一个使用 GPIO 引脚并且必须使用 root 的脚本 它们相互交互 因此当
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • 如何将 boost::asio 与 Linux GPIO 结合使用

    我有一个单线程 Linux 应用程序 使用 boost asio 进行异步输入 输出 现在我需要扩展此应用程序以读取 GPIO 输入 sys class gpio gpioXX value 可以在边沿触发的 GPIO 输入上使用 boost

随机推荐

  • 字符编码详解

    相信很多程序员在面对 字符编码 这个问题时 xff0c 都曾困扰过 xff0c 甚至头疼不已 接着之前两篇博客 xff08 二进制文件和文本文件 文本文件换行符 xff09 xff0c 本文将对 字符编码 做一个全面而细致的剖析 xff0c
  • CentOS + Mongodb 搭建NodeBB [转载翻译]

    原文 xff1a https www kancloud cn a632079 nodebb cn 372108 服务器选用 64 位 CentOS xff0c MongoDB 现在只有64位版本 CentOS amp MongoDB 一 准
  • 国家气象局提供的天气预报接口(完整Json接口)

    国家气象局提供的天气预报接口主要有三个 xff0c 分别是 xff1a http www weather com cn data sk 101010100 html http www weather com cn data cityinfo
  • 数据结构题集(c语言版)严蔚敏答案pdf

    前言 xff1a 最近在学习数据结构 xff0c 在做习题的时候找答案费了一番力气 xff0c 好不容易找到了 xff0c 分享出来 xff0c 希望想学的人找得没那么累 图书目录 xff1a 第一篇 习题与学习指导 第0章 本篇提要与作业
  • ios swift uitextview如何应对键盘的遮挡

    参考http stackoverflow com questions 36405752 keyboard to move the view only if the textfield is hidden 1 继承 UITextViewDel
  • Android设备唯一标识符ID

    一 获取各种单一的设备标识方式 1 DEVICE ID 概念 xff1a 是区别移动设备的标志 xff0c 储存在移动设备中 xff0c 可用于监控被窃或无效的移动设备 优点 xff1a 根据不同的手机设备返回IMEI xff0c MEID
  • 关于Uview ui框架的使用

    uview源码 api 按照使用场景自定义修改 如果想要使用 uview的 Upload 组件的 手动上传功能 xff0c 突然发现最近的1 x版本不能用了 xff0c 所以 我想手动diy一下 Upload 部分的源码 xff0c 本人使
  • 关于node-sass装不上,项目运行不了把我搞崩溃一记

    由于之前手贱 xff0c 用电脑管家的软件管理 更新了一下nodejs的最新稳定版本 xff0c 好家伙 xff0c 最近一直在开发uniapp xff0c 因为是hbuild自带node sass的插件版本 xff0c 所以一直也没有影响
  • OpenGL---VS2010环境搭建

    参看 xff1a http www cppblog com doing5552 archive 2009 01 08 71532 html 1 安装GLUT工具包 http www opengl org resources librarie
  • C++两个类互相引用的解决方法

    问题描述 xff1a c 43 43 在使用过程中遇到两个类需要相互包含引用的问题 解决办法 xff1a 两个类的头文件之中 xff0c 选一个包含另一个类的头文件 xff0c 另一个头文件中采用class xff1b 的申明形式 xff0
  • VTK 3D图像显示

    目的 根据不同需求 xff0c 医学3D图像的显示方式有多种 xff0c 本篇先简单罗列3D图像的几种显示模式 xff0c 后续再进行详细补充 1 剂量模体和二维数据 体模原图 xff08 网络截图 xff09 xff1a 体模二维X射线影
  • 原版win7全新安装后无法通过windows update安装更新的解决办法.2023-03-07

    首先要确保网络畅通 系统时间设置正确 系统没有被病毒流氓程序等破坏 是一个正常完整的初始安装的系统 方法一 1 安装 Windows 更新客户端 kb3138612 kb3138612 Microsoft Update Catalog 2
  • xmind 8 pro Mac破解版(思维导图) 附xmind 8 序列号

    链接 https pan baidu com s 1tTKYuqCjGo WC2ns6tN54w 密码 1b1w 转载地址 小伙伴们XMind 8 pro Mac破解版 思维导图 最新版本v3 7 8中文破解版上线了 xff0c 本次的XM
  • 操作系统系列笔记(五) - 同步互斥, 信号量和管程

    同步互斥 背景 并发进程在多个进程间有资源共享 导致执行过程是不确定性和不可重现的 程序错误可能是间歇性发生 原子操作 是指一次不存在任何中断或失败的操作 操作系统需要利用同步机制 在并发执行的同时保证一些操作是原子操作 几个状态 互斥 一
  • compilation terminated. The terminal process terminated with exit code: 1头文件包含错误解决办法

    错误描述 xff1a d coding clanguage datastruct chapterone mian1 cpp 1 46 fatal error c1 h No such file or directory include 34
  • 实践支持HTTPS SSL的七牛云存储CDN

    最近 xff0c 听说七牛云存储CDN这货支持HTTPS SSL Godaddy SSL证书 xff0c 试用了一下 xff0c 简直发现了新大陆 刚开始设置好以后 xff0c 发现HTTPS下的网页并没有采用七牛的服务 xff0c 只是H
  • 超详细,多图,PVE安装以及简单设置教程(个人记录)

    前言 写这个的目的是因为本人健忘所以做个记录以便日后再折腾时查阅 本人笔拙如有选词 xff0c 错字 xff0c 语法 xff0c 标点错误请忽视 xff0c 大概率知道了也不会修改 xff0c 本人能看懂就好 内容仅适用于本人的使用环境
  • Visual Studio 编译时moc 某些头文件找不到,编译不过,解决办法

    Visual Studio 编译时moc 某些头文件找不到 xff0c 编译不过 xff0c 解决办法 主要是不同的VS版本提交时存在的差异造成的 需要把编译时moc不过的头文件先移除掉 xff0c 然后再添加回来 xff0c 再编译就能编
  • UITableViewController使用

    列表视图控制器 xff0c 用起来很方便 xff0c 不仅可以实现分组列表 xff0c 连tem都有很多定义好的样式 xff0c 使用时基本上不需要有大的自定义的部分 xff0c 这里做一些简单的尝试 1 新建MyTableViewCont
  • TQ2440外接GPIO蜂鸣器驱动程序

    本文通过TQ2440开发板上可外接的GPIO口GPG14连接蜂鸣器 xff0c 通过控制GPG14引脚的高低电平的输出和高低电平输出之间的时间间隔来使蜂鸣器发出不同的声音 1 打开S3C2440的底板原理图找到GPIO xff0c 如下图所