PX30驱动input子系统实现pwm及gpio控制

本文介绍了如何在PX30平台上通过修改设备树,实现GPIO和PWM对蜂鸣器的控制。首先,在设备树中添加GPIO和PWM节点,然后在内核驱动中进行编译配置。最后,编写应用程序测试代码,通过input系统发送事件来控制蜂鸣器的开关和频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PX30驱动input子系统实现pwm及gpio控制

1、修改设备树

在SDK/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10-linux.dts中,在‘/’目录下添加节点(以峰鸣器控制为例)。

gpio:

       beeper {

              compatible = "gpio-beeper";

              status = "okay";

              gpios =<&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;  //buzeer连接在gpio2_PB5高电平有效

       };

pwm:

       beeper {

              compatible = "pwm-beeper";

              status = "okay";

              pinctrl-names = "default";

              pinctrl-0 = <&pwm2_pin>;      

       };

       pwm2 {

              pwm2_pin: pwm2-pin {

                     rockchip,pins =

                            <2 RK_PB5 RK_FUNC_1 &pcfg_pull_none>;  //复用为pwm

              };

       };

设备树匹配分别在SDK/kernel/drivers/input/misc/pwm-beeper.c和SDK/kernel/drivers/input/misc/gpio-beeper.c

gpio:

pwm:

2、将驱动编译进内核

在SDK/kernel/drivers/input/misc目录下找到Kconfig以及Makefile文件,添加修改

(1)Kconfig文件使能模块

gpio:

pwm:

 

(2)Makefile添加编译

编译启动生成input/event节点

 

3、根据驱动及input系统属性编写应用测试

#include<stdint.h>

#include<string.h>

#include<fcntl.h>

#include<unistd.h>

#include<stdio.h>

#include<linux/input.h>

#include<unistd.h>

int main(int argc, char **argv)

{

       struct input_event beep_evn;

       int fd;

       char *file_name=argv[1];

      

       fd = open(file_name,O_RDWR);

       if(fd<0)

       {

              printf("%s filed\n",argv[1]);

              return 0;

       }

      

       beep_evn.type = EV_SND;//gpio控制模式

       beep_evn.code = SND_BELL;//gpio控制模式

      

      

       beep_evn.type = EV_SND; //pwm控制模式

       beep_evn.code = SND_TONE;//pwm控制模式

       beep_evn.value = 2000; //pwm频率

       while(1)

       {

              beep_evn.value =1;  //gpio控制模式

              write(fd,&beep_evn,sizeof(struct input_event));

              printf("beep_evn.value = %d\n",beep_evn.value);

              sleep(2);

              beep_evn.value = 0;

              write(fd,&beep_evn,sizeof(struct input_event));

              printf("beep_evn.value = %d\n",beep_evn.value);

              sleep(3);

       }

       close(fd);

       return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值