蜂鸣器驱动代码

驱动程序:beep_drv.c

[cpp]  view plain  copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.   
  6. static int beep_major = 0;  
  7. static struct class *pClass = NULL;  
  8. module_param(beep_major, int, 0);  
  9. MODULE_AUTHOR("woshishui");  
  10. MODULE_LICENSE("GPL");  
  11.   
  12. #define BEEP_MAGIC 'k'  
  13. #define BEEP_START_CMD _IO (BEEP_MAGIC, 1)  
  14. #define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2)  
  15.   
  16. /* 
  17.  * Open the device; in fact, there's nothing to do here. 
  18.  */  
  19. int beep_open (struct inode *inode, struct file *filp)  
  20. {  
  21.     return 0;  
  22. }  
  23.   
  24. ssize_t beep_read(struct file *file, char __user *buff, size_t count, loff_t *offp)  
  25. {  
  26.   
  27.     *buff = gpio_get_value(S5PV210_GPD0(0));//获取引脚的电平值  
  28.   
  29.     return 0;  
  30. }  
  31.   
  32. ssize_t beep_write(struct file *file, const char __user *buff, size_t count, loff_t *offp)  
  33. {  
  34.     return 0;  
  35. }  
  36.   
  37. void beep_stop( void )  
  38. {  
  39.     s3c_gpio_cfgpin(S5PV210_GPD0(0), S3C_GPIO_OUTPUT);//设置引进为输出状态  
  40.     s3c_gpio_setpull(S5PV210_GPD0(0), S3C_GPIO_PULL_NONE);//不设置上拉  
  41.     gpio_set_value(S5PV210_GPD0(0), 0);//设置引脚为低电平,即不要蜂鸣器响  
  42. }  
  43.   
  44. void beep_start( void )  
  45. {  
  46.     s3c_gpio_cfgpin(S5PV210_GPD0(0), S3C_GPIO_OUTPUT);  
  47.     s3c_gpio_setpull(S5PV210_GPD0(0), S3C_GPIO_PULL_NONE);  
  48.     gpio_set_value(S5PV210_GPD0(0), 1);//设置引脚为高电平,即要蜂鸣器响  
  49. }  
  50.   
  51. static int beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)  
  52. {  
  53.     switch ( cmd ) {  
  54.         case BEEP_START_CMD: {  
  55.             beep_start();   break;  
  56.         }  
  57.         case BEEP_STOP_CMD: {  
  58.             beep_stop();    break;  
  59.         }  
  60.         default: {  
  61.             break;  
  62.         }  
  63.     }  
  64.     return 0;  
  65. }  
  66.   
  67. static int beep_release(struct inode *node, struct file *file)  
  68. {  
  69.     return 0;  
  70. }  
  71.   
  72. /* 
  73.  * Our various sub-devices. 
  74.  */  
  75. /* Device 0 uses remap_pfn_range */  
  76. static struct file_operations beep_remap_ops = {  
  77.     .owner   = THIS_MODULE,  
  78.     .open    = beep_open,  
  79.     .release = beep_release,  
  80.     .read    = beep_read,  
  81.     .write   = beep_write,  
  82.     .ioctl   = beep_ioctl,    
  83. };  
  84.   
  85. /* 
  86.  * There's no need for us to maintain any 
  87.  * special housekeeping info, so we just deal with raw cdevs. 
  88.  */  
  89. static struct cdev BeepDevs;  
  90.   
  91. /* 
  92.  * Module housekeeping. 
  93.  */  
  94. static int beep_init(void)  
  95. {  
  96.     int result;  
  97.     dev_t dev = MKDEV(beep_major, 0);  
  98.       
  99.     s3c_gpio_cfgpin(S5PV210_GPD0(0), S3C_GPIO_OUTPUT);  
  100.     s3c_gpio_setpull(S5PV210_GPD0(0), S3C_GPIO_PULL_NONE);  
  101.     gpio_set_value(S5PV210_GPD0(0), 0);  
  102.   
  103.     /* Figure out our device number. */  
  104.     if (beep_major)  
  105.         result = register_chrdev_region(dev, 1, "beep");  
  106.     else {  
  107.         result = alloc_chrdev_region(&dev, 0, 1, "beep");  
  108.         beep_major = MAJOR(dev);  
  109.     }  
  110.     if (result < 0) {  
  111.         printk(KERN_WARNING "beep: unable to get major %d\n", beep_major);  
  112.         return result;  
  113.     }  
  114.     if (beep_major == 0)  
  115.         beep_major = result;  
  116.   
  117.     /* Register a class_device in the sysfs. */  
  118.     pClass = class_create(THIS_MODULE, "beep");//注册一个类,使mdev可以在"/dev/"目录下面建立设备节点,在设备中动态创建节点  
  119.     if(NULL == pClass)  
  120.     {  
  121.         unregister_chrdev_region(dev, 1);  
  122.         return -1;  
  123.     }  
  124.     device_create(pClass, NULL, dev, NULL, "beep");  
  125.     /* Now set up cdev. */  
  126.     cdev_init(&BeepDevs, &beep_remap_ops);  
  127.     BeepDevs.owner = THIS_MODULE;  
  128.     result = cdev_add (&BeepDevs, dev, 1);  
  129.     if(result != 0)  
  130.     {  
  131.         device_destroy(pClass, dev);  
  132.         class_destroy(pClass);  
  133.         unregister_chrdev_region(dev, 1);  
  134.         return -1;  
  135.     }  
  136.   
  137.     printk("beep device installed, with major %d\n", beep_major);  
  138.     return 0;  
  139. }  
  140.   
  141. static void beep_cleanup(void)  
  142. {  
  143.     cdev_del(&BeepDevs);  
  144.     unregister_chrdev_region(MKDEV(beep_major, 0), 1);  
  145.     printk("beep device uninstalled\n");  
  146. }  
  147.   
  148. module_init(beep_init);  
  149. module_exit(beep_cleanup);  
  150. EXPORT_SYMBOL(beep_major);  
  151.   
  152. //1.自动获取主设备号、次设备号  
  153. //2.动态生成设备节点(dev/  目录下)  
  154. //  动态卸载  

驱动程序的Makefile:

[cpp]  view plain  copy
  1. ifeq ($(KERNELRELEASE),)  
  2.   
  3. KERNELDIR ?=/home/fs/linux-3.14 //内核编码
  4.   
  5. #当前Makefile目录  
  6. PWD := $(shell pwd)  
  7.   
  8. #   -C $(KERNELDIR)指明跳转到内核源码目录下读取那里的Makefile  
  9. #   M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile  
  10. modules:  
  11.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
  12.   
  13. modules_install:  
  14.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install  
  15.   
  16. clean:  
  17.     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions  
  18.   
  19. .PHONY: modules modules_install clean  
  20.   
  21. else  
  22.     obj-m := beep_drv.o  
  23. endif  



应用程序:beep_test.c

[cpp]  view plain  copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.   
  6. #define BEEP_MAGIC 'k'  
  7. #define BEEP_START_CMD _IO (BEEP_MAGIC, 1)  
  8. #define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2)  
  9.   
  10. int main()  
  11. {  
  12.     int i = 0;  
  13.     char buf;  
  14.     int dev_fd;  
  15.     dev_fd = open("/dev/beep",O_RDWR | O_NONBLOCK);  
  16.     if ( dev_fd == -1 ) {  
  17.         printf("Cann't open file /dev/beep\n");  
  18.         exit(1);  
  19.     }  
  20.     while(1)  
  21.     {  
  22.         getchar();  
  23.         ioctl (dev_fd, BEEP_START_CMD,0);  
  24.         read(dev_fd,&buf,sizeof(buf));  
  25.         printf("The value of the buzzer:%d\n",buf);  
  26.           
  27.         getchar();  
  28.         ioctl (dev_fd, BEEP_STOP_CMD,0);  
  29.         read(dev_fd,&buf,sizeof(buf));  
  30.         printf("The value of the buzzer:%d\n",buf);  
  31.     }  
  32.     return 0;  
  33. }
  34.   应用程序要arm-none-linux-gnuebi-gcc 编译器编译,把编译好的可执行程序放到NFS下,在开发板下运行该程序。

你可能感兴趣的:(driver)