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蜂鸣器驱动程序 的相关文章

  • GPIO实验

    一 GPIO简介 GPIO xff08 General purpose input output xff09 即通用型输入输出 xff0c GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连 xff0c 从而实
  • 【STM32】GPIO_InitTypeDef GPIO_InitStructure;语句的理解

    这句话声明一个结构体 xff0c 名字是GPIO InitStructure xff0c 结构体原型由GPIO InitTypeDef 确定 xff0c 在stm32中用来初始化GPIO 设置完GPIO InitStructure里面的内容
  • 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
  • GD32VF103之GPIO最小配置

    longan nano是Sipeed xff08 矽速科技 xff09 推出的开发板 xff0c 使用兆易创新的gd32vf103cbt6芯片 xff0c 该芯片是基于芯来科技的Nuclei Bumblebee处理器的32位通用微控制器 x
  • 28335之GPIO输入

    include 34 DSP2833x Device h 34 include 34 DSP2833x Examples h 34 define LED GpioDataRegs GPADAT bit GPIO0 GPIO配置函数 void
  • jetson nano GPIO控制说明

    文章目录 一 GPIO介绍二 安装GPIO库python库C 43 43 库 三 几种常用的通信协议UARTPWMI2CI2SSPI 四 控制函数说明python xff08 参考 https pypi org project Jetson
  • 浅析TMS320F28035的GPIO模块

    目录 GPIO简介硬件电路软件代码总结 通用输入输出端口 General Purpose Input Output GPIO 几乎是学习包括DSP xff0c 单片机在内的微处理器的第一步 GPIO的功能包括基本的输入 xff0c 输出 x
  • void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解

    GPIO TypeDef GPIOA BASE 表示将GPIOA BASE强制转换为指针类型的结构体 xff0c define GPIOA GPIO TypeDef GPIOA BASE 表示用 GPIO TypeDef GPIOA BAS
  • linux用户态使用gpio中断方法

    一 用户空间gpio的调用文件 用户空间访问gpio 即通过sysfs接口访问gpio 下面是 sys class gpio目录下的三种文件 export unexport文件 gpioN指代具体的gpio引脚 gpio chipN指代gp
  • GPIO的速度的理解

    一 GPIO模式配置 1 输入 输出模式 参考stm32手册 2 GPIO输出模式下 几种速度的区别 1 GPIO 引脚速度 GPIO Speed 2MHz 10MHz 50MHz 又称输出驱动电路的响应速度 芯片内部在I O口的输出部分安
  • AIR103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方社区库接口GPIO库使用及示例进行复现及分析 了解该的基本原理及操作方法 软件及工具版本 LuatOS AIR103 b
  • 关于stm32的GPIO的操作

    首先先了解一下输出的模式 比较常用的是 推挽输出 1 GPIO Mode AIN 模拟输入 2 GPIO Mode IN FLOATING 浮空输入 3 GPIO Mode IPD 下拉输入 4 GPIO Mode IPU 上拉输入 5 G
  • Linux的GPIO子系统解析 ( 一 ) 之 gpiolib.c

    文章目录 Linux的GPIO子系统解析 一 之 gpiolib c 绪论 关于GPIO子系统库文件的gpiolib c解析 drivers gpio gpiolib c gpio desc结构体 gpio chip结构体 gpio ens
  • 零基础玩转树莓派(四)—GPIO端口控制(LED灯)

    一 GPIO介绍 树莓派3B 和普通电脑不一样的地方在于它还带了40个可编程的GPIO General Purpose Input Output 可以用来驱动各种外设 如传感器 步进电机等 GPIO General Purpose I O
  • wiringPi引脚编号方式

    树莓派引出的20 2排针引脚 引脚定义使用gpio readall命令查看 如下 可以看到wiringpi库有三种引脚编号方式 分别为 BCM编号方式 就是使用芯片的GPIO引脚编号 wiringpi库编号方式 使用wiringpi库自己规
  • TQ2440移植u-boot2016.11全过程记录-【5】设置从NOR FLASH启动U-BOOT

    TQ2440移植u boot2016 11 设置从NOR FLASH启动u boot gedit include configs tq2440 h 屏蔽掉宏CONFIG SKIP LOWLEVEL INIT 修改宏CONFIG SYS TE
  • 学习笔记:STM32的ACD

    STM32f103系列有3个ADC ADC1 ADC2 ADC3 通道 ADC1和ADC2都有16个外部通道 2个内部通道 连接到温度传感器和内部参考电压 VREFINT 1 2V ADC3有8个外部通道 通道列表 通道顺序转换 使用多个通
  • 使用多个线程多次调用一个方法

    我想要一个 LED 闪烁 同时我的 Raspberry 上正在做一些工作 我在 Python 脚本中使用 LED 线程 初始代码 import RPi GPIO import time import threading pinLED 10
  • 如何为连接到 I2C gpio 扩展器的虚拟 mdio-gpio 设备配置 ACPI *.asl

    我正在使用 Q7 模块 x86 并尝试在 Linux 上使用 ACPI SSDT Overlay 配置我们的外设 但我对此很挣扎 我想我误解了ACPI的一些核心概念 Problem CPU gt I2C gt PCA9575 GPIO Ex
  • 对 FINTEK F81866A 芯片组上的 GPIO 引脚进行编程

    我有一个德承DE 1000 http www cincoze com goods info php id 10工业 PC 具有芬泰克 F81866A http www fintek com tw index php i o controll

随机推荐

  • 字符编码详解

    相信很多程序员在面对 字符编码 这个问题时 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 如下图所