自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 虚拟机Ubuntu搭建Windows系统Samba服务映射网络驱动器

然后从官网上下载Ubuntu操作系统镜像(https://www.ubuntu.org.cn/global),接着在虚拟机中安装Ubuntu操作系统,具体的操作过程,我不细说,大家都可以在网上找得到,接下来我讲一下主要的内容。然后点击确定-应用,返回Ubuntu桌面,点击FireFox浏览器,输入www.baidu.com看看可以不可以上网,正常来说可以访问网页,如果不能访问试试前面的步骤有没有出错,或者私信我。虚拟机安装好之后,首先进行网络的设置,让虚拟机可以上网。三、安装Samba-开启远程访问。

2023-03-05 21:50:17 747 1

转载 Android Camera(二)Camera Provider的启动-转载

当CameraProvider注册为服务之后,CameraService运行时,将会与之进行通信进而操作camera HAL,这样,HAL与Service进行了一道隔离。下图为在跟踪代码过程中,记录的UML图。参考文章服务启动流程简析Android P之CameraHAL3流程分析Android Camera原理之cameraprovider启动原文链接:https://blog.csdn.net/weixin_41944449/article/details/99453461。

2023-02-12 20:12:55 567

原创 Android Camera(三)Camera Service的初始化代码分析

CameraManager初始化代码较少,放在这里进行讲解,CameraManager是一个用来管理相机的系统服务,可以通过此服务获取到相机设备和相机信息,在frameworks/base/core/java/android/app/SystemServiceRegistry.java 注册应用层可以通过下面方法获取一个CameraManager实例代码实现:/frameworks/base/core/java/android/hardware/camera2/

2023-02-09 23:38:35 1165

原创 Android Camera(一)-框架小结

工作涉及安卓Camera的内容,做一下笔记。

2023-01-14 23:37:28 1297

原创 C++ map用法小结

在c++中map是一种键值对容器,有几个特点map提供一对一的键值对操作,以的形式出现,,其中key是唯一的,key和value可以是任意类型,包括自定义类型map的内部为一棵红黑树,默认会对key从大到小进行排序操作。

2023-01-08 23:32:50 315

原创 QNX命令-持续更新

use [ 指令 ]如i2ctool用法。

2023-01-07 23:31:57 1678 1

原创 V4l2框架-Videobuf2数据结构简单分析

Videobuf2作为V4L2驱动程序和用户空间之间的数据传输桥梁,用于分配和处理视频帧缓冲区,实现许多标准的POSIXI/O系统调用,包括read()、poll()以及mmap()。实现大量与流式I/O相关V4L2ioctl()调用,包括缓冲区分配、缓冲区入队列和缓冲区出队列以及流控制。......

2022-07-16 12:07:04 1614 2

原创 V4L2框架-视频流的停止(VIDIOC_STREAMOFF)

2.驱动层关闭视频流调用平台关闭视频流驱动接口vidioc_streamoff

2022-07-10 22:00:51 1356 1

原创 V4L2框架-缓存出队列(VIDIOC_DQBUF)

2.底层调用调用平台驱动代码vidioc_dqbufvidioc_dqbufvb2_ioctl_dqbufvb2_dqbufvb2_internal_dqbuf__vb2_get_done_vbvidioc_dqbufvb2_ioctl_dqbufvb2_dqbufvb2_internal_dqbuf__vb2_get_done_vb1.__vb2_wait_for_done_vbvidioc_dqbufvb2_ioctl_dqbufvb2_dqbufvb2

2022-07-10 20:41:07 3177 2

原创 v4l2框架-开启视频流(stream on)

应用层开启视频流底层调用为vidioc_streamon->vb2_ioctl_streamon->vidioc_streamon->vb2_ioctl_streamon->vb2_streamon->分析vb2_internal_streamonvidioc_streamon->vb2_ioctl_streamon->vb2_streamon->vb2_internal_streamon->其中call_void_memop(vb, prepare, vb->planes[plane].mem_

2022-07-09 01:42:42 1610 1

原创 v4l2框架-将缓存放入队列(VIDIOC_QBUF)

应用层编程:将缓存放入队列中vidioc_qbuf->vidioc_qbuf->vb2_ioctl_qbuf->vidioc_qbuf->vb2_ioctl_qbuf->vb2_qbuf->__fill_v4l2_buffer接着分析__buffer_in_usecall_memop(vb, num_users, mem_priv)会调用vb2_dma_contig_memops->大概就是将buffer放入vb2_queue队列中,并填充v4l2_buffer的信息返回给应用层...

2022-07-09 00:09:12 2313

原创 v4l2框架-内存映射(mmap)

mmap一般搭配VIDIOC_QUERYBUF使用2.驱动层mmap函数mmap对应驱动中v4l2_file_operations即xvip_dma_fops->mmap(vb2_fop_mmap)vb_mmap__find_plane_by_offset通过offset的值找到对应的buffer以及plane的值,这里只用到一个planecall_memop(vb, mmap, vb->planes[plane].mem_priv, vma)调用的是vb2_dma_contig_memops->

2022-07-08 21:21:42 1389 1

原创 v4l2框架-查询缓存信息(VIDIOC_QUERYBUF)

应用层查询缓存信息调用vb2_ioctl_querybuf,平台是xilinx重点分析__fill_v4l2_buffer__buffer_in_usecall_memop(vb, num_users, mem_priv)会调用vb2_dma_contig_memops->.num_users->vb2_dc_num_users

2022-07-06 00:17:21 1488 1

原创 v4l2框架—申请缓存(VIDIOC_REQBUFS)

在v4l2框架中,有三种获取底层摄像头数据的方式:可以参考这篇文章# v4l2应用框架-摄像头v4l2编程,本文就学习V4L2框架缓存管理做一个笔记。在v4l2中,使用vb2_queue结构体作为缓存管理的结构体这个结构体中重要的成员为vb2_ops,vb2_mem_ops,在xilinx平台中video_device时初始化这两个参数vb2_ops用来对buffer的入队出队进行管理,等后续分析2.2 vb2_mem_opsvb2_mem_ops用来申请,获取,释放缓存等函数在v4l2中实现了三

2022-07-03 21:06:03 2856 1

转载 QNX-IPC通信

在QNX中,消息可以分为同步消息和异步消息,同步消息需要消息接收者和发送者,异步消息类似于一种通知机制,QNX主要使用的是IPC进行通信,下面是QNX中支持的IPC通信:QNX内核特有的有IPC通信有:在QNX中的Message-passing通信是主从式,双向通信的,在每一个进程中都有一个线程来负责通信,当为收到回信时,线程会block住,直到收到回复信息简单来说如果一个线程(客户端线程)执行了MsgSend()向另一个线程(服务器线程)发送消息,发送消息的线程就会阻塞,直到另一个线程执行了MsgRec

2022-06-19 01:02:50 1367 2

原创 QNX-定时器编程

在QNX中使用定时器编程,步骤大致如下:1.1 创建定时器对象在QNX中,使用timer_create()来创建定时器对象clock_id表示使用的定时器时钟源,共有三种CLOCK_REALTIM:标准POSIX定义的时钟,如果它处于省电模式,基于这个时钟的定时器可以唤醒处理器。CLOCK_SOFTTIMECLOCK_MONOTONIC:这个时钟总是固定定时增加,无法调整一般使用第一种:这个参数表示定时器触发时使用什么应该传递什么事件,共有三种信号,signal脉冲:plu

2022-06-18 23:54:53 1319

转载 QNX-中断处理

前辈优秀博客:QNX中以pulse方式处理中断首先,在中断处理线程中,先要获取io权限:其次,创建私有channel,并得到一个connection id:然后,初始化sigevent,将coid与sigevent绑定,中断产生执行中断处理函数返回sigevent时内核就会在对应的channel产生一个pulse,通过解析coid执行不同的处理在QNX中提供了三个不同的绑定函数,用来绑定coid与sigeventevent:sigevent结构体变量coid:通过ConnectAttach()

2022-06-11 21:24:36 1148

原创 v4l2设备buffer分析

添Linux V4L2驱动框架分析之(三):v4l2设备的缓存管理

2022-06-07 00:10:47 563

原创 安卓轻量级智能指针

在c++智能指针的简单实现与改进中实现了简单的智能指针,但是还是存在缺陷,当多线程操作RefBase中引用的值时得到的可能不是我们想要的,这是由于对RefBase中的引用计数非原子性导致,在Android中实现了轻量级智能指针保证了对引用计数的原子性安卓源码路径:实现:注意点:__sync_fetch_and_add(&mCount, 1):对引用计数加1先用进行减1操作,使用该函数返回的是mCount被减去1之前的值,即此时mCount为0,返回值为1,会将目标对象进行删除操作,实际上还存在着问题,

2022-06-05 22:05:48 296

原创 msm gpio tool

system:qnx2. read gpio interruptetc: read gpio number 110 interrupt

2022-06-04 22:36:56 946 1

原创 QNX下i2c工具使用

系统:qnx注意:1.slave address为7bit值,如果需要读取的寄存器位16位,则reg_len为2 byte,2.cci总线和i2c总线使用的方式方式在代码中也可以直接使用如

2022-06-04 22:30:22 1060 2

原创 c++智能指针的简单实现与改进

在c++开发中,会存在一个问题,在申请内存之后可能会忘记释放,导致内存泄漏,下面文章会从实现简单智能指针到安卓智能指针进行分析1.内存泄漏举例实例化对象指针忘记使用delete从而导致内存泄漏#include <iostream>#include <string.h>using namespace std;class Student{public: Student() { cout << "Student()" << endl;

2022-05-20 23:06:00 216

原创 用户态open函数如何调用内核态open函数

1.图示首先使用华清远见的一张图式,比较清晰,本文会从用户态到内核态进行大致的分析2.虚拟文件系统简介在Linux系统中,对文件的操作抽象为对虚拟文件系统的操作,虚拟文件系统屏蔽了底层逻辑,使用多态的方式将不同的文件系统的操作接口赋值给虚拟文件系统,从而使得对文件的操作变为对虚拟文件系统的操作.每一个文件都用一个inode结点表示。在Linux系统中一个进程使用一个task_struct结构体表示,其中有一个抽象对象为file_struct指针,对于进程中的文件进行管理,在file_struct中有

2022-05-17 00:52:20 1109 1

原创 Linux设备模型-kobject

theme: github每一个kobject对象都会关联一个sysfs文件目录,本节重点关注如何将kobject对象与sysfs文件系统关联起来,关注kobject对象默认的属性文件操作接口1.kobject首先看一下kobject的结构体定义include/linux/kobject.hstruct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *k.

2022-04-05 00:01:54 3700 2

原创 Linux设备模型基础

1.前言字符设备驱动是最简单的驱动,实现对设备文件的打开,读写操作,但对于一些更加复杂的功能使用字符设备驱动框架来写可能完成不了这个功能,比如电源管理,热插拔事件,在Linux内核中I2C驱动,SPI驱动,PCIE驱动都使用设备模型来完成驱动的编写。如果说字符设备驱动编写相当于在大山深处造房子,水电等基础设施要自己建造,那么使用设备模型编写驱动则相当于在城区建新房,水电直接使用就可以。在Linux内核中,设备模型的基本元素由kobject,kset,ktype组成,每一个kobject都对应sysfs文件

2022-04-04 16:57:46 1205

转载 Linux设备驱动模型-基本概念

1. 前言在“Linux内核的整体架构”中,蜗蜗有提到,由于Linux支持世界上几乎所有的、不同功能的硬件设备(这是Linux的优点),导致Linux内核中有一半的代码是设备驱动,而且随着硬件的快速升级换代,设备驱动的代码量也在快速增长。个人意见,这种现象打破了“简洁就是美”的理念,是丑陋的。它导致Linux内核看上去非常臃肿、杂乱、不易维护。但蜗蜗也知道,这不是Linux的错,Linux是一个宏内核,它必须面对设备的多样性,并实现对应的驱动。为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备

2022-03-20 16:58:40 1185

原创 驱动调试-摄像头部分

theme: juejin调试1.硬件部分根据原理图确定camera的接口是MIPI还是DVP,确定在哪路IIC上如果是MIPI,确定MIPI的的data lane数,哪路CSI上用万用表确定Camera的供电是否正常,是否需要软件控制AVDD:camera模拟电压,给芯片的模拟器件供电---->2.8V,主要给摄像头的感光区和ADC部分供电,一般功耗比较高IOVDD:为camera的GPIO口模拟电压,给芯片引脚供电---->1.8V:给I2C或者DVP部分供电,.

2022-02-28 20:43:26 6495 5

原创 硬件通信协议的分类

theme: orange硬件的通信协议主要分为下面三类:同步/异步串行/并行单工,全双工,半双工1.同步/异步同步:发送端和接收端必须使用同一时钟,一方作为从机接受时钟,一方主机控制时钟(控制通信速度)作为是一种连续传送数据的通信方式,一次通讯传送多个字符数据(一帧数据)异步:通信的双方时钟彼此独立,一般需要要求通信双方的通信速度一致2.串行/并行通信串行通信:数据线只有1/2条,每一次只能传输1位数据并行通信:数据线一般位8/16条,每一次可以传.

2022-01-23 09:47:47 1335

原创 SPI简介

1.简介I2C 的速度最高只能到 400KHz,如果对于访问速度要求比较高的话 I2C 就不适合了。本章我们就来学习一下另外一个和 I2C 一样广泛使用的串行通信: SPI, SPI 全称是 SerialPerripheral Interface,也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步串行通信总线, SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。 SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,

2022-01-23 09:47:16 3465

原创 35.数据结构-栈的概念与实现(下)

文章目录一.静态栈的缺陷1.1 测试代码二.链式栈的实现2.1 设计要点2.2 入栈2.3 出栈2.4 获取栈顶元素2.5 清空栈2.6 栈成员个数三.完整代码3.1 LinkList.h3.2 Stack.h3.3 linkStack.h3.4 测试程序3.5 结果四:栈实践-符号检测4.1 实现思路4.2 代码实现五.小结一.静态栈的缺陷当存储的元素为类类型的时候,静态栈会的对象在创建的时候会多次调用元素类型的构造函数,影响效率,当使用原生数组作为存储空间,在创建创建栈的时候会调用泛指类型T的构造函

2021-11-28 22:37:22 292

原创 34.数据结构-栈的概念与实现(上)

文章目录一.栈的定义与特性1.栈的定义2.栈的特性二.栈的实现2.1 栈的继承2.2 顶层父类栈需要实现的函数2.3 顶层抽象父类的实现三.栈的顺序实现3.1 顺序栈的类定义3.2 栈的初始化一.栈的定义与特性1.栈的定义栈是一种特殊的线性表,只可以在线性表是一端进行操作,其中栈顶(Top)是允许操作的一端,栈底(bottom)是不允许操作的一端2.栈的特性后进先出,(Last In First Out),最后放进去的结点先出来二.栈的实现2.1 栈的继承栈分为顺序栈和链式栈,可以将栈作为

2021-11-28 12:54:54 247

原创 33.数据结构-双向循环链表

文章目录一.双向循环链表的结构1.1 双向循环链表的定义1.2 双向循环链表的实现思路1.3 双向循环链表实现要点二.双向循环链表的接口实现2.1 双向循环链表的结构一.双向循环链表的结构1.1 双向循环链表的定义双向循环链表每一个结点有两个指针域,一个指向前驱结点,另一个指向后继结点,并且头结点的前驱指针指向尾结点,尾结点的next指针指向头结点,实际使用时会使用带头双向链表1.2 双向循环链表的实现思路通过模板类定义DualCircleList,并且继承双向链表DualLinkList类在

2021-11-27 20:45:23 762

原创 C++:std::thread

1.std::thread的用法头文件为:#include <thread>2.例子#include <thread>#include <iostream>#include <unistd.h>using namespace std;void thread_fun1(int val){ cout << "Thread::val="<<val<<endl;}class Task{public

2021-11-23 23:01:20 562

原创 32.数据结构-Linux内核链表刨析

文章目录1.目标1.目标移植Linux内核链表到vs2019

2021-11-23 23:00:13 392

原创 30.数据结构-双向链表的实现

单链表的缺陷单链表要想高效的访问链表中的元素,需要从头结点开始,如果需要逆向访问链表中的元素,这时候效率非常低下双向链表在单链表的结点中增加一个指针pre,用于指向当前结点的前驱结点,通过next指针域可以高效访问后继结点,通过pre指针域可以高效访问前驱结点,不管结点处于哪个位置都可以高效的访问前驱和后继结点双向链表的继承层次结构双向链表和单链表在内部实现上完全不同,所以不应该是继承关系,而应该是兄弟关系双向链表的定义在单链表的基础上新增加一个前驱指针域,双向链表的插入操作新结点

2021-11-21 19:50:59 419

原创 18.Linux驱动基础-mode_t内核文件权限定义

S_IWUSR:用户可写权限S_IRUSR:用户可读权限S_IRGRP:用户组可读权限S_IWGRP:用户组可写权限S_IROTH:其他组读权限S_IWOTH:其他组写权限

2021-11-21 11:06:55 908

原创 17.Linux驱动基础-devmem2工具调试工具使用

在驱动调试中有时候需要看SOC寄存器的值,可以使用devmem2工具来查看,下载和编译cd mydroid/external/git clone https://github.com/giraffesnn/devmem2.gitcd mydroidsource build/envsetup.shlunch xxxxcd mydroid/external/devmem2/mmadb rootadb remount adb push out/target/product/xxx/sy

2021-11-21 11:05:28 3157

原创 数据结构笔记23-循环链表

概念循环链表是一种头尾相连的链表,最后一个结点的指针域指向头结点,从而使整个链表形成环从表中的任一个结点出发均可以找到表中其他结点,最后一个链表结点的指针域不为空,指向头结点注意点循环链表中没有NULL指针,所以在遍历的时候,其终止条件不再像非循环链表那样子去判断p或者p->next是否为空,而是判断其是否等于头指针使用尾指针表示单循环链表当使用头指针表示单循环链表时,找到第一个结点的时间复杂度为O(1),找到最后一个结点的时间复杂度为O(n),如果表的操作经常在首尾进行,那么这种方法

2021-11-18 22:46:57 813

原创 shell脚本判断字符串相等

https://www.jb51.net/article/56559.htm

2021-11-14 18:48:53 1037

原创 24.数据结构-单链表的遍历与优化

文章目录1.当前单链表的遍历方法1.当前单链表的遍历方法LinkList<int> l;for(int i = 0;i < 5;i++){ l.insert(0,i);}for(int i = 0;i < l.length();i++){ l.get(i);}在头部插入元素时,时间复杂度是O(n)。 获取元素时,时间复杂度是O(n*n),内层定位位置时有一个O(n)复杂度,那么该怎么优化单链表,使得其在线性的时间内进行遍历操作...

2021-11-09 23:07:19 890

空空如也

空空如也

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

TA关注的人

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