本文档介绍了在 iTOP-4418 开发板上用 PWM 控制蜂鸣器输出的测试历程,基于 QtE 系统。4418MCU 共提供了 5 路 PWM 输出,其中一路未引出,所以共有 4 路可用的 PWM 输出。
注意:本文档中提供的例程,没有注册设备和驱动,只是在驱动入口和出口函数中进行了配置。如果用户需要生成设备节点,则需要自行添加剩余部分,这部分可以参考 GPIO 操作的文档。
1 配置 IO
打开底板电路图,搜索“beep”,可以看到 beep 的网络名为“MCU_ISO7816_CLK”,如下图所示。

在核心板原理图,搜索该关键词“MCU_ISO7816_CLK”,可见其对应 PWM2,如下图所示。

所以,接下来我们便对 PWM2 进行操作。在下面的操作之前,我们需要配置内核,取消内核中 buzzer 的驱动,解除该驱动对蜂鸣器的占用,其目录如下图所示。

将该选项改为未选中状态,如下图所示。

接下来,编译烧写该内核镜像(boot.img)到开发板。再进行下面的操作即可。
2 编写驱动程序
在 linux 内核中有一个规律,Linux 内核开发者把通用的东西都总结出来,个性化的东西就留出接口,和 GPIO 驱动类似,PWM 驱动在内核中也提供了对应的接口函数,内核提供的接口函数声明在 include/linux/pwm.h 中。
//申请一个 PWM 资源
struct pwm_device *pwm_request(int pwm_id, const char *label);
//释放一个 PWM 资源
void pwm_free(struct pwm_device *pwm);
//配置 PWM
int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
//使能 PWM,duty_ns 为高电平所用时间,period_ns 整个周期为所用时间,单位为纳秒。
int pwm_enable(struct pwm_device *pwm);
//不使能 PWM
void pwm_disable(struct pwm_device *pwm);
根据以上这些,我们便可以编写一个简单的 pwm 输出程序,来控制蜂鸣器的频率。创建
名称为 4418x_pwm.c 的文件,程序代码如下所示。
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*pwm for this buzzer*/
struct pwm_device *pwm = NULL;
static int __init buzzer_init(void)
{
int ret;
printk(" check buzzer init.\n");
pwm = pwm_request(2, "buzzer");
if ( pwm == NULL ) {
printk("buzzer open error.\n");
}
//printk(KERN_EMERG "pwm_request %d ",pwm);
ret=pwm_config(pwm,100000,200000);//设置了 1000Hz 频率的声音
printk("pwm_config %d ",ret);
printk("pwm_config %d ",ret);
ret=pwm_enable(pwm);
printk("pwm_enable %d ",ret);
printk(KERN_EMERG "done2. \n") ;
return 0;
}
static void __exit buzzer_exit(void)
{
pwm_config(pwm,0,0); //关闭蜂鸣器输出
pwm_disable(pwm); // 关闭 pwm
pwm_free(pwm); // 释放 pwm 资源
}
module_init(buzzer_init);
module_exit(buzzer_exit);
MODULE_DESCRIPTION("pwm_buzzer driver");
MODULE_LICENSE("GPL");
2.2 编写 Makefile
接下来进行编写 Makefile 文件。
export ARCH=arm
obj-m += 4418x_pwm.o
KDIR := /home/topeet/4418/4G/20170914/android/kernel
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o modules.order *.ko *mod.c Module.symvers
脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。
obj-m += 4418x_pwm.o 表示编译的源文件为 4418x_pwm.c, 如果源文件名有变化,则需要修改成对应的文件名。
KDIR 参数指向对应的内核源码目录。作者的内核源码是在/home/topeet/4418/4G/20170914/android/kernel 目录下,用户要根据自己的具体情况来修改。
2.3 编译运行
首先设置环境变量,使其在编译时使用源码中的编译器。在源码目录中使用”cdkernel”进入 kernel 目录。然后使用命令“make menuconfig”打开内核缺省配置界面,如下图所示。

进入图中高亮的“General setup”,如下图所示。

可以看到图中高亮的文本,描述了当前源码使用的编译器为“arm-eabi-”,我们回到源码文件夹,使用命令“find ./ -name arm-eabi-*”,可以得到源码中编译器所在路径,如下图所示。

这样,源码编译器的绝对路径为源码所在路径加上上图中红框的路径,在本文中为“/home/topeet/4418/4G/20170914/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”,因为笔者是用 root 登录的,所以打开文件“/root/.bashrc”在里面添加这样一条内容,如下图所示。

接下来,我们便可以进行编译了。
将 Makefile 与 C 程序放在 Ubuntu 系统的同一目录。如下图所示。

在当前目录输入“make”开始编译,生成内核模块文件“ 4418x_pwm.ko”,如下图所示。

将该内核模块文件拷贝到开发板,接下来在超级终端使用命令“insmod4418x_pwm.ko”加载该模块,如下图所示。

模块加载成功,同时蜂鸣器响起高频声音。然后使用命令“rmmod 4418x_pwm”卸载该驱动,如下图所示。

此时,蜂鸣器停止播放高频声音,PWM 蜂鸣器测试例程到此结束。

迅为-4418开发板-驱动-PWM输出实验相关推荐

  1. 迅为iMX6UL开发板驱动-PWM测试方法

    平台:迅为iMX6UL开发板  说明:PWM 配置和测试方法 测试中不需要添加额外驱动,是基于系统用户态的 sysfs,可以使用命令来直接操作底层. 1 iMX6UL的PWM简介 打开 iMX6UL ...

  2. 迅为4418开发板邮票孔与连接器版本区别

    迅为4418开发板邮票孔与连接器版本区别 连接器版本 邮票孔版本 核心板类型 板对板连接器 邮票孔 尺寸 50mm*60mm PCB层数 6层PCB沉金设计 8层PCB沉金设计 高度 核心板连接器组合 ...

  3. android开发板功能,嵌入式开发-迅为4418开发板Android4.4.4实现ble功能

    ①.迅为4418开发板Android4.4.4实现ble功能: 在4418/android/device/nexell/drone2/device.mk中添加: frameworks/native/d ...

  4. 迅为iTOP-4412开发板-驱动-显卡支持HDMI_1080P分辨率

    文档介绍迅为 iTOP-4412开发板 显卡驱动通过修改之后,能够支持 HDMI 的 1080P 分辨率输 出. 请注意:本文档针对精英版和全能版,2018 年及以后迅为发布的内核源码,包含 Andr ...

  5. imx6 linux 时钟,迅为-iMX6开发板-驱动-实时时钟RTC以及Linux-c测试例程

    当Linux开发者谈论一个实时时钟,他们通常指的是某种能记录墙上时间,并且有备用电 池,以至于在系统关机的时候仍然可以工作的器件. Linux 有两个系列广泛兼容的用户空间 RTC 设备节点: /de ...

  6. 企业采购季选好开发板平台 迅为4418开发板

    工欲善其事,必先利其器,在开发产品过程中,选购一套适合自身的开发板也是如此,能够让你在开发过程中事半功倍. 选择迅为iTOP-4418的理由: 1.作为重中之重的电源管理选型,经多方对比测试最终选用A ...

  7. 迅为4412开发板驱动-linux 开机 logo 的修改方法

    文档主要介绍 4412 开发板的内核启动 LOGO,请注意如果要修改的屏幕分辨率小于480x640,请参考另外的独立文档"iTOP-4412-内核-4.3 寸屏幕-logo 修改_V1.0& ...

  8. 迅为4418开发板Linux系统修改和固定MAC地址

    本文介绍如何修改 Qt 系统的 MAC 等网络参数,Qt 系统的修改方法和根文件系统一模一样,可以通用. 在将 Qt 系统或者根文件系统烧写到开发板之后,启动开发板,如下图所示,只需要修改这个配置文件 ...

  9. 迅为四核4418开发板MiniLinux-CAN总线测试使用文档

    文档介绍的是在 MiniLinux 系统环境下 iTOP-4418 CAN 实验调试步骤.提供了"can_libs.rar"."can_tools.zip"和& ...

  10. 迅为6818开发板资料-CAN总线和RFID驱动的配置方法

    硬件平台:迅为iTOP-6818开发板     本文档介绍如何配置 CAN 和 RFID 的驱动. 截图界面使用的是 6818 开发板的 menuconfig 界面,由于开发板中,CAN 和 RFID ...

最新文章

  1. C++11中weak_ptr的使用
  2. 28本实体书包邮免费送!年前替我领回家!
  3. DevOps笔记-01:软件交付面临的问题、软件工程的三个发展阶段、什么是DevOps?
  4. git 裁切_图片居中裁切.html
  5. 【备忘录】BADI_ACC_DOCUMENT增强实现
  6. 电影点评系统论文java_毕业设计(论文)-基于web的电影点评系统分析与设计.docx...
  7. 【java】StringBuilder的常用两种方法与练习
  8. 反射的妙用-类名方法名做参数进行方法调用实例demo
  9. [Web开发] 微软的RSS协议扩展 - FeedSync 介绍 (2)
  10. mysql 张三的语文成绩_八道 经典的 MYSQL 面试题目(有答案)
  11. jQuery 根据值或者文本选中select
  12. poj 2421 ConstructingRoads 最小生成树 Prim、Kruskal
  13. CSS3和jQuery实现的自定义美化Checkbox和Radiobox
  14. 应用内截屏的代码,在Activity中测试可用
  15. 数据结构 3优先队列(堆)
  16. [转载] 卷积神经网络做mnist数据集识别
  17. linux spdbv教程,计算机化学实践基础教程
  18. 免费小说网站源码 主题XSnov WordPress主题
  19. Termux基础教程(无编程基础动图展示版)
  20. 地图影像图数量存储大小精度推算

热门文章

  1. Maya vray 3S皮肤材质球设置与材质节点连接
  2. ro手游服务器维护公告,仙境传说ro手游9月26日5点至10点停服维护公告
  3. 软件包的依赖性关系定义
  4. 渐进符号与基本效率类型
  5. 黑客攻击_我如何开始黑客攻击
  6. centos lvm管理2t以上硬盘
  7. 实现60fps的网易云音乐首页
  8. 阿里云注册商标现身说法成功率打在公屏上
  9. FaceNet2ExpNet: Regularizing a Deep Face Recognition Net for Expression Recognition论文个人解读
  10. transition动画无效 iphone6