IMX257 BEEP驱动程序实现

发布者:superstar10最新更新时间:2024-08-15 来源: cnblogs关键字:BEEP  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

1.确定相关寄存器基址

 

确定IOMUX地址 0x43fa_c000 0x43fa_ffff

 

GPIO1的地址 0x53fc_c000 0x53fc_ffff

MUX_CTL寄存器偏移地址 0x011c

PAD-CTL 寄存器偏移 0x0314

GPIO寄存器偏移地址

 

2.编译测试

本驱动程序亲测成功:


附上驱动程序代码:


  1 #include

  2 #include

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8 #include

  9 #include

 10 #include

 11 #include

 12 #include

 13 #include

 14 

 15 #define Driver_NAME 'beep_dev'

 16 #define DEVICE_NAME 'beep_dev'

 17 

 18 static int major = 0;

 19 

 20 //auto to create device node

 21 static struct class *drv_class = NULL;

 22 static struct class_device *drv_class_dev = NULL;

 23 

 24 //beep

 25 //寄存器基址;

 26 static unsigned long mem_iomux;

 27 static unsigned long mem_gpio1;

 28 static unsigned long base_iomux;      //iomux基址 0X 43FA C000 -  0X 43FA FFFF

 29 static unsigned long base_gpio1;    //gpio3      0X 53FC C000 -  0X 53FC FFFF

 30 // MUX_CTL模式选择  配置寄存器

 31 #define MUX_CTL  (*(volatile unsigned long *)(base_iomux + 0x011c))

 32 // PAD_CTL GPIO常用功能设置

 33 #define PAD_CTL  (*(volatile unsigned long *)(base_iomux + 0x0314))

 34 // GPIO DR   数据寄存器  DR

 35 #define DR_GPIO1 (*(volatile unsigned long *)(base_gpio1 + 0x0000))

 36 // GPIO GDIR 方向控制寄存器  GDIR

 37 #define GDIR_GPIO1 (*(volatile unsigned long *)(base_gpio1 + 0x0004))

 38 

 39 

 40 static int key_open(struct inode *inode, struct file *file)

 41 {

 42     printk('<0>function open!nn');

 43     return 0;

 44 }

 45 

 46 static int key_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

 47 {

 48     return 0;

 49 }

 50 

 51 static ssize_t key_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

 52 {

 53     printk('<0>function write!nn');

 54     return 1;

 55 }

 56 

 57 static int  key_release(struct inode *inode, struct file *filp)

 58 {

 59     printk('<0>function write!nn');

 60     return 0;

 61 }

 62 

 63 static int key_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg)

 64 {

 65     printk('<0>function ioctl!nn');

 66     return 0;

 67 }

 68 static struct file_operations key_fops = {

 69     .owner  =   THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */

 70     .open   =   key_open,

 71     .read   =   key_read,

 72     .write  =   key_write,

 73     .release=   key_release,

 74     .ioctl  =   key_ioctl,

 75 };

 76 

 77 void gpio_addr(void){

 78     printk('<0>addr base_iomux : %x n',base_iomux);

 79     printk('<0>addr base_gpio1 : %x n',base_gpio1);

 80     printk('<0>addr MUX_CTL : %x n',&MUX_CTL);

 81     printk('<0>addr PAD_CTL : %x n',&PAD_CTL);

 82     printk('<0>addr GDIR_GPIO1 : %x n',&GDIR_GPIO1);

 83     printk('<0>addr DR_GPIO1 : %x n',&DR_GPIO1);

 84 }

 85 

 86 void beep_on_off(void){

 87     ssleep(1);

 88     DR_GPIO1 |= (0x01 << 26);        //将GPIO1_26置1

 89     ssleep(1);

 90     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

 91     ssleep(1);

 92     DR_GPIO1 |= (0x01 << 26);        //将GPIO1_26置1

 93     ssleep(1);

 94     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

 95     ssleep(1);

 96     DR_GPIO1 |= (0x01 << 26);        //将GPIO1_26置1

 97     ssleep(1);

 98     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

 99     ssleep(1);

100     DR_GPIO1 |= (0x01 << 26);        //将GPIO1_26置1

101     ssleep(1);

102     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

103     ssleep(1);

104     DR_GPIO1 |= (0x01 << 26);        //将GPIO1_26置1

105     ssleep(1);

106     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

107 }

108 

109 static int __init  key_irq_init(void)

110 {

111     printk('<0>nHello,this is %s module!nn',Driver_NAME);

112     //register and mknod

113     major = register_chrdev(0,Driver_NAME,&key_fops);

114     drv_class = class_create(THIS_MODULE,Driver_NAME);

115     drv_class_dev = device_create(drv_class,NULL,MKDEV(major,0),NULL,DEVICE_NAME);  /*/dev/key_query*/

116     

117     //IO端口申请 ioremap  可以直接通过指针来访问这些地址

118     base_iomux = ioremap(0x43FAC000,0xFFF);

119     base_gpio1 = ioremap(0x53FCC000,0xFFF);

120 

121     //MUX_CTL

122     MUX_CTL &= ~(0x07 << 0);    

123     MUX_CTL |= (0X05 << 0);    //设置为ALT5  GPIO1_26 BEEP

124     //PAD_CTL

125     PAD_CTL &= ~(0x01<<13 | 0x01<<3 | 0x03<<1 | 0x01<<0);   //1.8v 不需要上拉下拉  CMOS输出 slew rate

126     //GDIR_GPIO1    配置为输出模式

127     GDIR_GPIO1 &= ~(0x01 << 26);    

128     GDIR_GPIO1 |= (0x01 << 26);    //配置为输出模式    

129 

130     //DR_GPIO1        配置为输出0 点亮ERR_LED

131     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

132     DR_GPIO1 &= ~(0x01 << 26);        //将GPIO1_26清零

133     gpio_addr();

134     beep_on_off();

135     return 0; 

136 }

137                      

138 static void __exit key_irq_exit(void)

139 {

140     gpio_addr();

141     printk('<0>nGoodbye,%s!nn',Driver_NAME);

142     beep_on_off();

143 

144        unregister_chrdev(major,Driver_NAME);

145     device_unregister(drv_class_dev);

146     class_destroy(drv_class);

147     

148     //释放IO端口

149     iounmap(base_iomux);

150     iounmap(base_gpio1);

151 }

152 

153 

154 /* 这两行指定驱动程序的初始化函数和卸载函数 */

155 module_init(key_irq_init);

156 module_exit(key_irq_exit);

157 

158 /* 描述驱动程序的一些信息,不是必须的 */

159 MODULE_AUTHOR('Lover雪儿');

160 MODULE_VERSION('0.1.0');

161 MODULE_DESCRIPTION('IMX257 key Driver');

162 MODULE_LICENSE('GPL');


关键字:BEEP  驱动程序 引用地址:IMX257 BEEP驱动程序实现

上一篇:IMX257 设备驱动模型之Kobject(一)
下一篇:IMX257 LED驱动程序实现

推荐阅读最新更新时间:2024-11-04 13:29

AURIX™嵌入式软件: 增强型MC-ISAR TC3xx MCAL增加了符合ASIL D和SIL-2标准的驱动程序
AURIX™嵌入式软件: 增强型MC-ISAR TC3xx MCAL增加了符合ASIL D和SIL-2标准的驱动程序,以支持AUTOSARv4.4.0 【2023 年 6 月 9 日,德国慕尼黑讯】英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)通过在现有的AUTOSARv4.2.2 MCAL基础上增加对AUTOSARv4.4.0的支持,进一步扩展其AURIX™ TC3xx MCAL。这将加快OEM厂商的软件开发。针对ASIL D应用,MC-ISAR TC3xx路线图已更新,以提供符合ASIL D标准的驱动程序。通过即将推出的维护版2.25.0,该驱动程序将包含符合ASIL D标准的软件产品。2.
[网络通信]
AURIX™嵌入式软件: 增强型MC-ISAR TC3xx MCAL增加了符合ASIL D和SIL-2标准的<font color='red'>驱动程序</font>
第五节:蜂鸣器的驱动程序
开场白: 上一节讲了利用累计定时中断次数实现LED灯闪烁,这个例子同时也第一次展示了我最完整的实战程序框架:用switch语句实现状态机,外加定时中断。这个框架看似简单,实际上就是那么简单。我做的所有开发项目都是基于这个简单框架,但是非常好用。上一节只有一个单任务的LED灯在闪烁,这节开始,我们多增加一个蜂鸣器报警的任务,要教会大家四个知识点: 第一点:蜂鸣器的驱动程序框架编写。 第二点:多任务处理的程序框架。 第三点:如何控制蜂鸣器声音的长叫和短叫。 第四点:如何知道1秒钟需要多少个定时中断,也就是如何按比例修正时间精度。 具体内容,请看源代码讲解。 (1)硬件平台:基于朱兆祺51单片机学习板。 (2)实
[单片机]
Windows9x/NT及2000下中断驱动程序的统一化处理
摘要: 针对Windows9x/NT及Windows2000操作系统,利用Windriver工具包,实现了在多种操作系统下对硬件中断驱动程序进行统一化处理,保证了程序在不同的操作系统下良好的移植性矣兼容性,并给出了用C语言编写的程序实例。 关键词: Windows9x/NT/2000 虚拟设备驱动程序(VxD) Windriver工具包 中断驱动程序的统一化处理 Windows以其友好的图形用户界面,使得它不仅成为办公管理首选的操作系统,也日益受到工程技术人员的关注,逐渐取代DOS而成为主流的工程应用控制平台。但是,Windows系统为了保证平台的安全与完
[嵌入式]
基于MEGA16的LCD1602驱动程序(四位数据线)
//编译器:ICC-AVR v6.31A //目标芯片 : M16 //时钟: 8.0000MHz /*------------------------------------------------------------- LCD引脚定义 1---GND 2---VCC 3---VO 4---RS 5---RW 6---EN 7到14--D0-D7 15--背景灯+ 16--背景灯- -----------------------------------------------------------------*/ #include #include /*--------------------------------
[单片机]
温湿度传感器sht20 STC15单片机驱动程序
温湿度传感器sht20驱动程序,IIC通讯,非常实用的C51驱动程序 单片机源程序如下: #include STC15W4K32S4.h #include intrins.h #include sht20.h #include delay.h #define uchar unsigned char #define uint unsigned int // 测量分辨率 RH 12BIT、T 14BIT,测量时间RH 29ms、T 85ms // 测量分辨率 RH 8BIT、T 12BIT,测量时间RH 4ms、T 22ms // SCL 时钟,延时2us sbit sda=P1^3; //数据线
[单片机]
linux驱动程序之电源管理之标准linux休眠和唤醒机制分析(二)
三、pm_test属性文件读写 int pm_test_level = TEST_NONE; static const char * const pm_tests = { = none , = core , = processors , = platform , = devices , = freezer , }; // core processors platform devices freezer, 控制范围示意 cat pm_test的时候最终会调用函数pm_test_show(),在终端上打印出上面数组中的字符串,当前的模式用 表示出来。 echo d
[单片机]
单总线驱动程序(DS18B20)
sbit DQ=P3^7; //DS18B20数据传输线接单片机的相应的引脚 void delaymm(uint z) { uint x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } //向DS18B20读一字节数据 ,从低位开始读 ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for (i=8;i 0;i--) { DQ=1; delay(1); DQ=0;
[单片机]
使用ROS1驱动程序来操控ADI Trinamic电机控制器
摘要 “实现机器人操作系统——电机控制器ROS1驱动程序简介”一文中概述了新型ADI Trinamic™电机控制器(TMC)驱动程序,并讨论了将电机控制器集成到机器人操作系统(ROS)生态系统中的方法。TMC ROS1驱动程序支持TMC驱动层和应用层之间在ROS框架内无缝通信,且适用于它支持的各种TMC板。本文将深入探讨TMC ROS1驱动程序的功能,包括电机控制、信息检索、命令执行、参数获取以及对多种设置的支持。文中还概述了如何将电机控制器集成到嵌入式系统和应用中,从而利用ROS框架提供的优势。 ADI Trinamic电机控制器ROS1驱动程序 ROS是一个机器人系统中间层,包含一组软件库和强大的开发工具,从驱动
[工业控制]
使用ROS1<font color='red'>驱动程序</font>来操控ADI Trinamic电机控制器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved