linux驱动开发10之misc及蜂鸣器驱动

1.板载蜂鸣器驱动测试

1.1驱动部分

1)九鼎移植内核已经提供了蜂鸣器驱动源码

2)make menuconfig

3)bug排查。修改Makefile中的宏名,最终可以在系统中看到 /dev/buzzer

由于makefile文件与Kconfig文件中的宏定义不一致,修改makefile宏为:

然后编译,下载,结果看到:

我们看到在fileoperations结构体中的open和close源码都是空的:

那么怎样对设备文件进行操作呢?结果就是使用ioctl。

2.应用部分

1)应用编写:打开文件+ioctl

#include <stdio.h>

#include <sys/stat.h>

#include <fcntl.h>

 

#define DEVNAME "/dev/buzzer"

#define PWM_IOCTL_SET_FREQ      1

#define PWM_IOCTL_STOP          0

 

int main(void)

{

    int fd = -1;

   

    fd = open(DEVNAME, O_RDWR);

    if(fd < 0)

    {

        perror("open");

        return -1;

    }

    ioctl(fd, PWM_IOCTL_SET_FREQ, 1000);

    sleep(3);

    ioctl(fd, PWM_IOCTL_STOP);

    sleep(3);

    ioctl(fd, PWM_IOCTL_SET_FREQ, 10000);

    sleep(3);

    ioctl(fd, PWM_IOCTL_STOP);

    return 0;

}

2)测试实践

2.misc类设备介绍

2.1何为misc

1)中文名:杂项设备\杂散类设备。是一类设备,这些设备不好分类,所以放在misc类设备里面,比如蜂鸣器、闹钟、led等。

2)/sys/class/misc

3)是典型的字符设备

4)有一套驱动框架,内核实现一部分(misc.c),驱动实现一部分(x210-buzzer.c)。

5)misc是对原始的字符设备注册接口的一个类层次的封装,很多典型字符设备都可以归类到misc类中,使用misc驱动框架来管理。

2.2misc类设备驱动架构

1)内核开发者实现部分,关键点有2个:一个是类的创建,另一个是开放给驱动开发者的接口

2)具体设备驱动工程师实现部分

2.3本部分学习方法

1)蜂器驱动源码已有,分析为主

2)复习并验证前面讲的驱动框架的思维

3)有余力的不妨开始注意一些细节

3.Misc驱动框架

3.1. misc源码框架基础

1)misc源码框架本身也是一个模块,内核启动时自动加载

2)源码框架的主要工作:注册misc类,使用老接口注册字符设备驱动(主设备号10),开放device注册的接口misc_register给驱动工程师

3.2.misc类设备的注册

1)驱动工程师需要借助misc来加载自己的驱动时,只需要调用misc_register接口注册自己的设备即可,其余均不用管。

2)misc_list链表的作用。内核定义了一个misc_list链表用来记录所有内核中注册了的杂散类设备。当我们向内核注册一个misc类设备时,内核就会向misc_list链表中insert一个节点。

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \

         struct list_head name = LIST_HEAD_INIT(name)

原式子:static LIST_HEAD(misc_list);

展开后:static struct list_head misc_list = { &(misc_list), &(misc_list) }

1)主设备号和次设备号的作用和区分

使用的是位图的数据结构方法。Find_first_zero_bit在位图中找到第一个为0的位置。

3.3 open函数分析

Inod是硬盘里的设备节点,file是设备文件路径。

3.4 miscproc下的展现

3.5 内核互斥锁

1)何为互斥锁

2)定义:DEFINE_MUTEX

3)上锁mutex_lock和解锁mutex_unlock

4)内核防止竞争状态的手段:原子访问、自旋锁、互斥锁、信号量

5)原子访问主要用来做计数、自旋锁后面讲中断会详细讲、互斥锁和信号量很相似(其实就是计数值为1的信号量),互斥锁的出现比信号量晚,实现上比信号量优秀,尽量使用互斥锁。

4.蜂鸣器驱动

4.1.dev_init

Init_MUTEX:信号量。用于保证蜂鸣器不能被两个进程进行访问。

1)信号量

2)miscdevice

/* GPD0_2 (PWMTOUT2) */

         ret = gpio_request(S5PV210_GPD0(2), "GPD0");

3)gpio_request

4)printk

4.2.ioctl

1)为什么需要ioctl(input output control,输入输出控制)。

输入输出控制,read和write有缺陷的,在于驱动和硬件之间的交互。

2)ioctl怎么用

硬件操作有关的代码

猜你喜欢

转载自blog.csdn.net/wangdapao12138/article/details/81609253