misc类驱动编写

STM32F103学习笔记一 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar 阅读详情

1 前言

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

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

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

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

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

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

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

2 驱动代码

本人认为,这个驱动的编写和led无框架编写的流程十分相似,只是进行了函数封装,底层还是老版本的字符设备注册函数。

相对的不同点在于注册后的设备所在目录不一样。本人比较喜欢懂一些底层的方法,按照自己喜欢的方式写驱动,因为上层的东西总是变来变去,我也记不住。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <plat/regs-timer.h>
#include <mach/regs-irq.h>
#include <asm/mach/time.h>
#include <linux/clk.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/miscdevice.h>

#include <linux/gpio.h>

#include <plat/gpio-cfg.h>
//#include <plat/regs-clock.h>
//#include <plat/regs-gpio.h>

//#include <plat/gpio-bank-e.h>
//#include <plat/gpio-bank-f.h>
//#include <plat/gpio-bank-k.h>

#define DEVICE_NAME     "buzzer"

#define PWM_IOCTL_SET_FREQ              1
#define PWM_IOCTL_STOP                  0

static struct semaphore lock;

// TCFG0ÔÚUbootÖÐÉèÖã¬ÕâÀï²»ÔÙÖØ¸´ÉèÖÃ
// Timer0ÊäÈëÆµÂÊFinput=pclk/(prescaler1+1)/MUX1
//                     =66M/16/16
// TCFG0 = tcnt = (pclk/16/16)/freq;
// PWM0Êä³öƵÂÊFoutput =Finput/TCFG0= freq
static void PWM_Set_Freq( unsigned long freq )
{
        unsigned long tcon;
        unsigned long tcnt;
        unsigned long tcfg1;

        struct clk *clk_p;
        unsigned long pclk;

        //unsigned tmp;

        //配置成PWM输出模式,对应TOUT2
        s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(2));
		//内核中不建议之间使用指针读取寄存器值,所以使用读函数
        tcon = __raw_readl(S3C2410_TCON);
        tcfg1 = __raw_readl(S3C2410_TCFG1);

        //mux = 1/16,tcfg0在uboot被配成1/16
        tcfg1 &= ~(0xf<<8);
		tcfg1 |= (0x4<<8);
        __raw_writel(tcfg1, S3C2410_TCFG1);
		//使用PCLK_PSYS可以查看芯片数据手册的2.3.4时钟部分
		//最大为66MHz,这里也是66MHz
        clk_p = clk_get(NULL, "pclk");
        pclk  = clk_get_rate(clk_p);
	
        tcnt  = (pclk/16/16)/freq;
        printk("tcnt:%d\n",tcnt);
        //相当于单片机中的重装在寄存器
        __raw_writel(tcnt, S3C2410_TCNTB(2));
        //相当于单片机的输出比较寄存器,至于占空比为什么是50%,可能	
        //是因为Hz这种东西的占空比本来就是50%吧
        __raw_writel(tcnt/2, S3C2410_TCMPB(2));//
		
        tcon &= ~(0xf<<12);
        //Interval Mode(Auto-Reload)   Inverter Off 
        //Update TCNTB2,TCMPB2      Start Timer 2
        tcon |= (0xb<<12);              //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
        __raw_writel(tcon, S3C2410_TCON);

        tcon &= ~(2<<12);                       //clear manual update bit
        __raw_writel(tcon, S3C2410_TCON);
}

void PWM_Stop( void )
{
        //io口改成输入模式
        s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(0));
}

static int x210_pwm_open(struct inode *inode, struct file *file)
{
        if (!down_trylock(&lock))
                return 0;
        else
                return -EBUSY;

}


static int x210_pwm_close(struct inode *inode, struct file *file)
{
        up(&lock);
        return 0;
}

// PWM:GPF14->PWM0
static int x210_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
        switch (cmd)
        {
                case PWM_IOCTL_SET_FREQ:
                        printk("PWM_IOCTL_SET_FREQ:\r\n");
                        if (arg == 0)
                                return -EINVAL;
                        PWM_Set_Freq(arg);
                        break;

                case PWM_IOCTL_STOP:
                default:
                        printk("PWM_IOCTL_STOP:\r\n");
                        PWM_Stop();
                        break;
}

        return 0;
}


static struct file_operations dev_fops = {
    .owner   =   THIS_MODULE,
    .open    =   x210_pwm_open,
    .release =   x210_pwm_close,
    .ioctl   =   x210_pwm_ioctl,
};

static struct miscdevice misc = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = DEVICE_NAME,
        .fops = &dev_fops,
};

static int __init dev_init(void)
{
        int ret;

        init_MUTEX(&lock);
        ret = misc_register(&misc);

        /* GPD0_2 (PWMTOUT2) */
        ret = gpio_request(S5PV210_GPD0(2), "GPD0");
        if(ret)
                printk("buzzer-x210: request gpio GPD0(2) fail");

        s3c_gpio_setpull(S5PV210_GPD0(2), S3C_GPIO_PULL_UP);
        s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(1));
        gpio_set_value(S5PV210_GPD0(2), 0);

        printk ("x210 "DEVICE_NAME" initialized\n");
        return ret;
}

static void __exit dev_exit(void)
{
        misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("www.9tripod.com");
MODULE_DESCRIPTION("x210 PWM Driver");

Linux应用程源码:

#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, 10000);
	sleep(3);
	ioctl(fd, PWM_IOCTL_STOP);
	sleep(3);
	ioctl(fd, PWM_IOCTL_SET_FREQ, 3000);
	sleep(3);
	ioctl(fd, PWM_IOCTL_STOP);
	sleep(3);
	
	
	close(fd);
	
	return 0;
}

以上源代码来自朱有鹏老师的教程

学习笔记7-STM32官方库.c/.h文件功能(汇总) STM32官方库.c/.h文件功能汇总 阅读详情

相关推荐

STM32入门—固件库

这里的hd代表大容量,我们可以查阅参考手册中的术语表因为我使用的STM32F103ZET6是512K字节的闪存,所以启动文件选择hd。1.设置堆栈指针2.设置PC指针3.初始化中断向量表4.配置系统时钟5.调用C库函数_main系统会执行Reset_Handler这个汇编,它会调用两个函数,一个SystemInit和__main,SystemInit用于配置系统时钟, __main是C库函数,用于初始化堆栈,最终调用C语言中的main函数,实现从汇编到C语言的环境的跳跃。

m0_74910976的博客 2001

misc类设备驱动3——misc驱动框架源码分析(核心层+具体操作层)

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

主要记录嵌入式学习与开发过程。 1645

七.misc类设备与蜂鸣器驱动(上)

目录 一.板载蜂鸣器驱动测试 1.1、驱动部分 1.2、应用部分 二.misc类设备介绍 2.1、何为misc 2.2、misc类设备驱动架构 2.3、本部分学习方法 一.板载蜂鸣器驱动测试 1.1、驱动部分 (1)九鼎移植内核已经提供了蜂鸣器驱动源码 查找蜂鸣器代码的方法: <1> 在 SI 中搜索 buzzer。 <2> 在 linux...

Mr.Wang的博客 1177

001_Linux内核驱动之杂项设备(miscellaneous device)的misc.c源码解析

0、写在开头 在Linux系统中,存在一类字符设备,他们共享一个主设备号(10),但次设备号不同,我们称这类设备为杂项设备(miscdeivce)。 查看/proc/device中可以看到一个名为misc的主设备号为10.所有的杂项设备形成一个链表,对设备访问时内核根据次设备号找到对应的miscdevice设备。 (1)linux 内核使用struct miscdeivcemiao描述一个杂项设备: a)linux源码中位置:/kernel-4.14/include/linux/mi...

zhanghui962623727的博客 1947

Linux misc设备(一)misc驱动框架

Linux misc设备 Linux misc设备(一)misc驱动框架 Linux misc设备(二)蜂鸣器驱动 Linux misc设备(一)misc驱动框架 文章目录Linux misc设备(一)misc驱动框架一、misc简介二、misc驱动框架三、misc源码剖析四、misc设备实例驱动编写模板 一、misc简介 Linux的驱动设计是趋向于分层的,大多数设备都有自己归属的类型,例如按键...

JT同学的博客 7679

Linux中MISC驱动简介及其简单使用

Linux中MISC驱动简介及其简单使用1、MISC 设备驱动简介2、一般操作流程1、定义以及填充结构体2、注册MISC 设备3、卸载MISC 设备 Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。正因为简单,所以它通常嵌套在platform 总线驱动中,配合总线驱动达到更复杂,多功能的效果。 1、MISC 设备驱动简介 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。他可以夹杂到其它结构体当中,以丰富驱动的血肉。一般

一只青木呀 2492

98、misc类设备驱动+RKXXXX

摘要:本文介绍了Linux内核中的misc类设备驱动,用于解决设备号资源紧张问题。misc设备属于杂项设备,主设备号固定为10,通过次设备号区分不同设备。文章详细说明了misc设备结构体的构建方法,重点包括minor、name和fops三个成员变量,并演示了misc_register和misc_deregister函数的注册与注销流程。最后给出一个结合platform驱动的LED控制实例,展示了从设备树配置到驱动实现的全过程,包括GPIO初始化、操作函数实现和应用层测试程序。

qq_41998872的博客 516

深入解析Linux MISC驱动框架

本文深入解析了Linux内核中的MISC驱动框架(杂项设备驱动),其设计初衷是为简单字符设备提供轻量级解决方案,避免重复开发。MISC框架的核心特点是:所有设备共享主设备号10,但各自拥有唯一的次设备号。文章详细介绍了关键数据结构struct miscdevice的组成,包括次设备号分配、设备命名、文件操作集合等核心要素,并阐述了MISC框架的内部注册机制。最后通过一个完整的代码示例,展示了如何实现包含open/close/read/write等基本操作的MISC驱动,包括动态分配次设备号、创建设备节点和定

weixin_44932366的博客 1135

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

整理一下学习的内容,个人观点可能存在错误。本章介绍了什么是misc类设备,以及相关框架,其实misc也是非常常用的一类设备,其可拓展性非常高。下一章我们来介绍什么是framebuffer类设备。

qq_35229394的博客 761

PyQt5 + HFSS:给你的仿真脚本做个专属GUI界面(零基础搭建指南)

本文详细介绍了如何使用PyQt5为HFSS仿真脚本创建专属GUI界面,适合零基础用户快速上手。通过Python二次开发,实现参数可视化调整、进度实时监控等功能,大幅提升团队协作效率。文章涵盖环境配置、界面设计、HFSS集成到打包部署的全流程,是仿真工程师提升工作效率的实用指南。

weixin_42535720的博客 185

Arnold Denoise流程

参考:https://support.solidangle.com/display/ARP/Removing+Noise+Workflow Arnold生来不是一个以单帧渲染速度见长的渲染器,但这并不能作为一个简单场景渲染时间长达几个小时的借口。 个人认为高品质生产级渲染结果中,Unbiased renderer在渲染时最耗计算时间的其实就是降噪,以至于降噪专门成了一门灯光师必备的技术

机器猫的CG空间 5084

linux 设备类型misc,基于Linux的MISC类设备AD7859L的驱动程序开发

1 引言本文引用地址:http://www.eepw.com.cn/article/151386.htm在嵌入式系统中基于ARM微核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用,建立面向ARM构架的嵌入式操作系统成为测量行业的热点问题。在LINUX操作系统中添加新的外部设备时,只需为其添加对应的驱动程序即可。介绍另一种驱动程序的编写方式,即采用MISC类设备。其实质也是一个字符设备。可...

weixin_31008853的博客 256

半导体制造技术导论(第二版)萧宏 第五章集成电路加热工艺答案

第二次退火是在较高温度下进行,并将电阻系数较高的c49碳化硅转变为电阻系数较低的c54碳。水平式高温炉加热、垂直式高温炉加热(即传统的管式炉加热)、快速加热工艺RTP、激光镭射。8. 集成电路芯片制造过程中,会使用垫底氧化层、阻挡氧化层、栅氧氧化层、屏蔽氧化层和全。氧化是最重要的加热过程之一,是一种添加工艺,将氧气加入到硅晶圆后,在晶圆表面形成二氧。为了满足元器件性能的要求,必须利用退火工艺将晶格的损伤修复,使其恢复单晶结构并激活掺。工艺氮气气流下将晶舟推入炉管,升高温度,稳定温度;

goal_achieving的博客 1863

Linux字符设备驱动框架(三):Linux内核的misc类设备驱动框架

/************************************************************************************ *本文为个人学习记录,如有错误,欢迎指正。 *本文参考资料: *        https://www.cnblogs.com/deng-tao/p/6042965.html *        https://blog...

weixin_30802171的博客 257

从传统扫描到SSN:Tessent数据包技术如何减少90%测试时间

本文深入探讨了Tessent流式扫描网络(SSN)如何通过其核心的数据包技术,彻底改变芯片测试范式。该技术将测试数据封装成标准化数据包,在共享总线上进行智能路由与分发,实现了动态带宽分配与核心独立测试,从而将复杂SoC(如AI芯片)的总体测试时间大幅削减90%,并显著提升测试灵活性与可扩展性。

meat5的博客 490

避坑指南:Zabbix poller进程100%占用的5种常见原因及解决方案

本文深入剖析了Zabbix poller进程占用率高达100%的五大常见原因,包括监控项与进程数不匹配、不可达主机资源浪费、数据库性能瓶颈、监控项配置不合理以及版本缺陷。文章提供了从系统化诊断到针对性解决方案的完整指南,并重点介绍了如何通过优化zabbix_server.conf中的StartPollers等关键参数进行有效调优,帮助运维人员从根本上解决这一经典性能问题。

7z8x2c4v6b9的博客 250

linux下ad数模转换驱动程序设计,基于Linux-2.6.16的高速模数转换器AD7859L的应用...

1 引言在嵌入式系统中基于ARM微核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用,建立面向ARM构架的嵌入式操作系统成为测量行业的热点问题。在LINUX操作系统中添加新的外部设备时,只需为其添加对应的驱动程序即可。介绍另一种驱动程序的编写方式,即采用MISC类设备。其实质也是一个字符设备。可将用户各种不同的驱动设备类型合成到一种类型中,共用一个主设备号,通过不同的次设备号和设备节点名来...

weixin_39901358的博客 555

计算机等级考试(二级WPS)---真题14套

目录 真题14一、选择题二、WPS文字三、WPS表格四、WPS演示21.打开考生文件夹下的素材文档 “WPS.docx”(.docx 为文件扩展名),后续操作均基于此文件,否则不得分。小周正在整理一份关于极光的文档,请按要求帮助她完成文档的排版工作。1.将全文中的手动换行符全部替换为中文句号并回车,删除文中的空行和空格。2.将正文第 2 段(“在我國的古書…… 極光”)中的繁体字转换成简体字,并为其设置 “正文” 样式。3.对文档样式进行如下设置:4.为 “1.3 极光的形态” 一节中列出的五种极光形态特征

2401_82750246的博客 1168

imx6ull-驱动开发篇37——Linux MISC 驱动实验

本文介绍了Linux内核中的MISC(杂项)设备驱动框架及其应用。以蜂鸣器驱动为例,演示了如何结合platform框架实现MISC设备驱动,包括设备树配置、驱动代码编写、测试程序开发等完整流程。

m0_62228566的博客 1701

半导体工艺仿真:离子注入工艺仿真_(8).损伤和缺陷仿真

离子注入工艺在半导体制造中是一个重要的步骤,用于在半导体材料中引入特定的掺杂剂。然而,离子注入过程中不可避免地会产生损伤和缺陷,这些损伤和缺陷会直接影响器件的性能和可靠性。因此,对离子注入工艺中的损伤和缺陷进行仿真研究是必不可少的。本节将详细介绍如何使用仿真软件对离子注入过程中的损伤和缺陷进行建模和分析。

2401_87715305的博客 1339

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 999

Linux驱动之MISC设备驱动

每日一个简单的驱动,日久方长,对Linux驱动就越来越熟悉,也越来容易学会写驱动程序。今日进行第七个Linux MISC 设备驱动。

Wang_XB_3434的博客 2169

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MISC机制编写字符驱动程序

一、杂项设备 在上次的实验中编写了一个内核模块,是使用内核提供的API实现了一个简单的虚拟设备的驱动,其中字符设备是使用函数alloc_chrdev_region -> cdev_alloc-> cdev_init-> cdev_add来注册和初始化的,而字符设备驱动也可以使用MISC机制来进行注册。 Linux把不符合预先确定的字符设备范畴称为杂项设备-MISC。 Linux的驱动设计是趋向于分层的,大多数设备都有自己归属的类型,例如按键、触摸屏属于输入设备,对于他们有一个input子系

FF_programming的博客 919

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

22 Linux MISC 驱动

其实 MISC设备驱动就是变成了一种函数集合,这个函数集合包含注册字符设备驱动需要的工作。使用 MISC 设备驱动也简单,首先先设置 MISC 设备结构体包括name、minor(次设备号)和 fops。设置完成后向 Linux 注册 MISC 设备,这个注册函数()一般放在 probe 函数,注销函数()放在 remove 中。

Toutiegongzhu的博客 1338

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux 下的 MISC 设备驱动

MISC设备驱动介绍

安迪西_嵌入式攻城狮 2181

misc类设备驱动2——misc类设备的简介

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

主要记录嵌入式学习与开发过程。 2752
上一篇: led驱动编写-使用驱动框架
下一篇: uboot源码分析
金银588
博客等级 码龄7年 1210粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值