linux内核
文章平均质量分 69
龙图腾
驱动工程师真心喜欢学习真心喜欢技术
展开
-
linux底层设置分辨率 DRM KMS 理解
我的理解原创 2020-11-26 18:31:33 · 1487 阅读 · 0 评论 -
简单的debugfs模型
#include #include #include #include #include #include static char abc_str[32] ={ };static char blob_inof[32] = "dragon blob wrapper\n";static struct debugfs_blob_wrapper blob;s原创 2014-09-05 10:31:54 · 1041 阅读 · 0 评论 -
Linux内核里的DebugFS
DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。通常情况下,最常用的内核调试手段是printk。但printk并不是所有情况都好用,比如打印的数据可能过多,我们真正关心的数据在大量的输出里不是那么一目转载 2014-09-04 16:06:55 · 700 阅读 · 0 评论 -
自己动手实现arm函数栈帧回溯
内核版本:2.6.14glibc版本:2.3.6CPU平台:armglic中其实有这些函数,当时用的uclib版本较低,没有这些函数,但又需要,只能自己实现了(较高的版本应该有这些函数,换版本很麻烦),而且可以加深自己对这方面的理解.原理性的东西就不深入讲解了,直接上例子![plain] view plaincopyprint?#in转载 2014-01-22 18:10:41 · 3101 阅读 · 0 评论 -
搜索Kconfig
当想查找所有Kconfig文件中有谁引用了rt2860v2_sta是使用如下查找命令grep -nr --include="Kconfig*" "rt2860v2_sta" .原创 2013-10-10 15:47:44 · 965 阅读 · 1 评论 -
inotify -- Linux 2.6 内核中的文件系统变化通知机制
一、 引言众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、udev 和 inotify 就是这种需求催生的。Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发生的转载 2013-09-12 09:24:28 · 1019 阅读 · 0 评论 -
softirq(软中断)下半部中tasklet与workqueue的区别,整合
一、中断处理的tasklet(小任务)机制中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求原创 2013-08-23 18:57:28 · 6934 阅读 · 0 评论 -
对INIT_WORK的理解
以前内核里对这个函数是这样定义的 #define INIT_WORK(_work, _func, _data),可以理解为INIT_WORK会在你定义的_work工作队列里面增加一个工作任务,该任务就是_func。_func这个任务会需要一些数据作为参数,这个参数就是通过_data传递的。而现在看驱动的时候你会发现调用INIT_WORK的时候是只有两个参数,去掉了数据的部分。也许你会问怎么传递转载 2013-08-23 11:32:07 · 1564 阅读 · 0 评论 -
浅谈Linux的内存管理机制
一 物理内存和虚拟内存我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘原创 2013-08-01 19:04:42 · 1125 阅读 · 0 评论 -
linux内核调试技巧之一 dump_stack
在内核中代码调用过程难以跟踪,上下文关系复杂,确实让人头痛调用dump_stack()就会打印当前cpu的堆栈的调用函数了。如此,一目了然的就能看到当前上下文环境,调用关系了原创 2013-07-23 10:48:15 · 24185 阅读 · 1 评论 -
gpio模拟I2C
开发中经常与i2c打交道,芯片中自带的硬件i2c控制器使用起来并不是很灵活,而且要研究半天的寄存器。所以干脆搞一个软件模拟gpio的通用代码,移植起来也方便,使用灵活具体代码如下: #include #include #include #include #include #include #include #include #include #原创 2013-06-13 13:57:13 · 3663 阅读 · 0 评论 -
手动调整内核printk打印级别
手动调整内核printk打印级别有时调试内核模块,打印信息太多了,可以通过修改/proc/sys/kernel/printk文件内容来控制。默认设置是6 4 1 7# cat /proc/sys/kernel/printk7 4 1 7#该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请查阅syslog(2)联机帮助。上面显转载 2013-03-24 15:44:15 · 1273 阅读 · 0 评论 -
再论mdev和热插拔
udev实现U盘或SD卡的自动挂载,在这里我们再说一下怎样用mdev实现这个功能。mdev的使用在busybox中的mdev.txt文档已经将得很详细了。mdev是busybox中的一个udev管理程序的一个精简版,他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的 ACTIO转载 2013-04-03 19:02:23 · 1113 阅读 · 0 评论 -
关于热插拔usb hotplug /proc/sys/kernel mdev udev busybox
这篇文章说的很好http://blog.chinaunix.net/u1/38994/showart_2022040.html:如何使用busybox精简版本udev程序--mdev动态创建插入的u盘和鼠标等设备busybox的mdev是一个精简了的udev管理程序,它可以间接的以hotplug方式被内核调用,进而在arm平台上/dev目录下动态创建设备节点,因为hotplug会被转载 2013-04-03 19:01:50 · 1489 阅读 · 0 评论 -
简单的procfs模型
#include #include #include #include #include static struct proc_dir_entry *root, *jiffies_file, *kbuf_file, *symlink,*symlink;//struct fb_data_t foo_data,bar_data;static ssize_原创 2014-09-10 10:57:36 · 1119 阅读 · 0 评论 -
翻译:Linux的电源管理架构
设备电源管理Copyright (c) 2010 Rafael J. Wysocki, Novell Inc.Copyright (c) 2010 Alan Sternstern@rowland.harvard.edu *************************************************************本文由DroidP转载 2014-12-17 17:27:26 · 768 阅读 · 0 评论 -
android 休眠唤醒机制分析(一) — wake_lock
Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统仍然需要正常运行的情况下使用,比如听歌、传输很大的文件等。本文主要分析driver层wake_lock的实现。一、wake_lock 定义和接口[cpp] view转载 2014-12-17 18:11:58 · 2039 阅读 · 0 评论 -
zynq PS侧DMA驱动
linux中,驱动必然会有驱动对应的设备类型。在linux4.4版本中,其设备是以设备树的形式展现的。PS端设备树的devicetree表示如下324 dmac_s: dmac@f8003000 { 325 compatible = "arm,pl330", "arm,primecell"; 326 reg =...转载 2019-08-30 20:28:01 · 1629 阅读 · 0 评论 -
和菜鸟一起学linux总线驱动之DMA传输
DMA的工作过程:对于嵌入式中的DMA,其实是在写数据寄存器的时候用dma的传输来代替。就像i2c设备,在发送和接收数据的时候都是要往数据寄存器中写数据的。比如那个寄存器是I2C_DATA,如果用cpu来传输的话就是writel(data, I2C_DATA);而用dma传输就是配置好要传输的buf长度,然后源地址就是buf的地址,目标地址就是I2C_DATA。...转载 2019-08-30 09:11:13 · 640 阅读 · 0 评论 -
Linux 4.0的dmaengine编程
在Linux 4.0下进行dmaengine的编程主要分为两部分,DMA Engine控制器编程和DMA Engine API编程。DMA Engine API编程slave DMA用法包括以下的步骤:1. 分配一个DMA slave通道;2. 设置slave和controller特定的参数;3. 获取一个传输描述符;4. 提交传输描述符;5. 发起等待的请求并等待回调...转载 2019-08-30 09:10:14 · 991 阅读 · 1 评论 -
linux dmaengine编程
开发板:A33,运行linux-3.4.39主机:Ubuntu 14.04----------------------------------------------DMA是Direct Memory Access的缩写,顾名思义,就是绕开CPU直接访问memory的意思。在计算机中,相比CPU,memory和外设的速度是非常慢的,因而在memory和memory(或者memor...转载 2019-08-30 09:09:40 · 622 阅读 · 0 评论 -
linux内核之dmaengine
dmaengine framwork主要分为两部分:DMA controller 和DMA engine API。涉及内核相关文档:Documentation/damengine目录、Documentation/devicetree/bindings/dma/、Documentation/DAM-API-HOWTO.txt\DMA-API.txt\DMA-attributes.txt1、dma...转载 2019-08-30 09:08:28 · 1250 阅读 · 1 评论 -
Linux 下的DMA浅析
DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。一、DMA控制器硬件结构DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。...转载 2019-08-30 09:07:39 · 460 阅读 · 0 评论 -
Linux内核中常见内存分配函数
Linux内核中常见内存分配函数1.原理说明Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表分别为:页全局目录(Page Global Directory)页上级目录(Page Upper Directory)页中间目...转载 2019-08-29 18:09:47 · 411 阅读 · 0 评论 -
linux驱动 mmap映射多块地址
mmap函数的使用,与驱动中mmap函数的实现mmap怎样使用,怎样实现,为什么mmap可以减少额外的拷贝?下面简单介绍。一、mmap的使用*内存映射:#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);i...原创 2019-08-27 20:53:48 · 1265 阅读 · 0 评论 -
Linux驱动mmap内存映射
什么是mmap?上图说了,mmap是操作这些设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED)、LCD控制器、磁盘控制器,实际上就是往设备的物理地址读写数据。但是,由于应用程序不能直接操作设备硬件地址,所以操作系统提供了这样的一种机制——内存映射,把设备地址映射到进程虚拟地址,mmap就是实现内存映射的接口。操作设备还有很多方法,如ioctl、ioremapmmap的...转载 2019-08-27 19:38:25 · 359 阅读 · 0 评论 -
DTS中dma详解
通用DMA控制器和DMA请求绑定DMA控制器的DTS 文件必要参数:- #dma-cells: 必须至少为1。用于提供DMA控制器的特定信息。有关详细信息,请参阅下面的DMA客户机绑定。可选参数:- dma-channels: 控制器支持的DMA信道数。- dma-requests: 控制器支持的DMA请求信号数量。例子: dma: dm...原创 2019-08-15 20:37:51 · 4262 阅读 · 0 评论 -
linux USB从设备使用gadget实现大容量存储设备
硬件平台:fresscale iMX6Qlinux内核版本4.1.15Gadget 框架提出了一套标准API, 在底层, USB 设备控制器 (USB Device Controller, UDC) 驱动则实现这一套 API, 不同的 UDC (通常是 SOC 的一部分) 需要不同的驱动, 甚至基于同样的 UDC 的不同板子也需要进行代码修改。这一层我们可以称之为平台相关层。Linux-USB G...原创 2018-07-02 19:35:10 · 16559 阅读 · 7 评论 -
android 休眠唤醒机制分析(三) — suspend
前面我们分析了休眠的第一个阶段即浅度休眠,现在我们继续看休眠的第二个阶段 — 深度休眠。在深度休眠的过程中系统会首先冻结所有可以冻结的进程,然后依次挂起所有设备的电源,挂起顺序与设备注册的顺序相反,这样保证了设备之间电源的依赖性;直至最后进入省电模式,等待用户或者RTC唤醒;在唤醒过程中则会按照设备注册的顺序依次恢复每个设备的电源进入正常工作状态,解冻相关的进程,然后再进行浅度休眠的唤醒流程。转载 2014-12-17 18:14:42 · 1034 阅读 · 0 评论 -
android 休眠唤醒机制分析(二) — early_suspend
early_suspend是Android休眠流程的第一阶段即浅度休眠,不会受到wake_lock的阻止,一般用于关闭lcd、tp等设备为运行的应用节约电能。Android的PowerManagerService会根据用户的操作情况调整电源状态,如果需要休眠则会调用到HAL层的set_screen_state()接口,在set_screen_state()中会向/sys/power/state节点转载 2014-12-17 18:13:22 · 893 阅读 · 0 评论 -
linux中的热插拔和mdev机制
mdev是busybox自带的一个简化版的udev作用是在系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点用转载 2013-04-03 19:00:03 · 4195 阅读 · 0 评论 -
嵌入式Linux用mdev实现U盘自动挂载
在ARM嵌入式Linux下,要让U盘自动挂载,可以用到mdev方式实现(mdev是busybox中的一个udev管理程序的一个精简版,它可以实现设备节点的自动创建和设备的自动挂载),下面是实现的步骤: 1、确认Busybox做的根文件系统如下选项有选中: Linux System Utilities ---> [*] m转载 2013-04-03 18:34:20 · 3901 阅读 · 0 评论 -
Linux设备模型学习参考方法
看LDD3中设备模型一章,觉得思维有些混乱。这里从整体的角度来理理思路。 本文从四个方面来总结一些内容: 1.底层数据结构:kobject,kset. 2.linux设备模型层次关系:bus_type,device,device_driver. 3.集成:PCI设备驱动模型实例及设备,设备驱动注册源码的简单分析. 4.面向对象的思想在linux设备模型中的应用分析.转载 2012-10-31 22:52:36 · 470 阅读 · 0 评论 -
linux platform 驱动模型分析
一。 概述 platform设备和驱动与linux设备模型密切相关。platform在linux设备模型中,其实就是一种虚拟总线没有对应的硬件结构。它的主要作用就是管理系统的外设资源,比如io内存,中断信号线。现在大多数处理器芯片都是soc,如s3c2440,它包括处理器内核(arm920t)和系统的外设(lcd接口,nandflash接口等)。linux在引入了platform机制之后,内转载 2012-10-31 22:51:29 · 452 阅读 · 0 评论 -
Input子系统分析
1认识和使用 input 事件:1.1Linux input 驱动分类Input驱动程序是Linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)和事件设备(Event queue)3种驱动程序。其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。Input驱动程序的主设备号是13,驱动程序的设备号分配如下所示。 joy转载 2012-10-31 19:55:34 · 498 阅读 · 0 评论 -
remap_pfn_range()详解
remap_pfn_range()函数的原型:int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);该函数的功能是创建页表。其中参数vma是内核根据用户的请求自己填写的,而参数addr表示转载 2012-10-30 17:55:03 · 3417 阅读 · 0 评论 -
copy_to_user、copy_from_user 分析
在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成用户空间到内核空间的复制,函数copy_from_user()完成内核空间到用户空间的复制。下面我们来仔细的理一下这两个函转载 2012-10-30 14:37:30 · 737 阅读 · 0 评论 -
Linux进程的睡眠和唤醒
1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数schedule()是一个调度函数,它可以被一个进转载 2012-10-29 17:57:09 · 436 阅读 · 0 评论 -
内核竞态与抢占
最古老的操作系统是单进程的。后来出现了多任务操作系统,因为多进程在内核态中资源都是共享的,所以容易造成破坏,早期的进程调度器在内核态是不能被抢占的,在进入内核态的时候进程调度器停止调度,这样降低了内核的复杂程度。稳定性也相对较高,服务器中常用。更先进的内核,能够在内核态抢占,这就需要锁来保证内核线程间的同步以下用两段代码说明第一种 非竞态内核static int test_init(v原创 2012-10-18 18:18:04 · 763 阅读 · 0 评论 -
LDREX and STREX
最近看linux关于atomic的实现的代码(asm/atomic.h)发现大量使用了LDREX和STREX(ARM体系结构),现将这两个指令的用法总结如下。详细用法 http://www.keil.com/support/man/docs/armasm/armasm_cihbghef.htm Syntax:LDREX{cond} Rt, [Rn {, #offset}]S转载 2012-10-19 10:37:31 · 1401 阅读 · 0 评论