在线问答
直播中

罗崇军

9年用户 168经验值
擅长:嵌入式技术 接口/总线/驱动
私信 关注

【OK210试用体验】之beep驱动

暑假最后几天,回了一趟家,有一段时间没发帖了,今天写了项目的beep驱动,拿出来与大家分享。有段时间没弄了,写过简单的给自己醒醒脑。
                硬件平台:OK210;
                os :Linux2.6.35.7
                驱动类型:beep
驱动程序如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include

  11. #define BEEP_ON                (0x10007)
  12. #define BEEP_OFF        (0x10008)

  13. static int major;
  14. static struct class *beep_class;
  15. static unsigned long *gpio_con;
  16. static unsigned long *gpio_data;
  17. static int pin;

  18. static struct resource beep_resources[] = {
  19.                 [0] = {
  20.                         .start        =        0xE02000A0,
  21.                         .end        =        0xE02000A8 - 1,
  22.                         .flags        =        IORESOURCE_MEM,
  23.                 },
  24.                 [1] = {
  25.                         .start        =        1,
  26.                         .end        =        1,
  27.                         .flags        =        IORESOURCE_IRQ,
  28.                 },
  29. };

  30. static void beep_release(struct device *dev)
  31. {
  32.     printk("%sn", __func__);
  33. }

  34. static struct platform_device beep_device = {
  35.         .name                        =        "tpad_beep",
  36.         .num_resources        =        ARRAY_SIZE(beep_resources),
  37.         .resource                =        beep_resources,

  38.         .dev        = {
  39.             .release = beep_release,
  40.         }
  41. };

  42. static int beep_open(struct inode *inode, struct file *file)
  43. {
  44.         *gpio_con        &= ~(0xf << (pin * 4));
  45.         *gpio_con        |= (1 << (pin * 4));
  46.         return 0;
  47. }

  48. static int beep_close(struct inode *inode, struct file *file)
  49. {
  50.         return 0;
  51. }

  52. static int beep_ioctl(struct inode *inode, struct file *file,
  53.                                                 unsigned int cmd, unsigned long arg)
  54. {
  55.         switch (cmd) {
  56.                 case BEEP_ON:
  57.                                 *gpio_data        |= (1 << pin);
  58.                         break;
  59.                 case BEEP_OFF:
  60.                                 *gpio_data        &= ~(1 << pin);
  61.                         break;
  62.                 default:
  63.                         return -1;
  64.         };
  65.         return 0;
  66. }

  67. static struct file_operations beep_fops = {
  68.         .open                =        beep_open,
  69.         .release        =        beep_close,
  70.         .ioctl                =        beep_ioctl,
  71. };

  72. static int beep_probe(struct platform_device *dev)
  73. {
  74.         struct resource *res;
  75.        
  76.         major                =        register_chrdev(0, "beeps", &beep_fops);
  77.         beep_class         =         class_create(THIS_MODULE, "beeps");
  78.         device_create(beep_class, NULL, MKDEV(major, 0), NULL, "beeps");

  79.         res = platform_get_resource(dev, IORESOURCE_MEM, 0);

  80.         gpio_con = ioremap(res->start, res->end - res->start + 1);
  81.         gpio_data = gpio_con + 1;

  82.         res = platform_get_resource(dev, IORESOURCE_IRQ, 0);
  83.         pin = res->start;

  84.         return 0;
  85. }

  86. static int beep_remove(struct platform_device *dev)
  87. {
  88.         iounmap(gpio_con);
  89.         device_destroy(beep_class, MKDEV(major, 0));
  90.         class_destroy(beep_class);
  91.         unregister_chrdev(major, "beeps");
  92.    
  93.         return 0;
  94. }

  95. static struct platform_driver   beep_driver        = {
  96.         .probe        =        beep_probe,
  97.         .remove        =        beep_remove,
  98.         .driver        =        {
  99.                         .name        =        "tpad_beep",
  100.         },
  101. };

  102. static int beep_init(void)
  103. {
  104.         platform_device_register(&beep_device);
  105.         platform_driver_register(&beep_driver);
  106.         return 0;
  107. }

  108. static void beep_exit(void)
  109. {
  110.         platform_driver_unregister(&beep_driver);
  111.         platform_device_unregister(&beep_device);
  112. }

  113. module_init(beep_init);
  114. module_exit(beep_exit);
  115. MODULE_LICENSE("GPL");
makefile文件如下:
  1. all:
  2.         make -C $(SRC_PATH)/kernel M=`pwd` modules
  3.         cp beep_drv.ko $(SRC_PATH)/system/modules -av
  4. clean:
  5.         make -C $(SRC_PATH)/kernel M=`pwd` modules clean
  6.         rm -rf modules.order *.o *.ko *.mod.* Module*

  7. obj-m        += beep_drv.o
应用程序如下:
  1. #include
  2. #include
  3. #include
  4. #include

  5. #define BEEP_ON                (0x10007)
  6. #define BEEP_OFF        (0x10008)

  7. int main(int argc, char *argv[])
  8. {
  9.     int fd;

  10.     fd = open("/dev/beeps", O_RDWR);
  11.     if (fd < 0) {
  12.         printf("open beep errorn");
  13.         return -1;
  14.     }


  15.     while (1) {
  16.         ioctl(fd, BEEP_ON);
  17.         sleep(1);
  18.         ioctl(fd, BEEP_OFF);
  19.         sleep(1);
  20.     }
  21.     close(fd);
  22.     return 0;
  23. }

有段时间没写驱动了,手有点生,程序中难免有错误,还请各位大神海涵。



更多回帖

发帖
×
20
完善资料,
赚取积分