- 博客(37)
- 收藏
- 关注
原创 git 学习总结
命令含义git init创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件git add将新增的文件(add)或者修改(modify)提交到暂存区将暂存区的文件提交到本地仓库git push将本地仓库的文件提交到远程仓库git pull将远程仓库的文件同步到本地仓库将 commit 的修改回退到暂存区git reset将暂存区的内容回退到工作区的 modify/add 状态回退工作区的修改(modify)或者新增(add)的文件, 这一步是不可逆的。
2024-07-26 15:47:49 951
原创 rk36566 uboot - dm 模型数据结构与常见接口
udevicedriveruclass他们四为位一体, 在 uboot 中扫描 dts 自动创建. 以 i2c 为例进行说明. 下图展示了 rk3566 i2c 的组织架构.第一个阶段通过扫描 dts 创建了 i2c0 控制器的 udevice 然后以及挂在该子设备 pmic 和 rk817_fg 对应的 device.需要注意第一个阶段只会创建 device 并不会对硬件进行初始化(probe).第二阶段。
2024-03-14 14:11:07 1271
原创 基于 rk3566 的 uboot 分析 - dts 加载和 dm 模型的本质
rk3566 中对 dtb 的组成分为两个部分uboot和kernel并不是单纯的只用 uboot 和只用 kernel, 两者都用到了. 他们在内存中的分布如下. 下图描述的是RK3566的 dtb img 位置.rk3566 uboot 中设备树的加载有两个阶段, 首先使用 uboot中的设备树, 之后再加载使用 kernel dtb 中的设备树.rk 3566 中 u-boot.dtb 和 u-boot.bin 分离. u-boot.dtb 放在 u-boot.bin 后面。
2024-03-04 17:05:23 2324
原创 drm 驱动系列 - 第二章 KMS
通过 drm_dev 导出的 ioctl 我们就可以使用任意 plane + crtc + encoder + connector + panel 来组合我们需要的硬件显示链路了.例如我们有如下硬件结构。上述的组件都由 drm_mode_object 描述. 通过 type 来确定 obj 描述的对象类型.上述 kms 相关的组件 (obj) 通过 drm_mode_config 进行维护和管理.所以这个数据结构非常重要, 它也是 kms 的核心. 他们的关系如下图所示.用初始化 obj. 该函数从。
2024-01-27 11:18:09 1171
原创 drm 驱动系列- 第一章 drm_device
drm_device 的注册为两个部分, 首先是调用 drm_dev_init 创建并初始化一个 drm_device 然后调用 drm_dev_register 进行注册.通过 drm_minor 用来描述一个 drm_dev 下的三种不同可以实例化的设备, 每个 drm 子系统至少有一个 DRM_MINOR_PRIMARY 设备。真正的设备注册函数. 注册 dev 下对应的 tpye 的设备, 创建 /sys/kernel/debug/dri 下的调试文件. 没有对应的设备直接返回.
2024-01-27 10:43:30 1846
原创 rk3566-Android11 从驱动到 app 第四章编写 app 应用
作者: baron环境搭建花了很久, 编写 app 调用 HelloManager 提供的服务. app 开发自然离不开 Android Studio. 这个工具是专门用来开发 app 的. 而不同版本之间对各个 api 的支持差异很大. 以下是我尝试使用过的不同版本的 Android Studio . 还有些被我删掉了. 总共试了十几个版本.只有一个成功了. 各版本下载地址.本次实验成功使用的版本信息如下, 为 对应的名字为 , 重要的事情说三遍, 一定要用这个版本, 一定要用这个版本, 一定要用这个
2024-01-26 10:39:48 1476 2
原创 rk3566-Android11 从驱动到 app 第三章添加 hello 服务
hall 层是啥, 就是 so 库, 这个 so 库是 c++ 写的的, 而我们的系统服务和 app 有部分是 java 写的. 没法直接用啊, 于是 JNI 闪亮登场. JNI 是干啥的, 很简单, 就是将我们 hall 层的 c++ 接口转换成 java 接口. 然后我们的服务再将这个 java 接口导出到服务. app 就可以直接通过服务的接口操作我们的 hello 设备啦.添加之后 AIDL 工具会帮我们生成支持 binder 的方法的类, 但我们还需扩展这个类并且实现对应的方法. 创建文件。
2024-01-25 17:28:49 1496 2
原创 rk3566-Android11 从驱动到 app 第二章添加 hall 层
就是 linux 驱动只提供硬件读写接口, 业务逻辑通过 hall 封装成 so 库. 这样就不用遵循 kernel 的 gpl 开源协议, 从而保护厂商的利益. 不过也因为这个原因安卓被 linux 踢出了内核主线程.中添加如下内容, 将我们的添加的 hall 库编译进系统.对应的位置为。添加库的位置让系统能够找到, 该正则表达式指定了库的位置为。需要修改的文件如下, 修改的内容和上面是一模一样的.修改的文件如下, 修改的内容和上面是一样的.open 函数返回的结构, 硬件设备结构的。
2024-01-18 16:15:08 1478
原创 rk3566-Android11 从驱动到 app 第一章添加驱动程序
作者:由于一直从事驱动开发, 一直想对整体流程有个了解, 刚好看到这篇文章. 于是参考这篇文章在 rk3566 上面完成了从驱动到 app 的实验验证. 文章记录用到的知识点以及遇到的问题和解决方法.more整体框架大致分为如下 5 层.
2024-01-18 16:10:03 1139
原创 番外篇-mtk平台logo显示接口
上面有两个第1张和39张,这两个是二选一,最终只会编译一个,可以看见我将新增的图片放在第43张,图片的顺序就是参数index的值,因此index就为42(index是从0开始的因此第一张图片是index 0)。图片的下面一行显示了图片的分辨率为1080x1920,这个也是lcd的分辨率,如果已有的分辨率的图片没有和lcd相符合的怎么办呢,方法很简单,就是复制一份现有的,然后用画图工具,修改分辨率为自己需要的的就好了,当然了别忘了重命名。运行上述代码就能显示索引为 index 的图片,图片是怎么索引的呢?
2023-12-14 09:28:15 476
原创 drm 驱动系列 - 第三章 gem 内存管理
drm_gem_cma_dumb_create 首先在 drm_mm 中申请一片需要的空间描述符, 然后再创建实际的物理内存. 上图中的蓝色的 drm_mm_node 就是 user 使用 libdrm 分配显存时申请到的内存空间描述符.之后再调用 dma_alloc_wc 分配实际的物理内存到。. 它表示的是内存的相对偏移, 这个 node 对应 drm_mm 中的内存偏移. 他的作用就是索引该 node.一共增加了两个个接口 drm_gem_cma_mmap、drm_gem_cma_vm_ops。
2023-11-29 17:13:02 2545 1
原创 rk3566-安卓11-千兆网卡 rtl8211f 移植
默认情况只亮一颗黄灯, 需要将另一颗绿灯点亮. 查看芯片手册, RTL8211F 的寄存器读写, 首先需要将要操作的 Address 对应的 page 写入 Page Select Register, 再对该寄存器进行读写.如果 dts 配置的不对会出现 dma 相关的报错, 出现这个报错, 按照前面的步骤确认硬件接法对应的name 然后查找对应的配置.如果原理图上的 mac 的 io 供电由 vcc_1v8 提供, 软件需要配置打开这个 vcc_1v8 供电.在 rk 提供的文档。
2023-11-15 15:26:16 4576 8
原创 rk3566 + 安卓 11 关机充电 logo 客制化
rk 关机充电的显示基于minui 显示框架, 它具有简单的图形绘制, 以及解析 png 图片并将其简单的显示出来的能力. 它支持三种显示框架fbdevdrm和adf. 由于需要解析 png 图片因此也需要使用到libpng 库充电 logo 显示自身包括一个服务charger. 用于监测按键是否按下充电图片的解析显示, 以及按键状态的处理.more。
2023-11-08 08:54:19 1283
原创 makfile 专题
如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名;在执行此规则时,目标总是被认为是最新的。四、变量和不同的赋值方式修改前面的 makefile 验证CC := gccclean :运行结果:endefendeftest :函数通过call关键字调用,0(0)、0(1)、$(3)、…代表依次传入的参数自定义函数是一个多行变量,无法直接调用。自定义函数是一个过程调用,没有任何返回值。自定义函数用于定义命令集合,并应用于规则中。
2023-07-25 09:07:18 172
原创 linux 驱动 - pinctrl子系统
分析总结 pinctrl 子系统框架结构,平台 mtk6771 内核版本 kernel-4.4 , 本文所有的分析均基于此版本。
2023-07-23 10:37:57 847
原创 linux 驱动 - 四、linux 内核通知链
当发生事件时通知模块遍历链表中的所有回调函数,并根据传入的参数依次调用。以原子通知链为例进行说名,原子通知链提供的链表头如下所示。内核中不同模块间的消息通知机制,告诉其他模块,当前发生了什么事情。内核通知链只能用于内核之间,不能用于内核于用户空间之间的通信。实现原理很简单,就是。可以看出原子通知链使用的是自旋锁,因此原子通知链可以用在中断上下文中,不能阻塞。无论是什么通知链,都是使用 notifier_block 作为该通知链的成员。阻塞通知连使用的读写信号量,因此阻塞通知链使用在进程上下文,可以阻塞。
2023-06-24 17:13:12 424
原创 linux 驱动基础 - 三、linux 队列
工作队列(work queue)是一种将工作推后执行的形式,它和tasklet有所不同。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。等待队列从功能上可以简单理解为:让进程进入睡眠,在你想让他工作的时候唤醒。它有两部分组成首先是挂接我们等待队列项的等待头,等待队列头的数据结构描述如下。而挂接在其上面的等待队列项的数据局结构如下。他们的创建与与初始化如下。
2023-06-24 17:09:46 508
原创 linux 驱动基础 - 一、字符设备
该结构体是系统调用与驱动连接的桥梁,当我们在应用层使用 open 函数打开一个设备的时候,内核会创建一个 file 结构并关联 file_operations 中的一组函数,最终会调用到驱动中关联的 file_operations 结构体实例中 open 函数。实际上并没用到所有的 12 位,在老式内核中主设备号的范围为 0-255。向系统删除一个cdev,完成字符设备的卸载,对 cdev_del 的调用通常发生在字符设备驱动模块卸载函数中,当 cdev_del 被调用后对应的cdev结构就不应被访问了。
2023-06-24 17:07:59 1607
原创 linux 驱动基础-二、同步与互斥
通过 lockval.tickets.next 实现了排队的操作,每一个 spinlock 都有一个独一无二 lockval.tickets.next ,后来的 spinlock 都是在前一个的基础上增加 1,lock->tickets.owner 则保存当前轮到谁来获取临界资源。对于不同的架构自旋锁的实现方式不同,arm 架构自旋锁的数据结构如下所示,其中实现自旋的关键就是 next 和 owner 两个变量。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。
2023-06-24 17:07:29 238
原创 linux 系统篇 - 五、深入 linux 进程
这个进程树的局部向我们表明, 当前的命令行进程 bash(2069) 创建了父进程 a.out(2304), 该父进程创建了 3 个子进程 a.out(2305)/(2306)/(2307). 而当前命令行竟然将 3 个子进程打印出来了, 这说明。可以看到, 这几个进程之间的关系, 接下来等待子进程结束运行. 子进程运行结束后再打印进程表。可以看到有 7 个进程在运行, 其中一个父进程一个子进程, 5 个孙进程, 于是打印进程树。子进程现在是僵尸进程, 而五个进程还是存在的. 于是打印进程树。
2023-06-13 16:07:03 105
原创 linux 系统篇 - 三、进程参数
execve 在重置空间的时候会将进程参数从父进程拷贝一份到当前的进程. 这意味着当前进程启动之后这两个参数将不会在变化. 编程体验。) 从 argc 和 argv[] 数组中获取启动参数, 并根据 optstring 的规则进程解析.> sif: 规则有有3个合法的选项 -i -s -f 并且 -f 有选项值的否则是不合法.命令行参数, 进程的启动参数, 进程参数他们的本质是相同的东西。既不是选项, 也不能作为选项值的参数是操作数。起始字符可以是:, +, -或 省略。选项, 选项值, 操作数。
2023-06-13 16:01:46 625
原创 linux系统篇 - 四、环境变量
其本质是一个字符串数组, 字符串数组中的每一个元素是字符串指针.该指针指向环境变量. 可以使用 environ 访问环境变量. 编程体验.单独运行 helloworld.out , 这是由 shell 传入环境变量。进程拥有一个环境表(environment list)进程之间的环境表相互独立(环境表可在父子进程之间传递)环境变量与启动参数存储与同一内存区域(进程私有的)对于启动参数较稳定(系统定义且各个进程共享)固定规范(如: 键值对, 变量名大写)环境变量可以看做特殊的进程参数。
2023-06-13 16:01:28 272
原创 linux 驱动-i2c
本文借助mtk平台分析linux的i2c框架,mtk平台mt6765,内核版本kernel-4.9,本文只分析linux的i2c框架,不讨论i2c总线协议相关内容.作者: baron具体的i2次设备的软件抽象,它拥有所有i2c次设备的信息:i2c_client这个结构被注册时候就被注册到 i2c bus 上了,因此我们可以利用 i2c bus 获取到这个结构2、i2c_adapteri2c适配器,adapter翻译过来就是适配器的意思,这个结构描述了硬件上的i2c总线的控制器信息,注意不是我们理解的设备
2023-06-13 13:00:21 1573 1
原创 linux驱动- firmware子系统
首先创建一个中间设备包含两个属性节点 loading 和 data向上层发送 FIRMWARE 固件下载 event 事件上层监听到 FIRMWARE 启动固件下载,依次遍历 firmware_dirs 数组中的目录找到固件。首先往 loading 节点下发 1 表示准备下载,然后将固件通过 data 目录下发到内核,发完之后向 loading 节点写 0 表示下载完成。
2023-06-02 15:16:16 1473
原创 linux驱动-中断
gic 的初始化做了下面的工作映射 gic 的寄存器地址,对 gic 的寄存器做一些初始化设置设置异常处理回调函数 handle_arch_irq = gic_handle_irq为中断控制器创建一个中断域,使用线性映射方式进行初始化设置中断域映射方式的回调函数 gic_irq_domain_hierarchy_ops。
2023-05-29 18:23:24 737
原创 linux系统篇 - 二、进程
作者:进程是linux 任务的执行单元, 也是 linux 系统资源的分配单元.每个 linux 应用程序运行后由一个或多个进程构成. 每个 linux 进程可以执行一个或多个应用程序. linux 进程有多重不同状态.TASK_DEADEXIT_DEAD。
2023-05-25 14:30:47 126 1
原创 linux 系统篇 - 一、系统概要
linux 系统相关知识, 文章内容来自狄泰软件学院, 如有需要淘宝执自行购买学习.作者: baron计算机系统由 “躯体” 和 “灵魂” 两部分组成计算任务执行流程 程序的本质是指令和数据的集合。指令是指示 cpu 执行动作的命令, 数据是 cpu 执行动作的目标. 程序的分类: 进程是程序的执行. 通常情况下, 程序在操作系统上以进程为单位运行. 每个程序运行后由一个或者多个进程构成. 进程是操作系统任务的基本单元, 也是系统资源的基本分配单元. 程序是"死的", 进程是活的. 程序的本质只
2023-05-25 13:47:11 84 1
原创 常用工具箱
该工具箱, 用于存放博主工作生活中用到的软件工具, 不定期更新.所有的谷歌插件 edge 都是有对应的插件可以使用的.简单配置 vim。
2023-05-25 11:18:56 216 1
原创 linux驱动-设备驱动模型(platform设备)
只要dts中的节点有 compatible 属性,将会在内核中将该节点转换为 platform 设备,该设备将出现在下如果有设备节点有 reg 属性则使用作为该设备的名字如果设备节点没有 reg 属性则使用作为设备名,同时设置。
2023-05-03 13:26:44 1143
原创 linux驱动-设备驱动模型(class类)
class 用于管理同类的设备,常常被我们用来给上层开辟一个属性节点,多用于查看,修改对应的设备信息。
2023-05-03 13:13:29 650
原创 linux驱动-设备驱动模型(driver驱动)
bus_add_driver 会创建下面节点/ sys / bus / xxx / drivers / drv -> name / sys / bus / xxx / drivers / drv -> name / uevent /* 支持 suppress_bind_attrs */ / sys / bus / xxx / drivers / drv -> name / unbind / sys / bus / xxx / drivers / drv -> name / bind。
2023-05-03 13:09:06 939
原创 linux驱动-设备驱动模型(device设备)
从代码可以看出对于 dev 来说名字是一个非常重要的参数,首先使用 init_name 作为dev->kobj 的名字同时将 init_name 设置为空,如果 init_name 初始为空则使用 “bus->dev_nam + dev->id” 作为dev->kobj 的名字,如果设备没有设置名字则直接返回错误。
2023-05-03 12:55:24 1177 1
原创 linux驱动-设备驱动模型(bus总线)
bus_register 创建并初始化 priv->klist_devices 和 priv->klist_drivers 这两条由该总线维护的非常重要的两条链表,该总线下的 dev 和 drv 会分别链入这两条链表。这个结构被用在两个地方 class 和 bus,在不同的位置有不同的含义,当它出现在 bus下用它描述 bus 在 /sys 中的层次结构。buses_init 在 driver_init 中被调用,用于初始化 bus 的根目录,以后所有的 bus 总线均为该目录的子目录。
2023-05-03 12:42:45 1228 2
原创 linux驱动-设备驱动模型(kset)
kset 本身包含 kobject 结构,因此拥有上述 kobject 的所有特性,除此之外, kset 具有管理 kobject 的功能以及提供热插拔功能作者: baronkset 的数据结构如下可以看出主要多出了两个数据结构 list 和 kset_uevent_ops,在前面的 kobject_add 分析中可以知道,只要是 kobject 属于某个 kset 那么都会被链接到所属的 kset 中的 list 链表。 也就是 kset 具有管理 kobject 的功能,举个栗子,例如: 当 kern
2023-05-03 12:34:54 497
原创 linux驱动-设备驱动模型(属性文件 kobject )
Linux设备模型的核心是使用四个核心数据结构,将大量的、不同功能的硬件设备(以及驱动该硬件设备的方法),以树状结构的形式,进行归纳、抽象,从而方便Kernel的统一管理。more。
2023-05-03 12:21:14 1148 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人