• misc类设备驱动0——板载蜂鸣器驱动测试


    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 

    一、驱动部分

    1、前言

    九鼎移植的内核已经提供了蜂鸣器驱动源码(在SI中搜索关键字buzzer,发现出现有x210-buzzer.c文件;或者在make menuconfig界面搜索buzzer,得到路径信息drivers/char/buzzer,进入该目录发现有x210-buzzer.c文件;或者在内核源码里使用“grep -nr "buzzer" ./”来查找),因此不需要我们编写。

    但是该驱动文件不一定被编译。该文件是否被编译,取决于Makefile文件中的宏:obj-$(CONFIG_X210_BUZZER_DRIVER) += x210-buzzer.o;而该宏又取决于Kconfig文件中的项目(X210_BUZZER_DRIVER)是否显示“y”;而Kconfig文件中的项目是否显示“y”,是由make menuconfig时配置的。因此要进行配置,配置之后再进行驱动的测试,以验证该驱动的可行性。

    2、测试

    步骤1:在make menuconfig界面进行配置以支持buzzer。

    1.                 Device Drivers  --->  
    2.                         Character devices  ---> 
    3.                                [*] x210 buzzer driver 

    步骤2:进行编译,即执行make。

    步骤3:将新生成的zImage下载到开发板运行,按理开发板系统上应该生成/dev/buzzer这个设备文件,但实际没有。

    1. [root@xjh dev]# ls /dev/buzzer
    2. ls: /dev/buzzer: No such file or directory
    3. [root@xjh dev]#

    经过bug排查,发现九鼎编写的代码中有个bug,drivers/char/buzzer/Makefile中的宏,如果与Kconfig对应的话,需要修改为如下:

    1. #obj-$(CONFIG_BUZZER_DRIVER) += x210-buzzer.o
    2. obj-$(CONFIG_X210_BUZZER_DRIVER) += x210-buzzer.o

    步骤4:修改之后重新编译与下载内核运行,可以看到 /dev/buzzer这个设备文件。

    1. [root@xjh ]# ls /dev/buzzer -l //设备文件
    2. crw-rw---- 1 root root 10, 61 Jan 1 12:15 /dev/buzzer
    3. [root@xjh ]# //主设备10,次设备号61

    至此,buzzer的驱动可以使用了,下面通过写应用来测试此驱动。

    二、应用部分

    1、浏览驱动有哪些操作

    通过简单地浏览x210-buzzer.c这个驱动文件,得知其open、close函数都是空的,只有ioctl函数在做事情,于是可以据此编写应用层代码。

    1. //省略部分代码
    2. static struct file_operations dev_fops = {
    3. .owner = THIS_MODULE,
    4. .open = x210_pwm_open, //空的
    5. .release = x210_pwm_close, //空的
    6. .ioctl = x210_pwm_ioctl, //干活的
    7. };
    8. static struct miscdevice misc = {
    9. .minor = MISC_DYNAMIC_MINOR,
    10. .name = DEVICE_NAME,
    11. .fops = &dev_fops,
    12. };
    13. //省略部分代码

    x210_pwm_open()与x210_pwm_close()函数如下:

    1. static int x210_pwm_open(struct inode *inode, struct file *file)
    2. {
    3. if (!down_trylock(&lock))
    4. return 0;
    5. else
    6. return -EBUSY;
    7. }
    8. static int x210_pwm_close(struct inode *inode, struct file *file)
    9. {
    10. up(&lock);
    11. return 0;
    12. }

    x210_pwm_ioctl()函数如下:

    1. static int x210_pwm_ioctl(struct inode *inode, struct file *file,\
    2. unsigned int cmd, unsigned long arg)
    3. {
    4. switch (cmd)
    5. {
    6. //#define PWM_IOCTL_SET_FREQ 1
    7. //这个命令打开蜂鸣器并设置频率,需要带参数,参数含义是频率
    8. case PWM_IOCTL_SET_FREQ:
    9. printk("PWM_IOCTL_SET_FREQ:\r\n");
    10. if (arg == 0)
    11. return -EINVAL;
    12. PWM_Set_Freq(arg);
    13. break;
    14. //#define PWM_IOCTL_STOP 0
    15. //这个命令关闭蜂鸣器并设置频率,不需要带参数
    16. case PWM_IOCTL_STOP:
    17. default:
    18. printk("PWM_IOCTL_STOP:\r\n");
    19. PWM_Stop();
    20. break;
    21. }
    22. return 0;
    23. }

    2、开始编写应用代码

    1. #include
    2. #include //open这些函数所在的头文件
    3. #include
    4. #define DEVNAME "/dev/buzzer" //蜂鸣器对应的设备文件,这个啥时候创建的?
    5. //这些命令来自驱动文件,应用层知道这些宏的含义
    6. //按理应该写成头文件包含形式,这里不规范
    7. #define PWM_IOCTL_SET_FREQ 1
    8. #define PWM_IOCTL_STOP 0
    9. int main(void)
    10. {
    11. int fd = -1;
    12. fd = open(DEVNAME, O_RDWR);
    13. if (fd < 0)
    14. {
    15. perror("open");
    16. return -1;
    17. }
    18. //文件描述符 //频率
    19. ioctl(fd, PWM_IOCTL_SET_FREQ, 10000);
    20. //命令码来自驱动
    21. sleep(3);
    22. ioctl(fd, PWM_IOCTL_STOP);
    23. sleep(3);
    24. ioctl(fd, PWM_IOCTL_SET_FREQ, 3000);
    25. sleep(3);
    26. ioctl(fd, PWM_IOCTL_STOP);
    27. sleep(3);
    28. close(fd);
    29. return 0;
    30. }

    3、测试实践

    (1)将上面的应用程序命名为app.c;

    (2)然后使用命令“arm-linux-gcc app.c -o app”进行编译;

    (3)将得到的可执行文件下载至开发板进行运行;

    1. [root@xjh mnt]# ls
    2. Makefile app app.c driver_test.c
    3. [root@xjh mnt]# ./app
    4. [ 2115.943865] PWM_IOCTL_SET_FREQ: //有声音
    5. [ 2119.054830] PWM_IOCTL_STOP:
    6. [ 2122.056309] PWM_IOCTL_SET_FREQ: //有声音,且和上面频率不一样
    7. [ 2125.058158] PWM_IOCTL_STOP:
    8. [root@xjh mnt]#
  • 相关阅读:
    nacos 详细介绍(二)
    bus使用清除keepalive缓存
    【图像分割】基于元胞自动机实现图像分割附matlab代码
    【文献分享】将生态系统服务和景观连通性整合到生态安全格局优化中——以中国珠江三角洲为例
    【虚拟线程】java21虚拟线程用法 限流等
    图神经网络torch_geometric库的使用
    大数据开发 --- windows环境下jdk和本地maven安装
    LocalDateTime、LocalDate、Date的相互转换工具类
    Datawhale智能汽车AI挑战赛
    『Nacos』 入门教程
  • 原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/126467499