九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4490|回复: 0
打印 上一主题 下一主题

x4412&ibox项目实战26-使用udev设备文件系统创建蜂鸣器...

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-2 11:58:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
蜂鸣器电路和LED控制电路一样,只需GPIO的高低电平控制就可以了。对应电路图如下:


       XpwmTOUT1为高电平时,三极管Q1导通,蜂鸣器鸣叫。反之,三极管Q1将截止,蜂鸣器停止蜂鸣。
       可以完全模仿前面的LED驱动程序,将控制XpwmTOUT1口的功能封装到sysfs设备文件系统。
       默认已经将蜂鸣器驱动放在kernel/drivers/char/beep目录,为了源码更加统一,将它全部移到kernel/drivers/char/x4412目录。
       删掉kernel/drivers/char/beep目录,同时删掉kernel/drivers/char/Kconfig中的如下语句:
  1. source "drivers/char/beep/Kconfig"
复制代码
       删掉kernel/drivers/char/Makefile中的如下语句:
  1. obj-y                             += beep/
复制代码
在kernel/drivers/char/x4412目录下新建x4412-beep.c文件,编辑内容如下:
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/platform_device.h>
  4. #include <linux/gpio.h>
  5. #include <plat/gpio-cfg.h>

  6. /*
  7. * BEEP -> PWM1 -> GPD0(1)
  8. */
  9. static int __x4412_beep_status = 0;
  10. static void __x4412_beep_probe(void)
  11. {
  12.          int ret;

  13.          ret = gpio_request(EXYNOS4_GPD0(1), "GPD0(1)");
  14.          if(ret)
  15.                    printk("x4412-beep: request gpio GPD0(1) fail\n");
  16.          s3c_gpio_setpull(EXYNOS4_GPD0(1), S3C_GPIO_PULL_UP);
  17.          s3c_gpio_cfgpin(EXYNOS4_GPD0(1), S3C_GPIO_SFN(1));
  18.          gpio_set_value(EXYNOS4_GPD0(1), 0);
  19.          __x4412_beep_status = 0;
  20. }

  21. static void __x4412_beep_remove(void)
  22. {
  23.          gpio_free(EXYNOS4_GPD0(1));
  24. }
  25. static ssize_t x4412_beep_read(struct device *dev, struct device_attribute *attr, char *buf)
  26. {
  27.          if(!strcmp(attr->attr.name, "state"))
  28.          {
  29.                    if(__x4412_beep_status != 0)
  30.                             return strlcpy(buf, "1\n", 3);
  31.                    else
  32.                             return strlcpy(buf, "0\n", 3);
  33.          }
  34.          return strlcpy(buf, "\n", 3);
  35. }

  36. static ssize_t x4412_beep_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  37. {
  38.          unsigned long on = simple_strtoul(buf, NULL, 10);

  39.          if(!strcmp(attr->attr.name, "state"))
  40.          {
  41.                    if(on)
  42.                    {
  43.                             gpio_set_value(EXYNOS4_GPD0(1), 1);
  44.                             __x4412_beep_status = 1;
  45.                    }
  46.                    else
  47.                    {
  48.                             gpio_set_value(EXYNOS4_GPD0(1), 0);
  49.                             __x4412_beep_status = 0;
  50.                    }
  51.          }

  52.          return count;
  53. }

  54. static DEVICE_ATTR(state, 0666, x4412_beep_read, x4412_beep_write);

  55. static struct attribute * x4412_beep_sysfs_entries[] = {
  56.          &dev_attr_state.attr,
  57.          NULL,
  58. };

  59. static struct attribute_group x4412_beep_attr_group = {
  60.          .name         = NULL,
  61.          .attrs  = x4412_beep_sysfs_entries,
  62. };

  63. static int x4412_beep_probe(struct platform_device *pdev)
  64. {
  65.          __x4412_beep_probe();

  66.          return sysfs_create_group(&pdev->dev.kobj, &x4412_beep_attr_group);
  67. }

  68. static int x4412_beep_remove(struct platform_device *pdev)
  69. {
  70.          __x4412_beep_remove();

  71.          sysfs_remove_group(&pdev->dev.kobj, &x4412_beep_attr_group);
  72.          return 0;
  73. }

  74. #define x4412_beep_suspend         NULL
  75. #define x4412_beep_resume NULL

  76. static struct platform_driver x4412_beep_driver = {
  77.          .probe                  = x4412_beep_probe,
  78.          .remove               = x4412_beep_remove,
  79.          .suspend     = x4412_beep_suspend,
  80.          .resume                = x4412_beep_resume,
  81.          .driver                  = {
  82.                    .name         = "x4412-beep",
  83.          },
  84. };

  85. static struct platform_device x4412_beep_device = {
  86.          .name      = "x4412-beep",
  87.          .id        = -1,
  88. };

  89. static int __devinit x4412_beep_init(void)
  90. {
  91.          int ret;

  92.          printk("x4412 beep driver\r\n");

  93.          ret = platform_device_register(&x4412_beep_device);
  94.          if(ret)
  95.                    printk("failed to register x4412 beep device\n");

  96.          ret = platform_driver_register(&x4412_beep_driver);
  97.          if(ret)
  98.                    printk("failed to register x4412 beep driver\n");

  99.          return ret;
  100. }

  101. static void x4412_beep_exit(void)
  102. {
  103.          platform_driver_unregister(&x4412_beep_driver);
  104. }

  105. module_init(x4412_beep_init);
  106. module_exit(x4412_beep_exit);

  107. MODULE_LICENSE("GPL");
  108. MODULE_AUTHOR("www.9tripod.com");
  109. MODULE_DESCRIPTION("x4412 beep driver");
复制代码
       编辑kernel/drivers/char/x4412/Kconfig文件,添加如下内容:
  1. config X4412_BEEP_DRIVER
  2.          tristate "x4412 beep driver"
  3.          default y
  4.          help
  5.          compile for x4412 beep driver,y for kernel,m for module.
复制代码
       编辑kernel/drivers/char/x4412/Makefile文件,添加如下内容:
  1. obj-$(CONFIG_X4412_LED_SYSFS_DRIVER) += x4412-beep.o
复制代码
       编译源码后更新内核映像,使用如下指令即可打开和关闭蜂鸣器了:
  1. echo  1  >  state
  2. echo  0  >  state
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-23 15:09 , Processed in 0.018398 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表