- 博客(102)
- 资源 (1)
- 收藏
- 关注

原创 线索二叉树和中序非递归遍历线索化后的二叉树
//线索二叉树#include#include#include#define OVERFLOW -2//二叉树的二叉线索存储结构enum PointerTag{Link,Thread}; //枚举类型,Link(0):指针,Thread(1):线索struct BiThrNode{ char data; BiThrNode *lchild,*rchild;//左右孩子指针
2015-10-25 12:19:40
4082
原创 Linux内核链表
***/list_is_last 用于检测一个节点 list 是否为链表 head 中的最后一个节点。换句话说,它检查指定的节点的下一个节点是否指向链表头,从而确定该节点是否是链表中的最后一个有效节点。如果节点 list 是链表中的最后一个节点,则返回 true(非零值),否则返回 false(0)。
2025-01-04 11:19:57
811
原创 (八)- mipi dsi
MIPI DSI 屏幕目前广泛应用于手机、平板等产品中,尤其是高清屏幕基本都是采用 MIPI DSI 接口,比如 1080P、2K 级的屏幕。一般低端 ARM 芯片,会提供 RGB 接口来驱动 LCD,中高端 ARM 芯片会提供 MIPI DSI 接口。DSI 全称是 Display Serial InterfaceMIPI:Mobile Industry Processor Interface,移动产业处理器接口MIPI DSI(显示屏接口)MIPI CSI(摄像头接口)MIPI I3C。
2024-12-28 00:01:15
1619
原创 (七)- plane/crtc/encoder/connector objects
1,framebuffer/planeRockchip RK3399 - DRM framebuffer、plane基础知识 - 大奥特曼打小怪兽 - 博客园2,crtcRockchip RK3399 - DRM crtc基础知识 - 大奥特曼打小怪兽 - 博客园3,encoder/connector/bridgeRockchip RK3399 - DRM encoder、bridge、connector基础知识 - 大奥特曼打小怪兽 - 博客园
2024-12-27 23:35:00
503
原创 (六)- DRM驱动开发(qcom)
CRTC: 主要用于显示控制,如display timings,resolution的配置,将framebuffer内容送到display,更新framebuffer等。Encoder: 将数据转换成合适的格式,送给connector,比如HDMI需要TMDS信息, encoder就将数据转成HDMI需要的TMDS格式。Connector: 代表具体外部接口,如edp, hdmi, mipi等。1.4 ,plane/CRTC/encoder/connector对应的硬件。
2024-12-18 22:21:12
1313
原创 (五)- DRM驱动开发(VKMS)
VKMS 是 “Virtual Kernel Mode Setting” 的缩写,它于2018年7月5日被合入到 linux-4.19 主线版本中,并存放在 drivers/gpu/drm/vkms 目录下。之所以称它为 Virtual KMS,是因为该驱动不需要真实的硬件,它完全是一个软件虚拟的“显示”设备,甚至连显示都算不上,因为当它运行时,你看不到任何显示内容。它唯一能提供的,就是一个由高精度 timer 模拟的 VSYNC 中断信号!
2024-12-18 21:58:21
1233
原创 (四)- DRM驱动基础
具体实现函数drm_framebuffer_init、drm_universal_plane_init、drm_crtc_init_with_planes、drm_encoder_init、drm_connector_init我们在后面章节单独介绍。drm_dev_register函数向内核注册一个drm设备,同时在用户空间创建drm设备节点/dev/dri/card%d /dev/dri/renderD%d,函数定义在drivers/gpu/drm/drm_drv.c;
2024-12-18 21:40:10
1079
原创 (三) - DRM驱动常用结构体
对于plane、crtc、encoder、connector几个对象,它们有一个公共基类struct drm_mode_object,这几个对象都由此基类扩展而来(该类作为crtc等结构体的成员)。事实上这个基类扩展出来的子类并不是只有上面提到的几种,只不过这四种比较常见。
2024-11-25 21:54:38
1109
原创 (二) - component框架
linux内核中的驱动,需要有一定的加载顺序,用来解决驱动之间的依赖问题。虽然说linux内核有定传统的驱动优先级,用来定义驱动的先后顺序,但是不足以更加细分的加载。有的驱动可以独立加载而不依赖于其他驱动,但是在一个比较庞大的驱动面前,细分驱动的加载就比较重要了,因为这些庞大的驱动,环环相扣,一环出了问题就影响整个驱动的顺利走完。所以component架构构建功能系统就包括两方面的作用:保证系统安装了所有的组件;规定了系统各组件初始化的顺序;
2024-11-25 21:28:11
904
原创 (一)- DRM架构
但是 connector 初始化时需要 attach 上一个 encoder object,而这个 encoder object 往往是在另一个硬件驱动中生成的,为了访问该 encoder object,势必会产生一部分耦合的代码。于是,原来的 Encoder 驱动和 LCD 驱动之间的耦合,就转变成了上图中 Encoder 驱动与 drm_panel、drm_panel 与 LCD 驱动之间的“耦合”,从而实现了 Encoder 驱动与 LCD 驱动之间的解耦合。
2024-11-12 21:39:43
2462
原创 u-boot(六) - 详细启动流程
将__image_copy_end的值赋值给r2,也就是uboot复制结束的地址,从表格中可以知道,此时r2 = 0x87868960,接下来,开始进行uboot代码的拷贝,进入到copy_loop循环,从r1,也就是__image_copy_start开始,读取uboot代码到r10和r11寄存器,一次就拷贝两个32位的数据,r1自动更新,保存下一个需要拷贝的地址,然后将r10和r11里面的数据,写到r0保存的地址,也就是uboot重定位的目的地址,r0自动更新。
2024-06-13 23:38:52
1317
原创 u-boot(五) - 启动流程概述
一上电,CPU必定从XIP设备得到第1条指令。XIP设备是指一种可以直接在存储器中执行程序代码的设备,而不需要将代码复制到内存中。XIP的全称是eXecute In Place,即芯片内执行。这类设备包括片内的SRAM、NOR Flash、BootROM等。XIP设备的启动方式是系统上电之后CPU执行的第一条指令是直接在非易失性存储器中执行的,比如被存储在flash中的启动程序,便可以直接在flash中执行,而不需要拷贝到内存中运行。这种启动方式的特点是节省了从存储器到内存的复制过程,从而减少了启动时间和资
2024-06-13 23:19:21
1345
原创 u-boot(四)-顶层目录链接脚本文件(u-boot.lds)介绍
对于IMX6ULL,烧写在EMMC、SD/TF卡上的程序,并不能“自己复制自己”,是“别人把它复制到内存里”。一上电首先运行的是boot ROM上的程序,它从EMMC、SD/TF卡上把程序复制进内存里。烧写在EMMC、SD卡或是TF卡上的,除了程序本身,还有位置信息、DCD 信息,这些内容合并成一个映像文件,如下图:这4 部分内容合并成为一个映像文件,烧写在EMMC、SD 卡或TF 卡等启动设备的某个固定地址,boot ROM 程序去这个固定地址读出映像文件。
2024-06-13 23:11:56
1347
原创 u-boot(三) - 编译
u-boot-dtb.imx依赖于u-boot-dtb.bin,u-boot-dtb.bin又依赖于u-boot-nodtb.bin和dts/dt.dtb。u-boot-dtb.imx依赖于u-boot-dtb.bin,u-boot-dtb.bin又依赖于u-boot-nodtb.bin和dts/dt.dtb。然后编译dts/dt.dtb;各类u-boot文件都依赖于u-boot,先编译得到u-boot,它由u-boot-init 、u-boot-main 两部分链接而成。
2024-06-13 22:59:22
1093
原创 u-boot(二) - 配置
对于各类内核,只要支持menuconfig配置界面,都是使用Kconfig。在配置界面中,可以选择、设置选项,这些设置会保存在.config文件里。编译脚本会包含.config,根据里面的值决定编译哪些文件、怎么编译文件。.config文件也会被转换为头文件,C程序可以从头文件中获得配置信息。
2024-06-12 23:33:07
1485
原创 u-boot(一) - 开发环境搭建
芯片厂商一般都会提供烧写工具,除了可以烧写整个系统镜像还可以单独更新单个分区的镜像,比如IMX6ULL芯片可以使用MGTool工具单刷u-boot、kernel、rootfs等,将u-boot-dtb.imx传到windows系统,按照操作文档通过USB将u-boot烧写到EMMC。移植uboot时一般不会直接用 uboot 官方的源码的,官方的源码是给半导体厂商准备的,半导体厂商会根据自家的芯片,维护自己芯片对应的uboot。uboot官网上下载的是最原始的uboot源码。
2024-06-12 23:18:24
1046
原创 Linux I2C(三) i2c bus/adapter/client_device注册
i2c bus/adapter/client_device注册
2024-04-23 22:15:20
1273
原创 Device Tree (四) - device_node -> platform_device
device_node -> platform_device
2024-03-18 16:01:22
1048
原创 Device Tree (一) - dts基本概念和语法
一,ARM设备树起源在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,很多代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。读者若有兴趣,可以统计一下常见的s3c2410、s3c6410等板级目录,代码量在数万行。设备树是一种描述硬件的数据结构,它起源于OpenFir
2024-03-12 23:09:28
2047
原创 Linux设备模型(十一) - platform设备
在Linux2.6以后的设备驱动模型中,需关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个设备的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux设备和驱动通常都需要挂接在一种总线上,而对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,在SoC系统中集成的独立外设控制器、挂接在SoC内存空间的外设等却不依附于此类总线。基于这一背景,Linux。
2024-03-03 20:22:41
1574
原创 Linux设备模型(十) - bus/device/device_driver/class
在设备模型中,Bus、Device、Device driver等等,都比较好理解,因为它们对应了实实在在的东西,所有的逻辑都是围绕着这些实体展开的。而本文所要描述的Class就有些不同了,因为它是虚拟出来的,只是为了抽象设备的共性。举个例子,一些年龄相仿、需要获取的知识相似的人,聚在一起学习,就构成了一个班级(Class)。这个班级可以有自己的名称(如295),但如果离开构成它的学生(device),它就没有任何存在意义。另外,班级存在的最大意义是什么呢?是由老师讲授的每一个课程!
2024-03-03 19:26:15
1187
原创 Linux设备模型(九) - bus/device/device_driver/class
在Linux设备模型中,Bus(总线)是一类特殊的设备,它是连接处理器和其它设备之间的通道(channel)。当然实际中,同一总线下的设备有很多,驱动也有很多,在总线上管理着两个链表,分别管理着设备和驱动,当我们向系统注册一个驱动时,便会向驱动的管理链表插入我们的新驱动, 同样当我们向系统注册一个设备时,便会向设备的管理链表插入我们的新设备。在插入的同时总线会执行一个匹配方法对新插入的设备/驱动进行匹配,在匹配成功的时候会调用驱动中的初始化方法,在移除设备或驱动时会调用注销方法。那有没有合适的解决方案呢?
2024-03-03 18:39:25
749
1
原创 Linux设备模型(八) - sysfs
sysfs是一个基于内存的虚拟的文件系统,有kernel提供,挂载到/sys目录下,负责以设备树的形式向user space提供直观的设备和驱动信息。sysfs以不同的视角展示当前系统接入的设备:/sys/block 历史遗留问题,存放块设备,提供一设备名(如sda)到/sys/devices的符号链接;/sys/bus 按总线类型分类,在某个总线目录之下可以找到链接该总线的设备的符号链接,指向/sys/devices. 某个总线目录之下的drivers目录包含了该总线所需的所有驱动的符号链接。
2024-03-01 17:53:56
1716
原创 Linux设备模型(七) - Netlink
Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket,它是 Linux 所特有的。Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。
2024-02-29 20:44:48
1458
原创 Linux设备模型(六) - Android ueventd浅析
在linux2.6之后,udev取代了devfs,但是在android中却没有udev或者mdev[1],而是由ueventd进程实现了类似功能(管理设备节点权限、创建设备节点)。
2024-02-26 22:05:55
1862
原创 Linux设备模型(五) - uevent kernel实现
由此可知,Uevent的机制是比较简单的,设备模型中任何设备有事件需要上报时,会触发Uevent提供的接口。该机制通常是用来支持热拔插设备的,例如U盘插入后,USB相关的驱动软件会动态创建用于表示该U盘的device结构(相应的也包括其中的kobject),并告知用户空间程序,为该U盘动态的创建/dev/目录下的设备节点,更进一步,可以通知其它的应用程序,将该U盘设备mount到系统中,从而动态的支持该设备。用户空间程序收到这样的事件后,会做相应的处理。环境变量的作用是为执行用户空间程序指定运行环境。
2024-02-26 21:49:14
1454
原创 Linux设备模型(四) - uevent应用:内核发送uevent,用户空间接收uevent
kobject_uevent默认会发送”ACTION=xxx”,”DEVPATH=xxx”,”SUBSYSTEM=xxx”这三个uevent环境变量。内核发送uevent的API由lib/kobject_event.c文件实现,include/linux/kobject.h是头文件。在driver中可以调用kobject_uevent或者kobject_uevent_env来向用户空间发送uevent。kobject_uevent_env可以发送一些如”xxx=xxx”的自定义的uevent环境变量。
2024-02-26 21:37:49
1990
原创 Linux设备模型(三) - kset/kobj/ktype使用示例
【代码】Linux设备模型(三) - kset/kobj/ktype使用示例。
2024-02-26 21:34:50
500
原创 Linux设备模型(二) - kset/kobj/ktype APIs
Kobject的核心功能是:保持一个引用计数,当该计数减为0时,自动释放(由本文所讲的kobject模块负责) Kobject所占用的meomry空间。这就决定了Kobject必须是动态分配的(只有这样才能动态释放)。而Kobject大多数的使用场景,是内嵌在大型的数据结构中(如Kset、device_driver等),因此这些大型的数据结构,也必须是动态分配、动态释放的。那么释放的时机是什么呢?是内嵌的Kobject释放时。
2024-02-23 22:03:18
1220
3
原创 pinctrl子系统 - pinctrl与gpio之间的耦合(六)
任何一个gpio chip,在使用GPIO的时候(通常是gpio subsystem的consumer申请GPIO资源的时候),都需要向系统的pinctrl subsystem申请管脚,并将管脚配置为GPIO功能。思路是简单、直接的,但实际操作起来,却有点棘手,下面以一个最简单的例子说明:假设某一个gpio chip只包括2个gpio,这两个gpio分别和uart进行功能复用。
2023-10-16 10:30:19
228
原创 pinctrl子系统 - 源码解析(五)
设备节点要么被转换为platform_device,或者其他结构体(比如i2c_client),但是里面都会有一个device结构体,每个device结构体里都有一个dev_pin_info结构体,用来保存设备的pinctrl信息。platform_device匹配driver会执行probe探测函数,执行到驱动中真正的probe函数之前,会进行pinctrl的处理,处理函数为pinctrl_bind_pins。map 到 setting的转化只是将字符串转为整型数表示的形式。
2023-10-16 10:20:32
600
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人