当前位置: 首页 > article >正文

笔记整理—linux驱动开发部分(7)misc类设备(杂项设备)

        ioctrl方法是用指令进行操作(应用层):

#define PWM_IOCTL_SET_FREQ		1
#define PWM_IOCTL_STOP			0

fd=open(DEVNAME,O_RDWR);//DEVNAME="/dev/buzzer"

if(fd<0)
{
    //err处理
}

ioctl(fd,PWM_IOCTL_SET_FREQ,10000);//设置pwm频率并开启buzzer
sleep(3);
ioctl(fd,PWM_IOCTL_STOP);//关闭buzzer

        misc类设备,就是杂项设备、杂散设备,是一种类,方便进行使用和管理,misc类设备是字符类设备,主设备号为10,以次设备号进行不同设备区分(eg:ADC 主10,次131;buzzer 主10,次61)。

        misc类设备,内核实现了一部分的框架:

int misc_register(struct miscdevice * misc);
static struct class *misc_class;
misc_class = class_create(THIS_MODULE, "misc");

struct miscdevice  {
	int minor;
	const char *name;
	const struct file_operations *fops;
	struct list_head list;
	struct device *parent;
	struct device *this_device;
	const char *nodename;
	mode_t mode;
};
......

        其余没提供的部分驱动工程师自行完成编写,linux没提供剩余部分的框架。

        misc是对字符设备类的一个封装,对老版本字符设备类的封装,主要提供了一个class去进行管理。

        那么misc设备框架干了什么呢?①类的创建;②开放给驱动开发者接口。

        misc源码框架本身也是一个模块,启动时自行加载misc.c,subsys_initcall()是一种启动顺序,是靠前的一类。

        proc文件系统 /proc CONFIG_PROC_FS,proc文件系统是一种不好用的文件系统,与/sys一个用法,但管理过于混乱,使用最后被废弃了。

        misc类设备框架(misc.c)主要就创建了misc的class,注册了misc设备(字符设备驱动10),开放用户dev驱动接口。

        填充struct miscdevice完成设备注册misc_register()。

static LIST_HEAD(misc_list);
等同于
static struct list_head misc_list={&(misc_list),&(misc_list)}//内核链表init,使prve与next指针都指向自己

        内核使用数组管理设备最对255个设备,但是对misc类设备,使用list进行管理(10号主设备下的次设备以此管理)。

        注册一个misc设备对内核会misc_list去inset一个节点。内核链表不包含有效信息,只是定义了prev和next指针,一般是别的链表挂载这个内核链表上使用,用于遍历。

        MISC_DYNAMIC_MINOR自动分配次设备号,以位图方法实现255个位置,看哪个位是0,就是没使用的设备号(bit_map)。

        dev=MKDEV(MAJOR,minor);因为misc用的老方法去实现的设备申请register,所以在次设备号申请后,用MKDEV()实现设备号合并,然后去device_create()注册,完成设备注册。

        misc_open()是内核已经写好的方法框架,file_operations以次设备号进行寻找,如果有已有的file_operations方法则使用这个方法,如果没有则会去request_module进行查找。但本质上.open、.release等方法还要自己去写。

        内核互斥锁,static DEFINE_MUTEX(),mutex_lock()上锁、mutex_unlock()下锁。

        内核防止竞态的方法,原子访问、自旋锁、互斥锁、信号量。

        自旋锁:是针对多核cpu的方法。

        互斥锁与信号量在原理上有相同之处,互斥锁是信号量是一种常见的形式。信号量dowm操作上锁,up解锁。

        原子访问:语句中间不可拆分,不可打断。

down_interruptible    排队可悲打断
down_killable    排队可kill
down_trylock    非阻塞尝试上锁
down_timeout    排队超时

        open()中进行上锁免得被同时操作,在close()中解锁。

        ioctl()输入输出控制。read/write有存在驱动与应用层交互的缺陷,驱动的人要写文档去告诉应用工程师操作。   ioctl()将操作宏发给应用层工作者(xxx.h)就能使用。


http://www.kler.cn/a/388277.html

相关文章:

  • Labelme标注数据的一些操作
  • FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
  • 全面解析 Python typing模块与静态类型注解:从基础到高级
  • 基于matlab的人眼开度识别
  • 隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图
  • elementUI 点击弹出时间 date-picker
  • nginx的相关命令
  • Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP
  • Type-C转DP线方案
  • 性能调优专题(7)之Innodb底层原理与Mysql日志机制深入剖析
  • 比流计算资源效率最高提升 1000 倍,“增量计算”新模式能否颠覆数据分析?
  • 学SQL,要安装什么软件?
  • Dart中List API用法大全
  • 帝国CMS7.5仿模板堂柒喜模板建站网 素材资源下载站源码
  • [产品管理-64]:如何通过开放式创新提升产品的创新能力?
  • 动态规划理论基础和习题【力扣】【算法学习day.24】
  • 向日葵软件Windows系统连接苹果系统(MacOS)的无反应问题解决办法
  • 基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析
  • Spring声明式事务 编程式事务
  • 天云数据战略签约浪潮 成为浪潮智慧城市银河联盟2024优秀战略合作伙伴
  • bert-base-uncased处理文档
  • 华为eNSP实验:IP Source Guard
  • 0. 渲染游戏画面
  • 医学可视化之涟漪图
  • 【51单片机】I2C总线详解 + AT24C02
  • Python中的常见配置文件写法