Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41879
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-30 10:34
文章分类
文章存档

2014年(42)

我的朋友

分类: LINUX

2014-11-19 19:06:47

蜂鸣器驱动基于PWM0(timer0),使用GPB0这个IO口控制,通用的驱动文件为:drivers/input/misc/pwm-beeper.c,它属于input设备。

发声原理:PWM输出的占空比保持不变(50%),改变PWM频率即可改变发声频率

在mach-xc2440.c中添加蜂鸣器驱动的支持:

在xc2440_devices[ ]结构体中加入:
&xc2440_beeper_device,

构建蜂鸣器设备的platform_device结构体:
  1. /* Buzzer */
  2. static struct platform_device xc2440_beeper_device = {
  3.     .name = "pwm-beeper",
  4.     .dev = {
  5.         .parent = &s3c_device_timer[0].dev,
  6.         .platform_data = 0,
  7.     },
  8.     .id = 0,
  9. };

修改drivers/input/misc/pwm-beeper.c驱动文件,在pwm_beeper_event函数中加入控制PWM频率的操作:
  1. static void xc2440_beeper_enable(void)
  2. {
  3.     gpio_request(S3C2410_GPB(0), "beeper");
  4.     s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE);
  5.     s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);
  6. }

  7. static void xc2440_beeper_disable(void)
  8. {
  9.     s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_INPUT);
  10. }

  11. static int pwm_beeper_event(struct input_dev *input,
  12.              unsigned int type, unsigned int code, int value)
  13. {
  14.     int ret = 0;
  15.     struct pwm_beeper *beeper = input_get_drvdata(input);
  16.     unsigned long period;

  17.     if (type != EV_SND || value < 0)
  18.         return -EINVAL;

  19.     switch (code) {
  20.     case SND_BELL:
  21.         value = value ? 1000 : 0;
  22.         break;
  23.     case SND_TONE:
  24.         break;
  25.     default:
  26.         return -EINVAL;
  27.     }

  28.     if (value == 0) {
  29.         //pwm_config(beeper->pwm, 0, 0);
  30.         pwm_disable(beeper->pwm);
  31.         xc2440_beeper_disable();
  32.     } else {
  33.         xc2440_beeper_enable();
  34.         period = HZ_TO_NANOSECONDS(value);
  35.         ret = pwm_config(beeper->pwm, period / 2, period);
  36.         if (ret)
  37.             return ret;
  38.         ret = pwm_enable(beeper->pwm);
  39.         if (ret)
  40.             return ret;
  41.         beeper->period = period;
  42.     }

  43.     return 0;
  44. }

查看drivers/input/misc目录下的Kconfig文件中定义了pwm beeper的配置:
  1. config INPUT_PWM_BEEPER
  2.     tristate "PWM beeper support"
  3.     depends on HAVE_PWM

配置内核,支持按键PWM驱动:
  1. Device Drivers --->
  2.     Input device support --->
  3.           [*]Miscellaneous devices --->
  4.                  <*>PWM beeper support

内核启动输出:
input: pwm-beeper as 
/devices/platform/s3c24xx-pwm.0/pwm-beeper.0/input/input2

查看设备:
/dev/event2

应用程序使用input_event来操作

阅读(147) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~