02 应用层控制GPIO
应用层控制GPIO控制GPIO硬件有以下几种方法: 编写驱动程序,在设备的IO操作里完成对GPIO的任意控制 在应用层依靠GPIO子系统在/sys/class/gpio中为GPIO类设备的属性文件来进行简单控制 基于sysfs进入到/sys/class/gpio 目录下可以看到GPIO控制器包含以下属性: export unexport gpiochipX 在使用一个GPIO前,需要将一个GPIO导出到用户空间,这样才能使用它,通过将要导出的GPIO序号写入到export属性文件即可完成导出,取消导出的话将要取消导出的GPIO序号写入到unexport属性文件即可。 在导出一个GPIO后,在/sys/class/gpio 目录下会新多出一个目录,代表此GPIO设备,该目录包含4个属性文件: 1.active_low:配置GPIO的极性,value的0/1到底代表高还是低电平由此属性决定( ==输入输出均是==) 1234567891011121314//active_low 等于 0 时echo...
03 文件IO
文件IO Linux下,一切皆文件。这句话指的是,Linux系统中,将对所有输入/输出资源(文件、管道、Socket、硬件设备)的操作都抽象成了对文件的操作。所以学习文件I/O的相关API很重要 1.文件描述符在Linux系统中,使用open()系统调用打开一个I/O资源后,会返回一个非负整数,这个非负整数就是==文件描述符==fd。后续所有的对于该资源的操作,都需要这个文件描述符。 这里我使用I/O资源而不是文件,因为打开像socket这样的资源时,并不是真的打开了一个文件,但是也会返回一个文件描述符。 Linux内核中,对每一个进程都维护一个打开文件表(struct...
04 网络编程
...
05 FrameBuffer设备
FrameBuffer设备 帧缓冲设备的应用开发通常是对/dev/fbX这个帧缓冲设备文件进行I/O操作,在注册帧缓存设备时,会在内核中开辟一个缓冲区,可以把它看成指向显存的指针,通过修改这个缓冲区的内存,内核会同步更改显存,进而改变帧缓冲设备实际显示的内容 个人感觉这一章介绍的对于Framebuffer设备的应用开发API过于底层,实际开发应该不会用如此底层的API来开发,而是用Qt或者LVGL那样的框架进行开发,所以==这章学习的意义不是很大== 1.基本步骤对帧缓冲设备的应用开发主要包括以下几步: 1.打开/dev/fbX这个设备文件 2.通过ioctl()系统调用获得帧缓冲设备的一些重要信息:如屏幕的分辨率大小、像素格式,根据屏幕参数计算显示缓冲区的大小 3.通过存储映射 I/O 方式将屏幕的显示缓冲区映射到用户空间(mmap),之后就能像操作数组一样操作显存 4.映射成功后就可以直接读写屏幕的显示缓冲区,进行绘图或图片显示等操作了 5.完成显示后,调用 munmap()取消映射、并调用...
06 input子系统
input子系统 在应用层对于input子系统的开发,其实就是:通过读取/dev/input/eventX设备文件,获取某个input设备的输入信息的过程 1.怎么看某个硬件设备对应input子系统下哪个event呢? 1cat /proc/bus/input/devices 看Handlers字段 2.应用层如何获取从input子系统的设备获取数据? 对/dev/input/eventX设备节点进行open()和read()系统调用 12345678910int fd = open("/dev/input/eventX",O_RDONLY);struct input_event ev;while(1){ if(read(fd,&ev,sizeof(struct input_event)) != sizeof(struct input_event)) { perror("error!"); exit(-1); ...
07 V4L2框架
V4L2框架简介V4L2是Linux内核中的一套驱动框架,为视频类设备(USB、CSI摄像头…)的驱动开发和应用层提供了一套统一的接口规范 V4L2将视频设备视为字符设备,例如/dev/videoX,用户可以通过标准的文件系统接口(如ioctl、open、read、write等)与之交互 在音视频开发领域,许多框架比如FFmpeg都是以V4L2作为基础开发的,所以这个框架还是比较重要的 工作流程 从流程图中可以看到,几乎对摄像头的所有操作都是通过 ioctl()来完成,搭配不同的 V4L2 指令请求不同的操作,这些指令定义在头文件 linux/videodev2.h 中 打开设备打开设备其实和别的类型的设备一样,用open()系统调用就行了 1fd = open("/dev/video0", O_RDWR); 查询属性在V4L2中,使用ioctl()封装了一个指令和结构体用于属性的查询 1234567891011ioctl(int fd, VIDIOC_QUERYCAP, struct v4l2_capability *cap);struct...
08 GStreamer
GStreamer基本概念GStreamer是一个跨平台的流媒体框架,采用基于管道的插件化架构,支持音视频采集、编解码、渲染等全流程处理。应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。例如摄像头采集(v4l2src)、视频编码(nvv4l2h264enc)等模块可灵活拼接,组成流水线 ElementSource 元件(数据源)产生媒体流的元素 文件源:filesrc (从文件读取) 设备源:v4l2src (摄像头, Video4Linux2), alsasrc (音频输入), pulsesrc (PulseAudio输入), audiotestsrc, videotestsrc (测试源) 网络源:udpsrc, tcpclientsrc, rtmpsrc, rtspclientsrc 特殊硬件源 (Jetson/NVIDIA):nvarguscamerasrc,...
002 源码编译
...
001 安卓概述
安卓概述系统架构安卓是基于Linux内核的一种在移动设备中非常常用的操作系统,从整体来看它分为以下几层: Linux内核层 提供硬件驱动(显示、摄像头、蓝牙等)和OS的基本功能(进程调度、内存管理、电源管理、安全、网络协议栈…等) 基于开源Linux内核,在此基础上添加了部分安卓专用的驱动 安卓对于Linux内核的改动1.出于效率,安卓没有使用glibc,而是采用了google开发的Bionic Libc 2.没有完全照搬Linux内核,除了修正一些Bug外,还加了不少内容,比如补充了一些文件系统 3.没有本地基于X服务的窗口系统 4.对Linux的驱动框架进行了增强,比如Binder、电源管理、USB… 硬件抽象层(HAL)作用:标准化硬件接口(如相机、传感器),允许厂商定制驱动而不影响上层框架。保护了硬件厂商的知识产权,隐藏特定平台的硬件接口细节 实现形式: 传统 HAL(Android 8 之前):直接通过 动态库(.so) 调用驱动 现代 HAL(Android 8+):通过...
