自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

原创 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 624 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 87

转载 SM6225 alsa详解(二)_ pcm设备

PCM是英文Pulse-code modulation的缩写,中文译名是脉冲编码调制.我们知道在现实生活中,人耳听到的声音是模拟信号,PCM就是要把声音从模拟转换成数字信号的一种技术,他的原理简单地说就是利用一个固定的频率对模拟信号进行采样,采样后的信号在波形上看就像一串连续的幅值不一的脉冲,把这些脉冲的幅值按一定的精度进行量化,这些量化后的数值被连续地输出、传输、处理或记录到存储介质中,所有这些组成了数字音频的产生过程。

2024-03-26 15:34:53 35

转载 SM6225 ASLA详解(一)

ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构。在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

2024-03-25 14:54:36 59

原创 android 9 reboot流程

atomic_notifier_call_chain做的是向注册restart_handler_list的驱动发送一个通知,通知各个通过register_restart_handler注册的钩子函数,执行这个关机函数。函数进入重启流程,然后重启后进入fastboot。--------------------------分界线--------------------------------------------------------------------分界线---------------

2024-01-10 15:13:00 1201

原创 GT928 TP驱动跟读及虚拟按键上报解析

TP 跟读

2023-04-27 19:15:10 1315 1

原创 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 709

原创 RK3566 多Mipi屏的兼容

rk 多mipi屏兼容

2023-02-09 23:46:23 1380 7

原创 内核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 370

原创 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 1746

原创 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 1910

原创 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 389

原创 文件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 193 2

原创 process-thread

一、进程的概念:执行一个程序所分配的资源的总称,进程是程序的一次执行过程动态的,包括创建、调度、执行和消亡程序就是我们写好的代码,编译成可执行文件后成为程序,存放在硬盘里面。但是,当我们点击./a,out去执行的时候,它运行起来:把硬盘程序数据读到内存中,占用的cpu资源。等等运行所要的资源的总称,称为进程。我们的进程是由一个一个进程链表的来管理的,这个...

2021-10-11 23:16:02 194 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 128

原创 C语言总结(二)

一、递归函数和回调函数。1、递归函数递归函数 的定义就是,函数本身不断地在他的函数体内调用自己。直至到结束条件成立。递归函数最重要的就是结束条件。你要是结束条件没有或者是结束条件永远不成立。那么就形成死递归,占用大量资源且最后一定会导致栈区满了。递归主要用于一些重复操作要操作很多一遍且,知道那个条件成立的时候就不递归的操作。比如:求N的阶乘!#include <stdio.h>int main(){int n ;extern jiecheng;n = jiecheng(10

2021-10-09 23:52:40 388 2

原创 C语言总结(一)

一、面试中常见关键字1 :static:定义:改变生命周期,限制作用域,对于:在函数内部声明为内部静态变量只需要初始化一次。变量类型由auto变成STATIC,使变量存储在静态区延长生命周期至整个程序结束,扩大其作用域为全局可见。修饰全局变量加STATIC,限制其作用范围,使嘚外部程序不可访问修饰函数时,也是和全局变量一样,使得外部程序不可访问。存放空间:静态存储区生命周期:从定义开始,直到程序运行结束。作用域:当前文件可见,其他文件不可访问。2、extern外部变量声明修饰变量时,声

2021-10-08 23:56:22 223 1

原创 基于uart的RS232和RS485总线

我们之前讲uart的时候就已经提过一个问题,就是它并不是直接连接到SOC里面的,而是经过了一个芯片的转换。这个芯片的转换就是和我们要说的rs232、485总线有关的。RS232和RS485总线其实本质就是uart,只不过是在物理电气层做了一些相关协议。针对UART出现的问题,一些牛逼的组织就制定了一些协议和标准就出现了RS232和RS485总线...

2021-10-08 11:07:53 2538 1

原创 驱动——platform驱动ADC

我们再谈一下平台总线。前面讲平台总线是可以让drv和dev实现分离。主要作用是用于平台升级。现在结合设备树来看一下 平台总线的好处。(平台总线是虚拟总线,用于一些ADC,PWM这样的没有实体总线连接(iIC spi…)的一些设备,为了管理这些设备统一虚拟出平台总线来管理)1)首先我们要了解到当我们在设备树文件上写了应该设备后(属于我们的直接定义的设备,可以有2^20个子设备(前面说可以放无限个是错误的)它就会把设备树的信息放在/sys/bus/plaoform/device下(那我要是iic设备应

2021-10-06 16:29:14 319 1

原创 驱动———互斥和同步

这个主要是为了解决竞态的问题。什么是竞态?就是对于同一个数据,由于有很多路径同时访问(这里的同时访问,可能发生在多核处理器的状态,在单核上是指假的同时访问,接下来会讲同时访问的请况)。由于这样多个文件访问读取修改,这样就会造成数据紊乱。从而大概率会使很多路径读写等操作的数据都是不正确的。这在内核这种级别的代码来讲是致命的。为了解决这种问题于是引入了互斥的同步的概念。eg:我在内核中有一个全局变量:i= 5;我正常的的程序是要执行一个i++的操作。那么我实际上执行的指令是三条ldr r1,[ro]

2021-10-03 23:20:34 156 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 1099 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 101

原创 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 234

原创 设备树编写基础

为什么会有设备树:在linux2.6之前,Linux采用硬编码的方式,把支持的厂商的测试板的信息全部写在内核中。来实现Linux的兼容,这使得内核硬件信息的代码占比越来越大。而对用户来说我只要我的板子的硬件信息。这就导致有很多的代码的冗余我们引入设备树之后,用户可以根据自己的板子,去填写和修改设备硬件信息,做到硬件信息和驱动的分离。我驱动过程中,我们的设备树文件,会被挂载到u_boot的一个内存区域,比如我们之前系统移植的过程中。我们把U-Image 放到41000000把exynos4412-fs

2021-09-30 16:54:21 480

原创 驱动中断申请

一、申请中断步骤。在编程过程中,需要定义自己的节点–描述当前设备用的中断号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 167 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 79

原创 驱动———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 192

原创 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 64

原创 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 69 1

原创 驱动——IIC子系统(一)

IIC子系统和input子系统一样,适用于所有挂载在IIC下与SOC进行通行的。即适用于所有的IIC设备。常见的有Cream mpu6050 等等的一些设备。我们说input子系统里面要完成的事情都是把设备的信息传递给用户。就是input。那对于我们IIC来说它肯定也是有一类的作用,所以才会划分出一类出来。所以IIC子系统它的功能是什么?它要做什么?相对于IIC来说,我们之前就接触过IIC总线协议,IIC总线协议里面做的事情就是让主机和从机进行通信。这是一些IIC传输过程的内容。那我们IIC

2021-09-27 16:35:58 257

原创 Linux内核——container_of

在驱动过程中,一直有一个做法,就是通过,我知道的一个结构体的一个成员,那么我就可以拿到整个结构体的数据我们也称为以小博大。就比如字符设备驱动过程中的input_dev input_handler 和evdev_handl 这三个结构体就天天在那博来博去的。乍一想:就是通过,我知道的一个结构体的一个成员,那么我就可以拿到整个结构体的数据。这肯定没问题啊,我都知道一个成员了,那拿到整个结构体的数据这不是易如反掌吗?但是真的让你去操作你会怎么操作???内核是定义一个宏去完成以小博大co

2021-09-27 13:55:40 89

原创 ARMA9接口技术之IIC(一)

I2C总线协议:IIC总线协议是一种通信协议,用与芯片之间的收发数据。它本质上就是两根线(数据线和时钟线)串行线代表:一次只能发送一个数据。半双工表示:数据传递方向是双向的,但是一次只能为一个方向。那么IIC是怎么做到仅凭两根线就可以实现数据的接收和发送呢?IIC总线就是俩根线上面挂载了很多个设备,这些设备都可以当作主机或者从机。这就类似于小时候家里的座机可以分一个接听器出来。主机可以打电话(发起通信)可以挂电话(结束通信)可以接听电话(接收数据)和说话(发送数据)而接听器只接电话(响

2021-09-27 09:41:21 836 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 52 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 72

原创 高级驱动———驱动详解

虽然我们知道了当我们写一个设备的模块时候,只要指定是字符输入设备,当你模块装载的时候,内核就会自动匹配input.ko event.ko模块,让这个设备模块完成驱动。内核帮我们完成了这些事情2,申请设备号 register_chrdev_region (与内核相关)3,注册字符设备驱动 cdev_alloc cdev_init cdev_add (与内核相关)4,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关)5,构建

2021-09-26 14:37:30 308

原创 c++——运算符重载

重载和多态的关系———有什么区别???运算符重载——的概念就是:在类中,我可以把一个可以重载的运算符做为一个函数名。就是我在类的使用中我可以把运算符写成一个函数,比如运算符‘+’,那我就在类中定义一个叫 void +();的这个函数,这个函数去实现减的功能————(当然,脑子没点坑的不会去这样做啊);总的来说就是在类中我可以赋予运算符一个功能,在类中它就是这个功能。我想它是什么功能就是什么功能。我们先写一个计时器的类:#include <iostream>#include <u

2021-09-25 22:47:55 108 3

原创 c++———类

类是c++面向对像的重要方式。什么是类,什么是对象?类就是用来:描述一个抽象的数据和操控数据的方法。抽象实例化就是对象。一个类可以描述很多一个对象。比如说我要写一个白富美的类class Godgril{public: int 计算五官比例(五官); int 计算她有多少钱(); int 给她的颜值打分(); void 给她整容(); void 给她打钱();private身高;三围;眼镜;鼻子。。。。。}private:表示私有成员,一般是存放属性,对外界

2021-09-24 23:02:24 73 1

原创 c++——名称空间

名称空间:名称空间是用来声明某些函数数变量等是属于我这个名称空间的。这样做的好处就是:这样在同一个工程下,如果有重名的函数或者变量等…只需要申明它属于哪个名称空间就可以正确的使用他们。名称空间是开放的,允许一个名称空间中包含另一个名称空间名称空间的创建:namespace wzf{ char * str; int a; struct class...... void show(); namespace nihao{ int L; .......... } ...

2021-09-24 22:10:16 86

原创 高级驱动——(驱动所有按键)

我们用一种更为高级的方法去驱动所有的按键————理论上按键最多可以驱动768个,但是我的板子只有三个按键所以现在只能驱动三个,但是驱动三个和驱动768个都是一样的。首先我们要利用起设备树文件了,如果不用设备树的话,你就得一个一个的去驱动,虽然你可以在一个模块上完成所有的按键驱动,但是要是真的驱动768个按键,那么你估计能写上万行代码。你要跟以前的方法一样,每一个按键都要去实例化设备,然后获取中断,地址,…这些信息,然后再处理这些信息。但是如果你用了设备树,我直接在设备树上写好这些信息,到时候你拿的去用

2021-09-24 20:40:48 2148 2

原创 输入子系统(二)

我们前面讲的好像有点问题:1)我们编写的设备模块,不是再编译的时候和核心层的input.c、调用层的evdev.c结合然后一起编译。正解是,我设备本来就是一个模块,而核心层也是一个模块,调用层也是一个模块。只不过内核在运行的时候就已经把核心层和调用层的资源加载进去在内核里了。当我们的设备模块装载到内核中之后,内核就会调用核心和调用层的模块,组成一个完整的驱动。2)那个set_bit函数也并不是把那个ev_key写到evdev里面去:这个函数是把ev_dev的里面的ev_key的位置一:3)关于eve

2021-09-24 15:08:43 301

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除