
linux驱动由浅入深系列
文章平均质量分 89
本系列博文涉及从按键、led起步到sensor、usb、网络、音频、摄像头、LCD、文件系统、log分析方法、kernel panic等等调试经验。每篇博文附有详细的代码分析和相关流程图。
博文陆续更新以来收到大量志同道合的朋友点赞、关注,如今再次整理后发布,希望能够以更有条理的形式呈现。
优惠券已抵扣
余额抵扣
还需支付
¥39.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
青轻浅
AI 产品开发探路人,Linux 内核专家。
AI编程时代,更多好的想法应当被实现出来!
展开
-
PCIe的内存地址空间、I/O地址空间和配置地址空间
PCIe的内存地址空间、I/O地址空间和配置地址空间pci设备与其它接口的设备(如i2c设备)最大的不同是存在内存地址空间和配置地址空间,本文分析一下它们的用途。首先区分一下IO空间和内存空间cpu会访问的设备一般有内存和外设寄存器,如下图所示。x86架构采用独立编址将内存操作与外设IO操作分开了才有了内存空间和IO空间的区分。x86平台cpu内部对内存和外设寄存器访问的指令也是不同的。...原创 2018-08-12 18:07:14 · 12767 阅读 · 4 评论 -
linux移植过程概述(linux移植的全局认识并非step by step的教程)
本文简述一下对linux移植过程的全局认识并非step by step的教程想让linux在一个板子上跑起来需要做什么?需要做三件事1.移植uboot适配板子 2.调试kernel中各类驱动 3.构建根文件系统。为什么需要uboot?内核虽然强大,但是不能开机自动完全从零开始启动的,内核启动还是需要别人帮忙的。uboot为kernel启动创造各种条件,帮助内核实现重定位原创 2017-10-24 20:11:36 · 1729 阅读 · 1 评论 -
高通平台启动log概述(PBL log、sbl1 log、kernel log)
高通平台启动log概述(PBL log、sbl1 log、kernel log)在嵌入式linux的调试过程中log有着至关重要的地位,等同于医生的CT报告。能够熟悉启动各个阶段的log,如PBL阶段,sbl1阶段,kernel阶段,android阶段,对于分析定位问题有着重要的作用。本文以高通msm8937平台android启动的串口log为例简要介绍一下log相关的技巧和对log的概要介绍原创 2017-11-01 18:02:09 · 18260 阅读 · 2 评论 -
LK(little kernel)第一行代码链接位置分析及lk启动过程
LK是(L)ittle (K)ernel的缩写,是一个功能及其强大的bootloader开源项目,但现在只支持arm和x86平台。LK的一个显著的特点就是它实现了一个简单的线程机制(thread),和对高通处理器的深度定制和使用。因此高通平台android普遍采用LK作为其bootloader。但是,LK只是整个系统的引导部分。1,lk的代码链接方式以及第一行代码的位置本文以高通平台为原创 2017-10-30 15:02:53 · 5374 阅读 · 1 评论 -
linux驱动由浅入深系列:usb子系统之四(android平台鼠标驱动代码分析)
android上的usb口是支持OTG(on the go)的,USB OTG既可以作为Host又可以作为Device,我们本文来看一下android手机作为Host连接鼠标的情况。OTG是如何做到既可以做Host又可以作为Device的呢标准usb接头中有四根线:vbus,gnd,dp(d+),dm(d-),android手机上的usb为miniUSB接口增加了一根id线,用来区分Hos原创 2017-10-18 17:30:25 · 2479 阅读 · 0 评论 -
linux/android代码中对于不同项目中conf、dts、defconfig文件的处理方法
本文以高通平台为例(代码 android oreo),介绍几种在不同项目公用一套代码时对于conf文件、dts、defconfig文件的处理方法一、不同项目共用一套代码时,其中一些conf配置文件在项目间又有差异的处理方法1,在device下给每个项目建一个单独文件夹存放不同的配置文件2,在mk文件中根据不同的项目宏进行copy例子:1,在device\qcom\msm89原创 2017-10-18 10:36:30 · 3724 阅读 · 0 评论 -
linux模块(module_init)、子系统(subsys_initcall)入口函数详解
linux内核代码是以模块(module)和子系统(subsys)为单元的层次结构。在写模块代码时我们知道入口函数是module_init()或subsys_initcall(),在linux启动时会被调用,这其中更为详细的前因后果是什么呢,一起来了解一下。一,linux模块程序示例下面是一个linux模块的示例程序:#include #include MODUL原创 2017-09-12 11:13:55 · 2819 阅读 · 0 评论 -
linux驱动由浅入深系列:usb子系统之三(usb系统中的设备、配置、接口、端点概念及代码解释)
一个usb设备对应一个或多个配置一个配置包含一个或多个usb接口一个usb接口可能存在一种或多种设置一个设置会使用零个或多个usb端点设备设备就是一个usb物理设备,一个usb设备可以只包含一个简单功能的device,也可以包含一个由hub连接的多个设备,叫作复合设备。接口与端点的概念较为清晰端点端点是host或device中具有独立控制usb总线能力的最小物理原创 2017-09-26 20:52:04 · 2018 阅读 · 0 评论 -
linux设备驱动uevent详解,高通平台battery上报电量实例
本文以高通平台上的android系统为参照展开探讨。1,uevent是什么呢?uevent是一种linux设备模型中的一个组成部分。kseg中包含的uevent_ops结构体拥有uevent的操作函数。uevent可以在设备发生变化时主动通知应用层。是对普通先注册设备后注册驱动模式的一种补充。一般用作usb设备的自动驱动加载、电池电量上报等。2,uevent主动通知应用层的原创 2017-09-18 20:46:17 · 9323 阅读 · 1 评论 -
linux驱动由浅入深系列:高通sensor架构实例分析之一
最初的时候芯片厂家对sensor的处理都是直接挂在processor上,sensor的驱动也和其他linux或android的驱动一样,生成对应的设备节点给上层提供数据(关于此类linux基础驱动的知识,可以参考本博客其他博文)。但后来这一切发生了变化,最主要的原因就是功耗。Sensor希望自己能够一直处理工作状态下,如计步器等应用场景。这样如果sensor还挂在主processor上(这时候处理原创 2017-06-19 16:25:27 · 30686 阅读 · 11 评论 -
linux驱动由浅入深系列:usb子系统之一(域、包、事务、传输的基本概念)
本文从usb协议的物理层讲起,对usb建立一个整体的概念再进行逐步细化。下图是usb2.0协议的物理层连线,其中包括一根地线、一根电源线(在usb2.0中电源线仅支持到5V 500mA,目前随着人们需求的日益膨胀,usb线提供的供电能力正在不断增加)、两根差分数据线DP、DM(使用差分线的好处是增加抗干扰能力,能够更快速的串行传输数据,这个有概念就可以了,在此不做深入探讨)。USB原创 2017-02-27 11:46:28 · 1969 阅读 · 1 评论 -
sys文件系统中文件、文件夹与kobject、kset、kobj_type的对应关系
网上对sys文件系统与kobject的文章很多,但对初学者的我越看越乱。几经辗转总结出如下结论,如有误恳请讨论指出,直接给出:1,kobject,kset对应sysfs里面的文件夹,目录的名字就是结构体中的 name2,kobj_type对应sysfs里面的文件,这些文件是kobject的属性的外在表现3,kobject是linux设备树的核心结构体,整个设备树都是围绕kobject建原创 2017-09-14 19:45:05 · 1245 阅读 · 0 评论 -
linux中netlink机制的实例讲解
netlink作为内核层与用户层双向通信的交互机制广泛的应用在网络驱动及字符驱动的uevent机制中。Netlink 相对于系统调用,ioctl 以及 /proc文件系统而言具有以下优点:1,netlink使用简单,只需要在include/linux/netlink.h中增加一个新类型的 netlink 协议定义即可,就是定义一个还未使用的整数。2. netlink是一种异步通信机制,原创 2017-11-28 17:52:14 · 1698 阅读 · 0 评论 -
linux驱动由浅入深系列:显示子系统之二(高通平台lcd驱动代码分析)
在上一篇文章中我们初步了解了lcd对应用层提供的接口-framebuffer,以及应用层通过fb在lcd上画图的示例。本文我们来看一下驱动层的相关逻辑,主要介绍几个核心数据结构fb_info, fb_var_screeninfo, fb_fix_screeninfo,以及framebuffer设备注册的过程,framebuffer大小的确定。我们从kernel中lcd最核心的一个文件看起k原创 2017-11-06 15:30:29 · 2761 阅读 · 0 评论 -
linux驱动由浅入深系列:块设备驱动之三(块设备驱动结构分析,以mmc为例)
linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(从用户空间的read、write到实际设备物理操作整体架构分析)linux驱动由浅入深系列:块设备驱动之三(块设备驱动结构分析,以mmc为例)前一篇文章介绍了块设备驱动在linux框架张的位置关系,本文来分析一下驱动本身。块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅...原创 2018-06-06 15:27:50 · 2677 阅读 · 0 评论 -
文件系统系列之一:fat文件系统的结构分析
在这个系类的开篇还是先说一下文件系统是什么吧。首先来介绍一下对u盘的格式化这个操作,格式化不是仅仅删除了所有文件,还为接下的来文件存储约定了一种存放格式,这种约定的文件存放格式就叫做文件系统。再用最通俗的说法简要介绍一下,磁盘如sd卡只能存放0和1这两种二进制状态序列,数字文件本质上也是一串0和1的序列。那么磁盘存储文件怎么存放呢?你说这个简单,把一个个的文件紧挨着排列在磁盘中不就可以了吗。那么,...原创 2018-02-28 21:05:08 · 5607 阅读 · 0 评论 -
linux驱动由浅入深系列:显示子系统之二(基于android的分析)
上一篇文章中介绍了应用层对显示系统的使用,我们操作framebuffer在屏幕上画出了图形。这次我们一起来看一下android中显示子系统各个模块的功能。android系统音频系统在高通平台上的框图:HWUIUI硬件加速,从Androd 3.0(Honeycomb)开始,Android开始支持hwui。OpenGLOpenGL(全写Open Graphics Library)是个定义了一个跨编程语...原创 2018-03-04 22:30:20 · 2848 阅读 · 0 评论 -
内存管理分析之三:了解这些概念就了解了整个MMU机制
内存管理分析之一:Linux进程空间与虚拟地址的好处内存管理分析之二:MMU机制在进程中使用时的一些问题内存管理分析之三:了解这些概念就了解了整个MMU机制MMU的作用1,完成虚拟地址到物理地址的转换2,地址访问控制,地址保护页:最小的映射单位,32位系统一般为4k页帧:物理内存中的一页称为页帧页表:虚拟内存与物理内存的映射规则PTE:页表项(page table entry PTE),页表由一条...原创 2018-02-25 17:17:01 · 1674 阅读 · 0 评论 -
linux驱动由浅入深系列:ALSA框架详解 音频子系统之二
linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一linux驱动由浅入深系列:ALSA框架详解 音频子系统之二本文以高通平台为例,介绍一下android下的音频结构。android使用的是tinyALSA作为音频系统,使用方法和基本框架与linux中常用的ALSA音频子系统是一致的。ALSA音频框架ALSA(Adv...原创 2018-03-04 14:22:10 · 15509 阅读 · 4 评论 -
linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)
在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构。本文以高通+android平台为示例,首先看一下整体框图:这张图是从整体上来看的1,图中最下面的是kernel层的驱动,其中按照V4L2架构实现了camera sensor等驱动,向用户空间提供/dev/video0节点2,在往上是HAL层,高通代码实现了对/dev/video0的基本操作,对接了andro...原创 2018-03-11 13:53:05 · 11798 阅读 · 1 评论 -
文件系统系列之二:ext3/vfs文件系统的结构分析
在上一篇文章中,我们介绍了基本的文件系统概念和SD卡中常用的FAT32文件系统。在有了上文的基础,我们这次来学习一下linux中默认的ext文件系统。ext文件系统是为linux量身打造的,因此和linux的虚拟文件系统(VFS)在基础概念上基本是一致的,本文也顺带介绍一下vfs。vfs能适配十几种不同类型的文件系统,如上文介绍的FAT等。vfs进行适配的原理是在内存中讲FAT文件系统的FAT、F...原创 2018-03-02 00:50:20 · 1930 阅读 · 0 评论 -
linux驱动由浅入深系列:块设备驱动之二(从用户空间的read、write到实际设备物理操作整体架构分析)
linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(块设备驱动结构分析)在第一篇文章中介绍了块设备在应用层的操作,本文一起了解一下块设备驱动的结构:1,用户空间使用统一的读写函数操作所有块设备2,虚拟文件系统屏蔽了磁盘上各种不同文件系统的差异,为用户空间提供统一的操作3,Cache当用户发起文件访问请求的时候,首先回到Disk Cache中...原创 2018-03-07 00:33:16 · 2735 阅读 · 0 评论 -
linux内核panic/oops/crash分析(addr2line,objdump,gdb)
panic、oops、crash都是指linux kernel层发生了内核无法处理的异常。应用层编程只会造成该进程的崩溃,内核层的编程如驱动代码中的异常最严重的情况会导致内核panic。那怎样处理呢?内核panic后有dump机制会打印出目前的所有寄存器,以便于分析异常原因。我们经常用到的工具为addr2line,objdump,gdbaddr2line可以将出错代码地址转转换原创 2017-12-01 16:23:57 · 7945 阅读 · 0 评论 -
linux网络驱动分析
网络驱动与字符驱动和块驱动最大的区别在于没有设备节点,这也是linux中一切皆文件的一个例外。网络设备没有设备节点,那么给应用层提供的操作方式是怎么的呢?答案是-系统调用。如我们在网络编程中经常用到的socket(),bind(),listen(),accept()。下面这张图展示了从应用层发起系统调用到驱动层的调用过程。应用层调用socket()本质上是一个glibc中的函数,执行实原创 2017-12-08 18:11:50 · 1434 阅读 · 0 评论 -
linux系统调用实现的介绍
操作系统负责资源管理,当应用层需要使用资源时就需要向内核发起系统调用。如读取问题时发起syscall_read系统调用,建立socket时发起syscall_socket等等内核完成引导后,就处于等待处理各种中断的状态下,以实现对硬件资源的管理,对上层请求的相应。能够触发内核相应的有三类1,系统调用,是基于软件中断实现的,应用层向内核层发起请求的方式2,异常,如缺页异常,使虚拟地址原创 2017-12-08 14:24:51 · 1919 阅读 · 0 评论 -
android AP侧通过sensor_class挂载sensor的一种方案
1.引言1.1背景目前android上对sensor的处理是将其挂载到类似于sensorhub的独立处理单元上与AP分离,这样便于解决功耗问题。高通平台也类似的将sensor挂在了adsp上,但特定需求下还是希望sensor能够挂载到AP下,并且对上层隐藏这种差异,可以使用相同的处理流程。本文介绍一种使用以input设备为基础的sensor_class抽象类在AP侧挂载sensor的方法。原创 2017-09-05 19:38:37 · 4197 阅读 · 2 评论 -
linux双向链表List结构分析
双向链表是linux内核中的一个核心数据结构,由于其运用场景众多如task列表、设备列表等等,因此内核将其操作逻辑独立了出来。下面我们以i2c的设备树列表为例来看一下List列表的使用方法。如图所示,双向链表不包含任何数据,在使用时,将其嵌入到目标结构体中使用。且第一个list_head不与数据机构体关联,作为整个链表的起始。List的实现代码在kernel\include\linux原创 2017-09-13 17:16:26 · 1092 阅读 · 0 评论 -
jz2440资源整理
近期周末没事儿,看到之前的一块jz2440开发板一直闲着,就想拿来做点东西原创 2014-10-26 13:36:02 · 1751 阅读 · 0 评论 -
linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)
对于嵌入式工程师了解芯片启动过程是十分有必要的,在分析、调试各种问题的时候都有可能涉及到这方面的知识。同时这部分知识也是比较复杂的,因为其中涉及到芯片内部架构,启动各个阶段软件代码执行顺序,启动模式等等。下面以比较常用的Qualcomm MSM8953芯片的启动过程为例,进行宏观分析(大部分翻译了高通的手册^-^),下一篇文章进行代码分析。可以看到MSM8953中的处理器有5个,分翻译 2017-06-14 14:59:47 · 16558 阅读 · 3 评论 -
linux驱动由浅入深系列:中断申请及下半部处理机制
1, 中断申请使用request_irq函数向系统申请中断。intrequest_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)irq是要申请的硬件中断号。handler是原创 2017-03-03 18:09:52 · 884 阅读 · 0 评论 -
linux驱动由浅入深系列:显示子系统之一(通过FrameBuffer在屏幕上画出图形)
显示子系统对应用层提供的接口叫做framebuffer,一般位于/dev/fb0(下文示例运行于adroid的平台位于/dev/graphics/fb0,不过它们都是一样的),它为上层提供了统一的对显卡的描述。首先要明确的是lcd显示子系统虽然复杂,但其任然是基本的字符设备,fb0就是其设备节点,主设备号29。不同之处在于,可以通过mmap(mmap将一个文件或者其它对象映射进内存。)对其进行地址原创 2017-03-02 16:59:17 · 4632 阅读 · 1 评论 -
linux驱动由浅入深系列:驱动程序的基本结构概览之一(第一个驱动程序)
提到linux驱动程序,首先应该知道它是linux的内核模块。那么想要编写驱动程序,就要首先认识一下linux的内核模块机制。Linux内核模块是使得复杂而庞大的linux内核条理清晰、可裁剪、高兼容性的重要特性。Linux内核模块的特点:1, 模块本身不被编译进内核镜像,能够控制内核的大小。2, 模块可以在需要的时候中被动态加载,一旦加载完成就和内核其它部分完全一样。 下原创 2017-02-16 15:54:39 · 7579 阅读 · 0 评论 -
linux驱动由浅入深系列:驱动程序的基本结构概览之二(详解驱动注册过程)
上一篇文章使用了misc_register函数注册字符设备,这篇文章使用基本的字符设备接口申请设备号、创建dev文件来展示一下细节部分:#include #include #include #include #include #include #include #include #include #include #define DRIVER_NAME "hello"原创 2017-03-06 12:10:51 · 1975 阅读 · 0 评论 -
linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)
在上一篇文章中我们大致了解了linux input subsystem的功能用应用层的使用,本文我们一起来看一看驱动代码的编写。在“linux驱动由浅入深系列:驱动程序的基本结构概览”一文中已经解释的驱动程序的基本结构,今天我们以上一篇文章中的程序为基本结构,添加相关内容来构成一个gpio按键的驱动程序。先来看看修改完后的代码:#include #include #include原创 2017-02-21 17:44:10 · 4462 阅读 · 1 评论 -
linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)
在上一篇文章中编写了gpio_key的驱动,可以看到每次gpio_key按下会上报event到/dev/input /event7节点。其实在应用层是可以完全模拟出这个按键过程的,原理是向EV_KEY类型的eventX消息节点write event将会被重新返回到eventX节点上,产生与按键按下相同的效果。(另外EV_LED、EV_SND类型的event通道驱动层会有对应的消息处理函数去点亮le原创 2017-02-22 16:00:59 · 3457 阅读 · 0 评论 -
linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一
linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一linux驱动由浅入深系列:ALSA框架详解 音频子系统之二目前linux中主流的音频体系结构是ALSA(Advanced Linux Sound Architecture),ALSA在内核驱动层提供了alsa-driver,在应用层提供了alsa-lib,应用程序...原创 2017-03-20 14:51:21 · 25877 阅读 · 5 评论 -
linux驱动由浅入深系列:usb子系统之二(枚举过程)
在上一篇文章中我们知道了usb协议中的域、包、事务、传输的基本概念,下面我们来看看usb第一个通信过程—枚举。枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。这部分内容同上一篇文章一样,是一些接近物理层的过程,而且其中大部分细节都由硬件模块完成,对于linux驱动工程师来说只需要了解,并不用深陷其中无法自拔。(这部分PHY层细节原创 2017-02-27 17:38:36 · 1396 阅读 · 0 评论 -
linux驱动由浅入深系列: 驱动中获取设备结构体中定义的数据
linux内核2.6版以后,驱动模型统一为设备、驱动、总线的结构。即一个linux设备或驱动都是要挂载到一种总线上的,如常见的usb、pci、i2c等,对于SoC系统内部的控制器使用platform虚拟总线。这样platform机制将设备本身的资源(如gpio、irq、mem)注册进内核,由内核统一管理,当驱动中需要使用设备的资源时,可以由统一的接口。不管是设备还是驱动,都是挂接在某条总线上的原创 2017-03-03 15:17:12 · 1831 阅读 · 0 评论 -
jz2440的启动
在上一篇中我们整理了jz2440的硬件资源,原创 2014-11-08 14:22:38 · 1570 阅读 · 0 评论 -
linux下的两种层次的控制台及打印级别
在嵌入式调试过程中查看各种log是十分重要的,而串口控制终端能够显示内核log,但是通过网络或adb shell连接的控制台只能显示用户空间的log,这两种控制台有什么区别呢?今天来区分一下kernel层log与应用层log,及打印级别。linux控制台分为两种:一种是kernel级别的控制台,一般为uboot启动时通过cmdline传递给kernel的,这个kernel级别控制台能够打印原创 2017-02-23 15:14:42 · 8034 阅读 · 0 评论