IMX257 BEEP驱动程序实现

发布时间:2024-08-15  

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');


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    三极管放大电路参数计算方法详解; 有时候去面试,偶尔会遇到一些考官喜欢考一些基础性的知识,其中三极管放大电路参数计算,是他们津津乐道的题目。在实际设计中,很少......
    一文详解无传感器PMSM 马达FOC控制算法详解;      PMSM应用 高效率和高可靠性 设计用于高性能伺服应用 可实现有1无位置编码器的运行方式 比ACIM体积更小、效率更高、重量更轻 采用......
    三种串口接收不定长数据方法详解; 方法1:串口接受数据,定时器来判断超时是否接受数据完成。 方法2:DMA接受+IDLE中断 实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式......
    详细图文剖析STM32单片机串口一键下载电路与操作方法;在此介绍STM32单片机串口一键下载电路与操作方法详解。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户......
    使用STM32定时器测量程序执行时间的方法详解;1.1 背景 在单片机的固件开发过程中,有的时候需要评估固件代码的执行性能,会对部分关键程序代码的执行时间进行测量。通常会用到的测量程序执行时间的方法......
    讲明白讲透彻。 谐波算法详解(附实验数据) 各位Fluke 430系列产品的福粉们发现了吗?福禄克公司十年磨一剑,推出的新一代电能质量分析仪Fluke 1770系列,仪器......
    机器视觉边缘检测算法详解;边缘检测相关算法的步骤如下: 1、滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。需要......
    电脑声卡常见的7大问题以及排查方法详解;  电脑没声音是电脑使用中常见的问题之一, 本文集中讲解了电脑声卡常见的7大问题,以及排查方法。   一、暴音问题   暴音是最常见的声卡问题了,在这......
    ModulaTIon,脉冲幅值调制)调制方式。直流变频模块的内部结构与交流变频模块基本相同,只增加了压缩机相位检测电路,这里不再介绍。如下图 所示,直流变频模块对压缩机的驱动方式有120°、 180°两种......
    更平稳。 让我们使用电机转矩产生的原理来考虑其原因。如图 2.2 所示,电机的理想驱动方法是根据弗莱明左手定则,使磁通量和线圈电流始终正交。这种驱动方法适用于所有电机类型。在直流有刷电机中,这是......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>