- 博客(94)
- 收藏
- 关注
原创 pinctrl子系统做功能的切换.
SD卡和debug口中sdmmc和uart共用同一组pin脚,需实现在sd使用的时候切换到sdmmc不插入sd卡的时候使用debug口功能。这样当我们不使用SD卡的时候利用pinctrl直接切换到pinctrl -1这个pin的fuc就会切换到对应的pin uart状态。这种跨驱动的使用之前还是没见过的,记录一下。使能俩个功能的dts并去除不能切换的pinctrl,只有一个节点能使用该pin 的pinctrl,要不然其中一路会跑不下去。sd卡有检测脚可以作为切换的标志所以我们的切换要在sd卡的驱动中去做。
2024-08-07 15:45:28
322
原创 关于增加logo分区并支持直接刷bmp格式图片
有的平台是没有实现的可以去掉他原本加载logo图片的位置,然后使用(linxu根据分区名字获取分区信息的函数比如RK使用的函数是int part_get_info_by_name(struct blk_desc *dev_desc,const char *name, disk_partition_t *info);并需要方便的替换开机logo的图片。以上追下来发现其实,是根据idx来获取分区信息的比如我们的程序都是烧录在emmc里面,在获取logo分区的时候就是在emmc循环匹配name。
2024-08-06 16:34:26
914
1
原创 SM6225 linux-alsa详解(四)_ASOC介绍
ASoC–,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系.在ASoc出现之前,内核对于SoC中的音频已经有部分的支持,不过会有一些局限性。我们音频路径包含SOC <–> Codec <–> input/output设备Codec驱动与SoC CPU的底层耦合过于紧密,这种不理想会导致代码的重复,例如,仅是wm8731的驱动,当时Linux中有分别针对4个平台的驱动代码。
2024-03-29 11:15:34
986
1
转载 SM6225 linux-alsa详解(三)_control设备
Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频codec芯片中的多路开关,滑动控件等.对于Mixer(混音)来说,Control接口显得尤为重要,从ALSA 0.9.x版本开始,所有的mixer工作都是通过control接口的API来实现的。其实通俗的理解control设备的作用如音量的调节,开关等。<sound/control.h>定义了所有的Control API.如果你要为你的codec实现自己的controls,请在代码中包含该头文件。
2024-03-28 17:29:20
556
转载 SM6225 alsa详解(二)_ pcm设备
PCM是英文Pulse-code modulation的缩写,中文译名是脉冲编码调制.我们知道在现实生活中,人耳听到的声音是模拟信号,PCM就是要把声音从模拟转换成数字信号的一种技术,他的原理简单地说就是利用一个固定的频率对模拟信号进行采样,采样后的信号在波形上看就像一串连续的幅值不一的脉冲,把这些脉冲的幅值按一定的精度进行量化,这些量化后的数值被连续地输出、传输、处理或记录到存储介质中,所有这些组成了数字音频的产生过程。
2024-03-26 15:34:53
330
转载 SM6225 ASLA详解(一)
ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构。在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。
2024-03-25 14:54:36
336
原创 android 9 reboot流程
atomic_notifier_call_chain做的是向注册restart_handler_list的驱动发送一个通知,通知各个通过register_restart_handler注册的钩子函数,执行这个关机函数。函数进入重启流程,然后重启后进入fastboot。--------------------------分界线--------------------------------------------------------------------分界线---------------
2024-01-10 15:13:00
1591
原创 MTK display(一)
一、显示逻辑** Surfaceflinger 是用户空间中ramework下libraries 中负责显示相关的一个模块** 当系统同时执行多个应用程序时,Surfaceflinger 负责管理显示,主要包括显示的叠加和显示的渲染** 其中显示的叠加,MTK 架构按照一定的原则和算法,主要用到GPU 和 OVL 模块的overlay 功能来做2D/3D 绘图的显示合成HWC** 基于DDP OVL 硬件做HW Overlay 功能。
2023-09-20 16:33:28
215
原创 RK3566添加湿度传感器以及浅析hal层
对于湿度传感器来说:(kernel 层驱动通过i2c读取寄存器拿到湿度数据) —fileoperation---->(hardware层通过open节点,以及ioctl获取到数据,填充这些结构体.hw_device_t 填充模块ID 名称 描述 版本等信息。等jni层获取到该结构体指针的时候可以调用这些功能函数)------jni-------->(framewark层注册java native interface.java本地接口,以便上层调用)------->apk.调用到我们的功能函数。
2023-02-21 17:24:40
1019
原创 AI3566 AP6256WIFI&BT
AP6256是正基的一款集成WIFI和BT的IC。支持WIFI5.一、WIFI调试WIFI通信原理:WIFI通信,既然是通信那么必然是俩个物体以上。这里指的是我们的WIFIIC和主机通信。WIFI通过接受无线网络的某个频段的信号,然后发送给我们的主板。根据连接WIFIIC和主板之间的数据通道分成SDIO WIFI、USB WIFI 、PCIe WIFI。我们这里采用的是SDIO。调试过程:1、配置好SDIO通道,确定能读到卡,这样WIFI就能读到数据。2、把正基提供的固件刷到我们的IC。这样我
2022-06-15 00:12:45
218
原创 IO复用排查以及IO工具的使用
一、 如何通过 IO 读寄存器确认引脚复用等问题作者:lml1、kernel 阶段使用 io 命令确认寄存器方法:许多客户经常会碰到一些 IO 引脚虽然已经在 dts 中配置了对应的 iomux,但却发现实际示波器测量出来信号不对。一般这种情况出现,可首先排查 IO 引脚是否被复用。在 RK 的 Android 平台,默认有包含 io 工具(源码位置:external\io),linux 系统平台默认没有此源码,如果想要使用,可以将 Android 平台此源码打包过去编译即可。IO 工具使用方
2022-06-06 23:59:27
125
原创 AI3566-camera
我们采用的摄像头是格科的GC5035.3566SDK直接集成了gc5035.c的驱动。我们在.config或者在make ARCH=arm64 menuconfig里面选择GC5035驱动就会加载上去。一、首先看我们的摄像头是挂在那个i2c里面 以及接的是mipi的那个lanes 。从原理图上看是接的i2c2上面。那么就在i2c2下面创建我们的摄像头子节点gc5035.再确定我们的mipi是使用的那几个lanes。问看摄像头的原理图对应我们的原理图接的我们的0,1lanes .(我们的MIPICSi接
2022-06-06 23:50:53
73
原创 内核Kconfig编写
编写内核.config 配置用户自定义宏或者string1、menu “hangsome wzf Configuration”endmenu使用make menuconfig 找到你写的那个目录就会出现这个标签2、configs 后面要定义的宏以及类型可以是string bool 还有默认的值3、sourcesource 类似于include 在这个menu下会出现你source 的目录的configs...
2022-05-07 23:20:32
466
原创 konfig 添加宏 条件编译 defconfig .config
一、Kconfig defconfig .config的关系kconfig:Kconfig是各级目录的配置文件我们的.config就是根据Kconfig生成的,使用make ARCH=arm64 menuconfig 来配置。.config:最终生成的配置文件,各模块和宏的配置y ndefconfig:保存的本地默认defconfig文件,如果使用make ARCH=arm64 defconfig,那么defconfig的值就会覆盖.config文件添加宏:我们的内核代码经常通过判断是否定义一些宏
2022-04-01 19:02:04
2297
原创 source
source 属于shell命令。shell 命令是操作kernel的。比如我们使用ifconfig。那么它就是去读取内核里面的net的ip然后按照格式打印出来。Linux常用的shell版本是bash执行文件有三中方式。路径(./当前路径 绝对路径):需要执行权限的可执行文件sh bash :使用bash执行可以不需要xsource:从当前内置shell会话中打开或执行一个文件。使用路径和sh命令其实对于执行过程来讲是一样的。我们打开一个terminal的时候他也是一个process在
2022-02-08 11:47:26
1989
原创 Makefile
一:makefile命令规则(1)targets:prerequlisitescommand:(2)targets:pererqulistes;commandcommandeg:cleanrm -r -f *.c *.oclean 作为一个laberm …是command.显示规则要求严格按照命令规则来书写。make有自动命名推导功能。所以可以省略书写。比如clean没有说明依赖文件。-(make会在当前目录下或者是全局环境下自动推导出依赖文件)而且clean是伪目标————只有执
2022-01-04 11:21:35
453
原创 文件IO&标准IO 动态库&静态库 编译过程
什么是标准IO:标准IO是基于C库 的——大部分操作系统都支持C库,所以大部分系统都可以使用标准io,标准IO就是input/output.我们的输入输出都是要经过系统调用的。就是内核的文件系统来统一管理的,要不然你随便输入输出这怎么行?比如你标准输出流stdout 你也的经过系统调用才能把信息发送到屏幕的这个文件设备,然后显示。文件IO:文件IO是基本的IO,可以使用文件IO,对文件进行IO操作。Linux一切皆文件,所以你可以使用文件io打开任何一个文件。比如对设备进行io你就可以open /d
2021-10-12 22:57:15
257
2
原创 process-thread
一、进程的概念:执行一个程序所分配的资源的总称,进程是程序的一次执行过程动态的,包括创建、调度、执行和消亡程序就是我们写好的代码,编译成可执行文件后成为程序,存放在硬盘里面。但是,当我们点击./a,out去执行的时候,它运行起来:把硬盘程序数据读到内存中,占用的cpu资源。等等运行所要的资源的总称,称为进程。我们的进程是由一个一个进程链表的来管理的,这个...
2021-10-11 23:16:02
270
2
原创 进程间通信
进程间通信:俩个进程间进行数据的交互,主要有以下类型无名管道有名管道信号共享内存消息队列信号量套接字这七种通讯方式:一、无名管道 pipe#include <unistd.h>int pipe(int pipefd[2]);pipe的参数是一个数组,数组里面有放的是两个pidfd进程描述符。pidfd[0]:读端pidfd[1]:写端write(pidfd[1] , buf,sizeof(buf));就可以通过写端,把数据写到无名管道里面。read(pid[0]
2021-10-10 21:51:16
193
原创 C语言总结(二)
一、递归函数和回调函数。1、递归函数递归函数 的定义就是,函数本身不断地在他的函数体内调用自己。直至到结束条件成立。递归函数最重要的就是结束条件。你要是结束条件没有或者是结束条件永远不成立。那么就形成死递归,占用大量资源且最后一定会导致栈区满了。递归主要用于一些重复操作要操作很多一遍且,知道那个条件成立的时候就不递归的操作。比如:求N的阶乘!#include <stdio.h>int main(){int n ;extern jiecheng;n = jiecheng(10
2021-10-09 23:52:40
455
2
原创 C语言总结(一)
一、面试中常见关键字1 :static:定义:改变生命周期,限制作用域,对于:在函数内部声明为内部静态变量只需要初始化一次。变量类型由auto变成STATIC,使变量存储在静态区延长生命周期至整个程序结束,扩大其作用域为全局可见。修饰全局变量加STATIC,限制其作用范围,使嘚外部程序不可访问修饰函数时,也是和全局变量一样,使得外部程序不可访问。存放空间:静态存储区生命周期:从定义开始,直到程序运行结束。作用域:当前文件可见,其他文件不可访问。2、extern外部变量声明修饰变量时,声
2021-10-08 23:56:22
294
1
原创 基于uart的RS232和RS485总线
我们之前讲uart的时候就已经提过一个问题,就是它并不是直接连接到SOC里面的,而是经过了一个芯片的转换。这个芯片的转换就是和我们要说的rs232、485总线有关的。RS232和RS485总线其实本质就是uart,只不过是在物理电气层做了一些相关协议。针对UART出现的问题,一些牛逼的组织就制定了一些协议和标准就出现了RS232和RS485总线...
2021-10-08 11:07:53
2702
1
原创 驱动——platform驱动ADC
我们再谈一下平台总线。前面讲平台总线是可以让drv和dev实现分离。主要作用是用于平台升级。现在结合设备树来看一下 平台总线的好处。(平台总线是虚拟总线,用于一些ADC,PWM这样的没有实体总线连接(iIC spi…)的一些设备,为了管理这些设备统一虚拟出平台总线来管理)1)首先我们要了解到当我们在设备树文件上写了应该设备后(属于我们的直接定义的设备,可以有2^20个子设备(前面说可以放无限个是错误的)它就会把设备树的信息放在/sys/bus/plaoform/device下(那我要是iic设备应
2021-10-06 16:29:14
482
1
原创 驱动———互斥和同步
这个主要是为了解决竞态的问题。什么是竞态?就是对于同一个数据,由于有很多路径同时访问(这里的同时访问,可能发生在多核处理器的状态,在单核上是指假的同时访问,接下来会讲同时访问的请况)。由于这样多个文件访问读取修改,这样就会造成数据紊乱。从而大概率会使很多路径读写等操作的数据都是不正确的。这在内核这种级别的代码来讲是致命的。为了解决这种问题于是引入了互斥的同步的概念。eg:我在内核中有一个全局变量:i= 5;我正常的的程序是要执行一个i++的操作。那么我实际上执行的指令是三条ldr r1,[ro]
2021-10-03 23:20:34
218
2
原创 QT————qq登录界面
我们要先写一个小dialog这个登录界面,登录成功之后才显示QQ主界面MyQDialog.h继承Dialog#ifndef MYQDIALOG_H#define MYQDIALOG_H#include <QLineEdit>#include <QCheckBox>#include <QPushButton>#include <QRadioButton>#include <QLabel>#include <QDialog
2021-10-03 19:59:30
1215
3
原创 QT——信号与槽
头文件:#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QLineEdit>#include <QTextEdit>#include <QComboBox>#include <QTimeEdit>#include <QDial>#include <QSlider>#include <QScrollBar>#in
2021-10-02 23:49:08
162
原创 C++——链表的实现以及迭代器
#include <iostream>using namespace std;class MyList{public: MyList():head(NULL){ } ~MyList(){ while(head){ Node *temp; temp = head; head = head->next; delete temp; } }public: struct Node{ Node(int x, Node *ptr=NULL
2021-10-02 15:02:44
306
原创 设备树编写基础
为什么会有设备树:在linux2.6之前,Linux采用硬编码的方式,把支持的厂商的测试板的信息全部写在内核中。来实现Linux的兼容,这使得内核硬件信息的代码占比越来越大。而对用户来说我只要我的板子的硬件信息。这就导致有很多的代码的冗余我们引入设备树之后,用户可以根据自己的板子,去填写和修改设备硬件信息,做到硬件信息和驱动的分离。我驱动过程中,我们的设备树文件,会被挂载到u_boot的一个内存区域,比如我们之前系统移植的过程中。我们把U-Image 放到41000000把exynos4412-fs
2021-09-30 16:54:21
553
原创 驱动中断申请
一、申请中断步骤。在编程过程中,需要定义自己的节点–描述当前设备用的中断号arch/arm/boot/dts/exynos4412-fs4412.dts +51 key_int_node{compatible = “test_key”;interrupt-parent = <&gpx1>;interrupts = <2 4>;};编译设备树文件:make dtbs更新dtbs文件:cp -raf arch/arm/boot/dts/exynos4412
2021-09-30 09:14:21
253
1
原创 C++————类型转换
标准转换函数:```cppreinterpret_castreinterpret_cast<new type>(expression)将一个类型的指针转换为另一个类型的指针,它也允许从一个指针转换为整数类型const_castconst_cast< new type>( expression)const指针与普通指针间的相互转换,注意:不能将非常量指针变量转换为普通变量static_caststatic_cast<new type>(expressi
2021-09-29 22:58:46
144
原创 驱动———IIC子系统(二)
总结一下编程步骤。我们只需要编写drv的代码即调用层的代码。再调用层做的事情就是,把drv注册到iIC bus里面,然后实现按照iic的总线通信协议,进行数据交互。具体步骤。1)编写设备树文件,根据芯片手册,找到我们的硬件连接在第几组iic总线,以及地址,中断等信息。2)实例化i2c_driver结构体并把它注册到drv总线里面去。注册成功后,匹配完成就会调用i2c_driver结构体的probe方法我们需要在probe方法中:3)申请设备号,以及实现file_operation4)创建设
2021-09-29 14:08:28
263
原创 C++———多态
定义:方法的行为取决于调用该方法的对象,就是随着上下文,同一种方法具有不同的形态。称为多态。调用同一个函数,编译器会根据上下文,匹配不同的形态。#include <iostream>using namespace std;class Shape{public: virtual double getL(void){ } };class Cir:public Shape{public: Cir(int ri):r(ri){ }; double getL(void
2021-09-28 23:37:19
113
原创 C++———异常
异常:是用来显示异常的一种方法。try{………}catch(){显示异常。}它实现的时候。当try里面的正常运行的代码遇到异常的时候,就会,不执行接下来的语句。这就类似与go to 语句。它可以解决以下问题:#include <iostream> #include <stdlib.h>using namespace std;int main(){ int a = atoi("abc"); //atoi只能转换字符数字,这是出错的传参 in
2021-09-28 23:35:43
116
1
原创 驱动——IIC子系统(一)
IIC子系统和input子系统一样,适用于所有挂载在IIC下与SOC进行通行的。即适用于所有的IIC设备。常见的有Cream mpu6050 等等的一些设备。我们说input子系统里面要完成的事情都是把设备的信息传递给用户。就是input。那对于我们IIC来说它肯定也是有一类的作用,所以才会划分出一类出来。所以IIC子系统它的功能是什么?它要做什么?相对于IIC来说,我们之前就接触过IIC总线协议,IIC总线协议里面做的事情就是让主机和从机进行通信。这是一些IIC传输过程的内容。那我们IIC
2021-09-27 16:35:58
347
原创 Linux内核——container_of
在驱动过程中,一直有一个做法,就是通过,我知道的一个结构体的一个成员,那么我就可以拿到整个结构体的数据我们也称为以小博大。就比如字符设备驱动过程中的input_dev input_handler 和evdev_handl 这三个结构体就天天在那博来博去的。乍一想:就是通过,我知道的一个结构体的一个成员,那么我就可以拿到整个结构体的数据。这肯定没问题啊,我都知道一个成员了,那拿到整个结构体的数据这不是易如反掌吗?但是真的让你去操作你会怎么操作???内核是定义一个宏去完成以小博大co
2021-09-27 13:55:40
131
原创 ARMA9接口技术之IIC(一)
I2C总线协议:IIC总线协议是一种通信协议,用与芯片之间的收发数据。它本质上就是两根线(数据线和时钟线)串行线代表:一次只能发送一个数据。半双工表示:数据传递方向是双向的,但是一次只能为一个方向。那么IIC是怎么做到仅凭两根线就可以实现数据的接收和发送呢?IIC总线就是俩根线上面挂载了很多个设备,这些设备都可以当作主机或者从机。这就类似于小时候家里的座机可以分一个接听器出来。主机可以打电话(发起通信)可以挂电话(结束通信)可以接听电话(接收数据)和说话(发送数据)而接听器只接电话(响
2021-09-27 09:41:21
977
2
原创 C++———继承
继承也是对一个基类做扩展。比如我有一个类,我现在觉得这个类不够强大那我就再搞一个类,继承上一个类,那么我就可以拥有上一个类的全部功能,还可以在那个类的基础上做扩展。eg:class Arr{public: Arr(){ tail = 0; ~Arr(){ } void insert(int &x){ arr[tail] = x; tail ++; } void show(){ int i= 0; for(;i<tail;++i){ cout &
2021-09-26 22:21:39
91
2
原创 C++———组合
组合:就是我这个东西是由其它东西组合而成,但是我和其它东西完全不一样,都不是同一个东西。比如我有一个数组类:class Arr{public: Arr(){ tail = 0; ~Arr(){ } void insert(int &x){ arr[tail] = x; tail ++; } void show(){ int i= 0; for(;i<tail;++i){ cout << arr[i] << endl;
2021-09-26 21:45:54
122
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人