
Linux驱动
文章平均质量分 66
One Piece&
这个作者很懒,什么都没留下…
展开
-
mmap(内存映射)
1、mmap的引入我们都知道,应用程序是不能直接访问驱动程序的。对于数据量较小的数据交互,我们可以使用copy_to_usr()(read())和copy_from_usr()(write())来进行用户态buffer和内核态buffer之间的拷贝。但是,对于数据量较大的情况,还用这种方式进行buffer的拷贝,效率低下。为了解决这个问题,我们使用mmap()。将内核态的buffer映射到用户态,让APP直接在用户态进行读写。2、什么叫内存映射问题的引入:当我们同时运行两个程序:我们可以看出原创 2021-04-15 15:58:30 · 4051 阅读 · 0 评论 -
linux之定时器
1 问题的引入—》软件消抖在实际的应用中,如按键按下的的现象应该是:松开(高电平)-》按下(低电平)-》松开(高电平)但是由于实际按键的硬件原因导致的机械抖动,会导致产生多次中断,上报多次按键值。可是实际上,我们只要一次按键值。为了避免这种情况的发生1)、我们可以使用中断来处理,死等:在按键中断程序中,可以循环判断几十亳秒,发现电平稳定之后再上报。但是这样违背了中断的原则之一:将尽可能的快。2)、使用定时器每次产生中断,在中断执行函数中,我们做的不是读按键值,而是修改定时器的超时时间:原创 2021-04-15 15:28:09 · 326 阅读 · 0 评论 -
POLL机制
1、poll机制概述使用休眠和唤醒机制等待某个事件发生,方法简单。但是不能做其他事情。因为如果一个事件等待很久才发生,那么我就要一直等待。为了避免这种事情的发生,我们给他加上一个超时时间,这就是poll机制。2、实现流程其核心的实现流程如下:但是在内核中,他具体的实现方式如下:驱动程序部分:在应用程序中,可以指定poll的休眠时间:总结:对于POLL机制的使用,对于驱动编写人员来说,只是做了两件事情:1、使用poll_wait()函数,将线程放入等待队列(原创 2021-04-15 15:18:56 · 1869 阅读 · 1 评论 -
休眠与唤醒
本文的分享,基于获取按键值得历程:1、用户程序通过休眠与唤醒机制获取按键值图示2 重要函数分析这里,我们重点分析两个函数。1)、休眠函数2)、唤醒函数函数分析:wake_up函数哪里找到要唤醒的进程或者线程呢?答案就是他的参数:wq(wait queue),等待队列.他会从这个队列里面,取出线程。进行唤醒。当某个进程、线程要休眠的时候,他会调用休眠函数wait_event_xx将自己放入到等待队列中。event参数的含义是,false:不休眠。true:休眠。原创 2021-04-15 15:09:27 · 660 阅读 · 0 评论 -
LCD驱动中的xxx_probe()函数
LCD驱动是一个标准的platform驱动。当驱动和设备匹配以后,mxsfb_probe 函数就会执行。mxsfb_probe 函数的主要工作是:1)、申请fb_info。framebuffer_alloc()2)、初始化fb_info结构体中,各个成员变量。3)、初始化eLCDIF控制器。4)、使用register_frambebuffer函数向Linux内核注册初始化好的fb_info结构体。mxsfb_probe 函数中,重要函数/结构体的简要的说明:1)、Linux内核将所有的F原创 2021-01-25 18:37:26 · 466 阅读 · 0 评论 -
阻塞、非阻塞、同步、异步通知
1 同步和异步同步和异步就是消息的通知两种机制,针对应用程序与内核的交互而言。比如:用户程序从内核读取数据,如果内核缓存中数据还没有准备好,如果是同步操作,进程触发IO操作,一直等待或者轮询的去查看IO操作是否完成(这个步骤不执行结束,接下来的事情都不能做)。如果是异步操作,那么它会去做别的事情,进程触发IO操作以后,直接返回,做自己的事情,IO操作交给内核来处理,等待数据准备好,内核通知它,用户程序再去读取数据。同步和异步是相对于操作结果来说,区别在于会不会等待结果返回。两者之间的区别: 我的理解原创 2021-01-12 17:16:16 · 535 阅读 · 0 评论 -
warning: useless storage class specifier in empty declaration
在ubuntu下,用Visual Studio Code编译自己写的驱动程序,总是出现如下警告:我的代码如下:static struct timer_dev{ dev_t devid; int major; int minor; struct cdev cdev; struct class *class; struct device *device;};struct timer_dev gtimer;改为:static struct timer原创 2021-01-05 10:10:58 · 2413 阅读 · 0 评论 -
根节点下的compatible属性
前言:参考自正点原子正文:/ { model = "Freescale i.MX6 ULL 14x14 EVK Board"; compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; ……}设备下的compatible属性,是用来找驱动文件的。跟节点下的compatible属性,用于内核查找,本内核是不是支持这个平台/设备。1、使用设备树之前,设备匹配的方法在没有使用设备树之前,uboot会向内核传递一个machine id的值原创 2021-01-01 15:38:09 · 1497 阅读 · 0 评论 -
设备书的特殊节点-chosen
前言:参考自正点原子和博客:https://www.cnblogs.com/targethero/p/5089124.html正文:chosenchosen 并不是一个真实的设备, chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少。但是,当我们进入到/proc/device-tree/chosen 目录里面,会发现多了 bootargs 这个属性:查看里面的内容:由此,原创 2021-01-01 11:44:47 · 1816 阅读 · 1 评论 -
自动创建设备节点(udev、mdev)
前言:参考自:正点原子和百度百科我们使用新字符设备驱动,可以让内核自动分配主设备号。但是,设备节点依旧需要自己去手动创建 eg:mknod /dev/newled c 249 0现在,我们使用另外一种方法,实现设备节点的主动创建!我们要实现的目标是:当我们在终端输入modprobe以后,就是自动的在/dev/目录下面创建设备节点。1、历史udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。udev是硬件平台无关的,属于user spac原创 2020-12-31 12:48:13 · 1039 阅读 · 0 评论 -
linux系统调用
1、为什么要分成内核空间和用户空间为了安全。在内核空间,可以对cpu进行任意访问,也就是拥有最高的权限。如果用户程序也拥有了这个权限,如果应用程序不安全(携带病毒),就会影响内核的安全。因此,分成内核空间和用户空间(用户空间的权限受限)。注:这里涉及到保护模式的概念。总得来说,就是:在保护模式下,程序不能再随意的访问物理内存了,有些内存地址CPU做了明确的保护限制。保护机制能有效的实现不同任务之间和同一任务内的保护。详见博客:https://blog.youkuaiyun.com/gatieme/article原创 2020-12-29 19:50:00 · 559 阅读 · 0 评论 -
正点原子IMX6ULL uboot启动流程图解(函数调用框架)
原创 2020-12-22 21:55:37 · 957 阅读 · 0 评论 -
NFS服务器出现:Loading:T T T T T T T T;tftp服务器出现:tftp:timeout
工作室整改了网络,之后nfs服务器和tftp服务器都不能使用,但是开发板,主机和虚拟机之间都可以互相ping通:具体报错如下:检查NFS服务器共享目录,命令如下:sudo vi /etc/exports 检查TFTP 服务器工作目录,命令如下:sudo vi /etc/default/tftpd-hpa TFTP 服务器的路径,命令如下:sudo vi /etc/xinetd.d/tftp且执行了如下重启命令:重启 NFS 服务器sudo /etc/init.d/nfs-k原创 2020-12-17 19:21:53 · 2239 阅读 · 1 评论 -
linux 设备驱动基本概念
学习linux设备驱动首先我们必须明确以下几个概念,为我们接下来学习linux驱动打下坚实的基础: 应用程序、库、内核、驱动程序的关系 设备类型 设备文件、主设备号与从设备号 驱动程序与应用程序的区别 用户态与内核态 Linux驱动程序功能 一、应用程序、库、内核、驱动程序的关系 1)应用程序调用一...转载 2020-12-17 11:41:10 · 270 阅读 · 0 评论 -
在内核中添加驱动的方法
1.根据驱动种类在Kconfig中添加menuconfig选项,例如在内核源码目录下的/drivers/char目录中的Kconfig中添加配置选项 HELLO_CTL(在这之前需要在平台文件中添加注册设备的结构体,一般在/arch/arm目录下)2、这时,输入make menuconfig命令,我们就可以找到添加的选项。3、勾选以后,我们可以在.config中看到生成了相关的宏。当我们在menuconfig中把HELLO_CTL 前面的[*] 去掉 改为不编译进内核时,可以看到在.config原创 2020-12-17 11:17:40 · 1035 阅读 · 0 评论 -
Kconfig,.config和makefile的关系
我们在使用make menuconfig这个命令的时候,屏幕上会出现配置界面:那么,我们输入make menuconfig命令以后,在界面出现以前,系统做了哪些事情呢(两件事情)?1、menuconfig读取Kconfig文件的项目内容:1)、menuconfig显示的菜单内容(菜单的目录结构、每一个菜单项目的细节),由内核源码树各个目录下的Kconfig文件来提供(Kconfig是整个linux配置机制的核心)。a、Kconfig文件中按照一定的格式包含一些配置项,每一个配置项在make men原创 2020-12-17 11:15:04 · 462 阅读 · 0 评论